二分搜尋法(Binary search)
又稱對數搜尋,如果搜尋的資料已經排好即可用二分搜尋法來進行搜尋。它是將資料分割成兩等份,再比較鍵值中間值大小,如果鍵值小於中間值,則可確定要找的資料是在前半段的元素,直到找到或確定不存在為止。
以此排序為例:
要搜尋11,先找到8/2=4,第四個元素為9。
第四個元素9比11小,所以捨棄第四個元素以前的元素。
對剩下的元素搜尋,4/2=2,4+2=6,取得第六個元素為12,比11還大,捨棄11以後的元素。
最後11=11,搜尋完成,如果不相等則表示找不到。
範例:
用二元搜尋法找出11:
[2, 3, 5, 8, 9, 11, 12, 16, 18]
內差搜尋法(Interpolation Search)
內差搜尋又叫做差捕搜尋法,是二分法的改良版。是依照資料位置的分佈,利用公式來計算猜測搜尋鍵值的所在位置。
差值搜尋法和二元搜尋類似,不一樣在差值是每次從自訂的mid處開始搜尋。
他的公式是
mid = l + (h-l) * (key - data(h)) / data(h) - data(l))
key是要尋找的鍵,data(l)、data(h)是剩餘待尋找紀錄中最大與最小值,對資料筆數為n。
差補搜尋法步驟:
1.將紀錄由小到大順序給予1,2,3…n
2.另l=1,h=n
3.l < h時,重複執行步驟1和4
4.若key < key_mid且high != mid-1 則令h = mid-1
5.若key = key_mid表示成功搜尋到鍵值的位置
6.若key > key_mid且l != mid+1則令l = mid+1
範例:
用內差搜尋法找出11:
[2, 3, 5, 8, 9, 11, 12, 16, 18]