斐波那契查找
来源:互联网 发布:淘宝店铺被恶意举报 编辑:程序博客网 时间:2024/05/17 06:22
这是一种基于有序的查找方法,所用到的是斐波那契数列,它是利用黄金分割原理,从而提高查找的效率,下面主要介绍这个算法的过程以及算法的核心思想。
首先什么是斐波那契数组:
0 1 2 3 4 5 6 7 8 9
0112358132134为了便于理解我们首先看看这一方法的算法实现:
int Fibonacci——search(int *a,int n,int key){ int low,high,mid,i,k; low=1; high=n; k=0;while(n>F[k])-1) k++; for(i=n;i<F[k]-1,i++) a[i]=a[n]; while(low<=high) { mid=low+F[k-1]-1; if(key<a[mid]) { high=mid-1; k=k-1; } else if (key>a[mid]) { low=mid+1; k=k-2; } else { if(mid<=n) return mid; else return n; } } return 0;}其中a是要查找的对象,key是要查找的关键字,我们假a={0,1,16,24,35,47,59,62,73,88,99},可以n=10。
下面介绍上面的代码的原理:
1).
k=0;while(n>F[k])-1) k++; 计算出n位于斐波那契数列中的位置,可以得到k=7。
2).
<pre name="code" class="cpp"> for(i=n;i<F[k]-1,i++) a[i]=a[n] 这两句话是说明对于斐波那契数列来说F[7]=13,所以需要a中有13个数,而原来的只有10个数需要加上两个,并且赋值为最大值即a【10】。
3).
<pre name="code" class="cpp"> mid=low+F[k-1]-1; 说明我们首先从8开始。a【8】=73,而key是59。
4).
<pre name="code" class="cpp"> if(key<a[mid]) { high=mid-1; k=k-1;} 由于key小于a【mid】,所以执行这几行语句, 得到k=6,high=7.
5).
再次循环,mid=5,a【mid】=47<key,执行以下程序:
<pre name="code" class="cpp">else if (key>a[mid]) { low=mid+1; k=k-2; } low=6,k=4.注意k下调两个位置。
6).
再次循环mid=7,a【mid】>key,执行
<pre name="code" class="cpp"><pre name="code" class="cpp">f(key<a[mid]) { high=mid-1; k=k-1;} high=6,k=3.得到相等输出6.
从以上的代码分析来看,斐波那契的核心思想就是:1) 当key=a【mid】时,查找成功。
2) 当key《a【mid】时,新范围是第low个到第low-1个,此时范围个数为F【k-1】-1个
3) 当key》a【mid】时,新范围是第m+1个到第high个,此时范围个数是F【k-2】-1个。
0 0
- 查找-斐波那契查找
- 算法--查找--斐波那契查找
- 斐波那契查找
- 斐波那契查找
- 斐波那契查找
- 斐波那契查找
- 斐波那契查找
- 斐波那契查找
- 斐波那契查找
- 斐波那契查找
- 斐波那契查找
- 斐波那契查找
- 斐波那契查找
- 斐波那契查找
- 斐波那契查找
- 斐波那契查找
- 二分查找,插值查找,斐波那契查找
- 查找--顺序查找,二分法,斐波那契查找
- require(),include(),require_once()和include_once()区别
- DSPack for Xe6
- linux\uinux
- ccsprite使用setTexure,解决动作中同精灵换图变形问题
- java socket多线程使用-整理篇
- 斐波那契查找
- 简介(二)
- Codeforces Round #263 (Div. 2)
- JAVA编程思想-第一章 对象导论
- linux ps top 命令 VSZ,RSS,TTY,STAT, VIRT,RES,SHR,DATA的含义
- Java方法的可变参数个数
- 浅析Java web程序之客户端和服务器端交互原理
- Logback和Logstash的集成
- 虚继承和虚函数继承