資料結構和演算法學習日記 二分法查詢

2021-09-27 12:42:50 字數 2102 閱讀 8425

在這裡,順序查詢和普通的二分發查詢不做概述。

插值查詢類似於二分法,不同的是插值查詢就是每次自適應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 是無理數,因此只能獲得它的近似值,這裡不妨以精度到...