在這裡,順序查詢和普通的二分發查詢不做概述。
插值查詢類似於二分法,不同的是插值查詢就是每次自適應mid處查詢。
理解關鍵程式
int mid = left + (right - left) * (val - arr[left]) / (arr[right] - arr[left]);
如上述一行程式:
left
:陣列查詢時最左邊的索引
right - left
:陣列查詢時要查詢的全部數字個數
(val - arr[left]) / (arr[right] - arr[left])
:其中val是要查詢的值,因為插值查詢類似二分法查詢,因此查詢的陣列皆是按順序排列的。(此處預設陣列是按從小到大排序)。如果將(arr[right] - arr[left])
看成要查詢部分的總長度,而``(val - arr[left])`可以看作查詢的值距離左邊的長度,將兩者相除,估算出要查詢值位於總數組的那一部分,進而估算mid。
可以如下圖進行理解:
}斐波那契數列有乙個特性:在斐波那契數列中,隨這索引不斷向後,數列中前乙個值與後乙個值的比會無限接近於**分割,即0.618
原理根據查詢陣列的長度匹配已經生成的斐波那契數列,早到查詢陣列的**分割線,該線所在的位置是mid。其餘與二分法類似(預設陣列按從小到大排序)
mid的計算方法
斐波那契數列:fib[k] = fib[k - 1] + fib[k - 2]
假設fib[k]
是查詢陣列的長度,因為fib[k - 1] / fib[k]
隨著k的無限增大,該公式無限接近於**分割,因此mid出現在fib[k - 1]
處。
fib[k] = fib[k - 1] + fib[k - 2]
轉換為:fib[k] - 1 = (fib[k - 1] - 1) + (fib[k - 2] - 1) + 1
, 如果將fib[k] - 1
看作查詢陣列的長度,那麼mid = low + fib[k - 1] - 1
演算法圖示
public
static
intsearch2
(int
arr,
int val)
// 利用斐波那契數列,選取中值
int k =0;
while
(high > fib[k]-1
)// 填充0的部分
int[
] temp = arrays.
copyof
(arr, fib[k]);
for(
int i = high +
1; i < temp.length; i++
)// 實現二分法
while
(low <= high)
else
if(val > arr[mid]
)else
else}}
return-1
;}
演算法學習 二分法
二分查詢也稱折半查詢 binary search 它是一種效率較高的查詢方法,前提是資料結構必須先排好序,可以在資料規模的對數時間複雜度內完成查詢。但是,二分查詢要求線性表具有有隨機訪問的特點 例如陣列 也要求線性表能夠根據中間元素的特點推測它兩側元素的性質,以達到縮減問題規模的效果。舉個簡單的例子...
演算法學習 二分法查詢
二分法查詢是常用的查詢方法。二分法的演算法複雜度為 二分法查詢的思路是 1 輸入乙個排序好的序列 2 輸入乙個需要查詢的元素 3 求出序列的中間位置數 4 判斷查詢元素的與中間數的大小 5 縮小查詢範圍,可進行迭代或者迴圈。c語言 include 遞迴演算法 int recurbinary int ...
演算法學習 二分法拓展
例1 如何計算2 sqrt 2 的近似值?對 f x x2 f x x f x x 2來說,在x 1,2 x in 1,2 x 1,2 的範圍內,f x f x f x 是隨著x xx 的增大而增大的,這就給二分法創造了條件,由於 2 sqrt 2 是無理數,因此只能獲得它的近似值,這裡不妨以精度到...