斐波那契查詢
與二分查詢相比,斐波那契查詢演算法的明顯優點在於它只涉及加法和減法運算,而不用除法。因為除法比加減法要佔去更多的機時,因此,斐波那契查詢的平均效能要比折半查詢好。
參考文章:
http://blog.csdn.net/zpluw/article/details/7757331
下面給出原始碼實現:
/*斐波那契查詢法,前提是線性表必須有序,時間複雜度是O(logn)*/
#include<stdio.h>
#define MAXSIZE 20
/*用非遞迴法構造一個斐波那契陣列*/
void Fibonacci(int *f)
{
int i;
f[0] = 0;
f[1] = 1;
for(i=2; i<MAXSIZE; i++)
{
f[i] = f[i-1] + f[i-2];
}
}
/*定義斐波那契查詢法*/
int Fibonacci_Search(int *a, int n, int key)
{
int low, high, mid, i, k;
int F[MAXSIZE];
Fibonacci(F); //構造一個斐波那契陣列F
low = 1; //最低下標記錄為首位
high = n; //最高下標記錄為末位
k = 0;
while(n > F[k]-1) //計算n位於斐波那契數列的位置
{
k++;
}
for(i=n; i<F[k]-1; i++) //將a的元素擴充套件到(某斐波那契數 - 1),即F[k]-1
{
a[i] = a[n];
}
while(low <= high)
{
mid = low + F[k-1] - 1; //計算當前分割的下標
if(key < a[mid])
{
high = mid - 1;
k -= 1;
}
else if(key > a[mid])
{
low = mid + 1;
k -= 2;
}
else
{
if(mid <= n)
return mid; //若相等則說明mid即為查詢到的位置
else
return n; //若mid>n則說明是擴充套件的數值,返回n
}
}
return -1;
}
int main()
{
int array[20] = {0,16,24,35,47,59,62,73,88,99};//注意陣列的第一個元素0,能作為查詢物件
int number = Fibonacci_Search(array, 9, 99);
printf("位置是:array[%d]\n",number);
return 0;
}
相關文章
- 斐波那契查詢不再迷惑
- 斐波那契數
- 斐波那契數列
- 斐波那契數列(Java)Java
- 演算法-查詢(線性、二分、插值、斐波那契)演算法
- 斐波那契數列 (C#)C#
- PHP 與斐波那契數列PHP
- 斐波那契數列詳解
- Leedcode-斐波那契數
- js實現斐波那契數列JS
- 斐波那契數列js 實現JS
- 斐波那契數列演算法演算法
- 斐波那契數列Ⅳ【矩陣乘法】矩陣
- 演算法 - 斐波那契 - javascript 版演算法JavaScript
- python for迴圈和斐波那契Python
- 博弈學習 (二) 斐波那契博弈
- 演算法(1)斐波那契數列演算法
- 斐波那契問題和擴充套件套件
- 從斐波那契到矩陣快速冪矩陣
- 博弈論入門之斐波那契博弈
- 高效率JAVA實現斐波那契Java
- 面試題9-斐波那契數列面試題
- 斐波那契數(C/C++,Scheme)C++Scheme
- [C103] 斐波那契數列
- 資料結構與演算法——查詢演算法-斐波那契(黃金分割法)查詢資料結構演算法
- 使用Python實現斐波那契數列Python
- JavaScript 實現:輸出斐波那契數列JavaScript
- js迭代器實現斐波那契數列JS
- LeetCode-509-斐波那契數LeetCode
- 演算法一:斐波那契阿數列演算法
- 斐波那契數列的分治法計算
- 斐波那契數列的python實現Python
- 斐波那契數列三種實現函式函式
- 計算斐波那契數列的演算法演算法
- 劍指offer-9-斐波那契數列-javaJava
- 大數斐波那契數列的演算法演算法
- 斐波那契數列演算法 JS 實現演算法JS
- hdu 3117矩陣+斐波那契數列矩陣