演算法 查詢 斐波那契查詢

2021-07-13 08:12:17 字數 2417 閱讀 3404

相對於二分查詢和差值查詢,斐波那契查詢的實現略顯複雜。但是在明白它的主體思想之後,掌握起來也並不太難。

既然叫斐波那契查詢,首先得弄明白什麼是斐波那契數列。相信大家對這個著名的數列也並不陌生,無論是c語言的迴圈、遞迴,還是高數的數列,斐波那契數列都是乙個重要的存在。而此處主要是用到了它的一條性質:前乙個數除以相鄰的後乙個數,比值無限接近**分割。

就筆者而言,這種查詢的精髓在於採用最接近查詢長度的斐波那契數值來確定拆分點,初次接觸的童鞋,請在讀完下文後,自覺回過頭來仔細體會這句話。舉個例子來講,現有長度為9的陣列,要對它進行拆分,對應的斐波那契數列(長度先隨便取,只要最大數大於9即可),不難發現,大於9且最接近9的斐波那契數值是f[6]=13,為了滿足所謂的**分割,所以它的第乙個拆分點應該就是f[6]的前乙個值f[5]=8,即待查詢陣列array的第8個數,對應到下標就是array[7],依次類推。

推演到一般情況,假設有待查詢陣列array[n]和斐波那契陣列f[k],並且n滿足n>=f[k]-1&&n < f[k+1]-1,則它的第乙個拆分點middle=f[k]-1。

這裡得注意,如果n剛好等於f[k]-1,待查詢陣列剛好拆成f[k-1]和f[k-2]兩部分,那萬事大吉你好我好;然而大多數情況並不能盡人意,n會小於f[k]-1,這時候可以拆成完整f[k-1]和殘疾的f[k-2]兩部分,那怎麼辦呢?

聰明的前輩們早已想好了解決辦法,對了,就是補齊,用最大的數來填充f[k-2]的殘缺部分,如果查詢的位置落到補齊的部分,那就可以確定要找的那個數就是最後乙個最大的了。

不妨來看張圖,更清楚一點。

(1)資料必須採用順序儲存結構;(2)資料必須有序。
(1)最接近查詢長度的斐波那契值來確定拆分點;(2)**分割。
與拆半查詢一樣,也是logn。不少部落格說,在處理海量資料時,拆分查詢的middle = (low + hight)/2,除法可能會影響效率,而斐波那契的middle = low + f[k-1] -1,純加減計算,速度要快一些。我覺得是扯淡,因為完全可以用middle = (loe+hight)>>2來代替,要知道相比於加減乘除而言,位運算的效率可是最高的喲。

還是慣例,能上**就不說話環節。
public

class

fbonaccisearch ;

system.out.println("result: " + fbsearch(array, 31));

}/**

* * name: fbsearch

* * * description: 斐波那契查詢實現

* * * return: int

* */

public

static

intfbsearch(int array, int a) else

int temp = arrays.copyof(array, fb[k] - 1);// 構造乙個長度為fb[k] - 1的新數列

for (int i = length; i < temp.length; i++)

}int low = 0;

int hight = array.length - 1;

while (low <= hight) else

if (temp[middle] < a) else else }}

return -1;

// return recurse(array, fb, a, low, hight, k);}}

/*** * name: makefbarray

* * * description: 生成指定長度的斐波數列

* * * return: int

* */

public

static

int makefbarray(int length)

}return array;

}/**

* * name: recurse

* * * description: 遞迴實現,可以來代替while (low <= hight)遍歷

* * * return: int

* */

public

static

intrecurse(int array, int fb, int a, int low, int hight,

int k)

int middle = low + fb[k - 1] - 1;

if (a < array[middle]) else

if (a > array[middle]) else else }}

}

斐波那契查詢演算法

與二分查詢相比,斐波那契查詢演算法的明顯優點在於它只涉及加法和減法運算,而不用除法。因為除法比加減法要占去更多的機時,因此,斐波那契查詢的平均效能要比折半查詢好。include void fibonacci int f int fibonacci search int a,int key,int n...

斐波那契查詢演算法

斐波那契查詢的核心是 1 當key a mid 時,查詢成功 2 當keya mid 時,新的查詢範圍是第mid 1個到第high個,此時範圍個數為f k 2 1個,即陣列右邊的長度,所以要在 f k 2 1 範圍內查詢。如下 1 include2 include 3 include4 includ...

斐波那契查詢演算法

斐波那契查詢原理與二分查詢或者插值查詢演算法類似,僅僅改變了中間結點 mid 的位置,mid 不再是中間或插值得到,而是位於 分割點附近,即 mid low f k 1 1 f 代表斐波那契數列 如下圖所示 由斐波那契數列 f k f k 1 f k 2 的性質,可以得到 f k 1 f k 1 1...