费氏查找算法

来源:互联网 发布:即时消息软件 编辑:程序博客网 时间:2024/05/02 05:00

费氏查找算法,利用斐波那契数列的思想,逐步修改要查找的区间,

根据数据的范围依据费氏树的结构往下查找数据,直到找到数据或达到费氏树的底端位置。

相对于折半查找算法来说,建立斐波那契数列不需要用除法。效率要高。

在初始阶段搜索相对较快,但是在后半程收敛比较慢。


在考虑是否可以将该方法和其他搜索算法融合一下,得到更快的搜索算法。


#include <stdio.h>#include <stdlib.h>int Fib(int n){if (n <= 1)return 1;elsereturn Fib(n-2) + Fib(n-1);}/*费氏查找法*/int fib_search(int *list, int n, int key){int root; /*左边界*/int dist1;int dist2;int temp;root = Fib(n-1);dist1 = Fib(n-2);dist2 = Fib(n-3);do {if (key < list[root-1]){root = root - dist2;temp = dist1;dist1 = dist2;dist2 = temp - dist2;}else if (key > list[root-1]){root = root + dist2;dist1 = dist1 - dist2;dist2 = dist2 - dist1;}else if (key == list[root-1]){printf("list[%d] = %d\n", root-1, list[root-1]);return 1;}} while(dist2 >= 0);return 0;}int main(int argc, char **argv){int key = 12;int list[] = {12, 16, 19, 22, 25,32, 39, 48, 55, 57,58, 63, 68, 69, 70,78, 84, 88, 90, 97};int len = sizeof(list)/sizeof(list[0]);int fib_index = 1;while(Fib(fib_index) <= len)fib_index++;if (fib_search(list, fib_index, key))printf("Found\n");elseprintf("Donot found\n");return 0;}


0 0
原创粉丝点击