// 斐波那契查詢.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 範圍內查詢。與二分查詢相比,斐波那契查詢演算法 的明顯優點在...