其思想與折半查詢、插值查詢沒有多大區別,本質上只是分割點的選擇不同。斐波那契查詢需要構造斐波那契數列,該數列的作用就是提供分割點(好多演算法書都沒有介紹清楚啊!!!)參閱折半查詢、插值查詢以及斐波那契查詢
(1) 演算法首先找到構造乙個查詢表,即在原來的陣列上新增元素,使得該查詢表(陣列)的長度為某個斐波那契值減1,即f(k)-1;
(2) 設定當前的分隔為mid = low + f[k-1] -1. 至於為什麼這麼設定分割點?我認為是斐波那契數列的特點,即後一項是前兩項之和,這前兩項正好對應著查詢表的左右兩部分。可以簡單的理解為一種特殊的分割點設定方法;
(3) 當key = a[mid]時,查詢成功;當keya[mid]時,新範圍是第m+1個到第high個,此時範圍個數為f[k-2]-1個。
(4) 最後將mid與查詢表的長度n進行比較,若不大於查詢表的長度,則mid為查詢到的位置;否則,mid為不全補全數值處的位置。
其時間複雜度仍為o(logn)。
//斐波那契函式定義
intfibonaccisearch
(int
* array,
int n,
int key)
else
if(key>array[mid]
)else
}return0;
}//斐波那契數列生成函式定義,非遞迴實現
intfibonacci
(int n)
return m;
}return-1
;}//斐波那契數列生成函式定義,遞迴實現
intfibonacci1
(int n)
斐波那契查詢演算法
與二分查詢相比,斐波那契查詢演算法的明顯優點在於它只涉及加法和減法運算,而不用除法。因為除法比加減法要占去更多的機時,因此,斐波那契查詢的平均效能要比折半查詢好。include void fibonacci int f int fibonacci search int a,int key,int n...
演算法 斐波那契(1)
1.乙隻青蛙一次可以跳上一級台階,也可以跳上二級台階 為了跳上n級台階一共有幾種跳法 解析 1.n 1 1種 2.n 2 2種 3.n級台階可以由n 1或者n 2級台階跳上來f n f n 2 f n 1 include using namespace std int a 100 int jump ...
斐波那契查詢演算法
斐波那契查詢的核心是 1 當key a mid 時,查詢成功 2 當keya mid 時,新的查詢範圍是第mid 1個到第high個,此時範圍個數為f k 2 1個,即陣列右邊的長度,所以要在 f k 2 1 範圍內查詢。如下 1 include2 include 3 include4 includ...