斐波那契查詢(超詳解)

2021-07-03 09:45:56 字數 1952 閱讀 3861

// 斐波那契查詢.cpp    

#include

#include

using

namespace

std;

const

int max_size=20;//斐波那契陣列的長度

/*構造乙個斐波那契陣列*/

void fibonacci(int * f)

/*定義斐波那契查詢法*/

int fibonacci_search(int *a, int n, int key) //a為要查詢的陣列,n為要查詢的陣列長度,key為要查詢的關鍵字

else

if(key>temp[mid])

else

}

/* 斐波那契查詢方法的核心**就是上面一段

原理:1)當key=a[mid]時,查詢成功;

2)當keya[mid]時,新的查詢範圍是第mid+1個到第high個,此時範圍個數為f[k-2] - 1個,即陣列右邊的長度,

所以要在[f[k - 2] - 1]範圍內查詢。

4) 對於二分查詢,分割是從mid= (low+high)/2開始;而對於斐波那契查詢,分割是從mid = low + f[k-1] - 1開始的;

通過上面知道了,陣列a現在的元素個數為f[k]-1個,即陣列長為f[k]-1,mid把陣列分成了左右兩部分,

左邊的長度為:f[k-1] - 1, 那麼右邊的長度就為(陣列長-左邊的長度-1),

即:(f[k]-1) - (f[k-1] - 1) = f[k] - f[k-1] - 1 = f[k-2] - 1。

*/delete temp; //釋放new出來的記憶體,因為是陣列,所以才去delete temp的方式而不是delete temp.

return -1;

} int main()

;int a= ;

int key=21;

int index=fibonacci_search(a,sizeof(a)/sizeof(int),key);

/*這裡插入討論一下陣列的長度問題:

1、char a=""型別的字串,編譯器會在結尾自動新增\0,用sizeof計算會算上'\0'

2、存在的c語言方法,如strlen(s),計算字串的長度,其中s指標。strlen要計算字串長度,

必須知道**是結尾,因此使用\0表示結尾。只有字元陣列才有\0的概念,其它型別(int)的陣列沒有這個概念。

如int a={} 知道陣列長度使用sizeof(a)/sizeof(int);

3、那麼問題來了char a={}這種型別的字串,用用sizeof計算會不會算上'\0'?

答案是不會的。

*/cout

<" is located at:"

<"pause");

return

0;

} /*

1、這裡我首先建立了乙個11個元素的陣列a,n=11,那麼n就位於8和13,即f[6]和f[7]之間,所以 k=7,

此時陣列a的元素個數要被擴充,為:f[7] - 1 = 12個

(這裡如果問我為什麼要擴充為f[k]-1而不是f[k],先留個問號,可以參考

2、然後根據核心**開始找數:我們要找值為13的元素

斐波那契數列前幾位:0、1、1、2、3、5、8、13

1)mid=low+f[k-1]-1 則mid=7;

2)比較得key/*

與二分查詢比較:

①斐波那契查詢的平均效能比折半查詢好,②但最壞情況下效能卻比折半查詢差,③它還有乙個優點就是分割時只需進行加減運算。"

與二分查詢相比,斐波那契查詢演算法的明顯優點在於它只涉及加法和減法運算,而不用除法。

因為除法比加減法要占去更多的機時,因此,斐波那契查詢的平均效能要比折半查詢好。

*/

斐波那契查詢(超詳解)

斐波那契查詢.cpp include include using namespace std const int max size 20 斐波那契陣列的長度 構造乙個斐波那契陣列 void fibonacci int f else 斐波那契查詢方法的核心 就是上面一段 原理 1 當key a mid...

斐波那契查詢詳解

斐波那契查詢的 前提是待查詢的查詢表必須順序儲存並且有序。相對於折半查詢,一般將待比較的key值與第mid low high 2位置的元素比較,比較結果分三種情況 1 相等,mid位置的元素即為所求 2 low mid 1 3 high mid 1 斐波那契查詢與折半查詢很相似,他是根據斐波那契序列...

斐波那契查詢

斐波那契查詢 斐波那契查詢的核心是 1 當key a mid 時,查詢成功 2 當key 3 當key a mid 時,新的查詢範圍是第mid 1個到第high個,此時範圍個數為f k 2 1個,即陣列右邊的長度,所以要在 f k 2 1 範圍內查詢。與二分查詢相比,斐波那契查詢演算法 的明顯優點在...