斐波那契查找算法分析
来源:互联网 发布:4y4淘宝装修助手 编辑:程序博客网 时间:2024/06/10 05:18
原创作品,出自 “晓风残月xj” 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj)。
由于各种原因,可能存在诸多不足,欢迎斧正!
刚接触程序设计的人可能会看的斐波那契数列。其递推通项公式为
fib[i]=1 i=0,1
fib[i]=fib[i-1]+fib[i-2]; i>2
这样一个可以根据数学推到进一步求得与i相关的通项公式
我们知道0.618是个魔力数,即通常所说的黄金分割点。黄金比例又称黄金分割,是指事物各部分间一定的数学比例关系,即将整体一分为二,较大部分与较小部分之比等于整体与较大部分之比,其比值约为1:0.618或1.618:1。
1.设data[i]为有序数列,i=0,1…n-1;计算斐波那契数列前m项,m是保证fib[m]>=n的最小数。
2.low=0,high=n-1;
3.mid=low+fib[m-1]-1
如果data[mid]>key,则说明可能在左半部分,m=m-1;
如果data[mid]<key,则说明可能在右半部分,m=m-2;
则否找到key,正确定位即可。
该算法的时间复杂度为O(n*Log(n)),和二分查找一样,但可以避开除法运算,在计算机中除法运算的占用资源比加减高得多。当然在很多时候可以用位运算避开除2运算。
#include<iostream>using namespace std;const int MAXN=20;int fib[MAXN];//预处理求出Fibonacci数列void GetFibonacci(){fib[0]=1,fib[1]=1;for(int i=2;i<MAXN;i++)fib[i]=fib[i-2]+fib[i-1];}//斐波那契数列查找int FibonacciSearch(int key,int data[],int n,int &count){int m=0;while(n>fib[m]-1)m++;for(int i=n;i<=fib[m]-1;i++)data[i]=data[n-1];int low=0,high=n-1,mid;while(low<=high){count++;mid=low+fib[m-1]-1;if(data[mid]>key){high=mid-1;m=m-1;}else if(data[mid]<key){low=mid+1;m=m-2;}else //找到这样的key{if(mid<n)return mid;return n-1;//原数组组后一个数}}return -1;} //二分查找int BinarySearch(int key,int data[],int n,int &count){int low=0,high=n-1,mid;while(low<=high){count++;mid=(low+high)/2;if(data[mid]>key){high=mid-1;}else if(data[mid]<key){low=mid+1;}else return mid;}return -1;}int main(){int data[100]={1,3,5,7,9,12,23,54,65,78,80,100};GetFibonacci();double Ave=0;int count;printf("以下是斐波那契数列查找的结果:\n");for(int i=0;i<12;i++){count=0;int ans=FibonacciSearch(data[i],data,12,count);Ave+=ans;printf("%d出现在第%d位置,查找了%d次\n",data[i],ans,count);}printf("斐波那契数列平均查找参数为%0.2lf\n",Ave/12);Ave=0;printf("以下是二分查找的结果:\n");for(i=0;i<12;i++){int ans=BinarySearch(data[i],data,12,count);Ave+=ans;printf("%d出现在第%d位置,查找了%d次\n",data[i],ans,count);}printf("二分查找平均查找参数为%0.2lf\n",Ave/12);return 0;}
以下是运行结果截图
以上部分内容取自先取博客,在此表示感谢!
- 斐波那契查找算法分析
- 算法--查找--斐波那契查找
- 查找算法—斐波那契查找算法分析与实现(Python)
- 斐波那契查找算法
- 斐波那契查找算法
- 斐波那契查找算法解析
- 斐波那契查找算法
- 数据结构与算法-查找-斐波那契查找
- 查找算法小结:顺序查找、 二分查找、斐波那契查找 、插值查找
- 简单查找算法之折半查找、插值查找、斐波那契查找
- 有序查找算法(二分查找、差值查找、斐波那契查找)
- 斐波那契数列算法分析
- 斐波那契数列算法分析
- 斐波那契数列算法分析
- 斐波那契数列算法分析
- 斐波那契数列算法分析
- 斐波那契数列算法分析
- 斐波那契数列算法分析
- 这一年以来读过的书(2013)
- Thinkpad T61升级记:64位操作系统win7_x64,8G内存
- 基于感知哈希算法的视觉目标跟踪
- Oracle数据库的用户管理
- ASE15.7 ESD#2不再支持WinXP专业版了
- 斐波那契查找算法分析
- 总结Linux压缩解压的所有命令
- Longest Consecutive Sequence
- 使用 JavaScript 拦截和跟踪浏览器中的 HTTP 请求
- 视频播放的基本原理(转)
- windows版 Sublime Text 2 快捷键
- ic_launcher.png,eclipse自动给小米手机重新安装运行,显示的还是旧图标
- JDBC note
- oracle exp、imp实现导出导入