一、基本介绍

1.黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。取其前三位 数字的近似值是 0.618。由于按此比例设计的造型十分美丽,因此称为黄金分割,也称为中外比。这是一个神 奇的数字,会带来意向不大的效果。

2.斐波那契数列 {1, 1, 2, 3, 5, 8, 13, 21, 34, 55 } 发现斐波那契数列的两个相邻数 的比例,无限接近 黄金分割值 0.618

二、斐波那契(黄金分割法)原理

斐波那契查找原理与前两种相似,仅仅改变了中间结点(mid)的位置,mid 不再是中间或插值得到,而是位 于黄金分割点附近,即 mid=low+F(k-1)-1(F 代表斐波那契数列),如下图所示

对 F(k-1)-1 的理解:

  1. 由斐波那契数列 F[k]=F[k-1]+F[k-2] 的性质,可以得到 (F[k]-1)=(F[k-1]-1)+(F[k-2]-1)+1 。该式说明: 只要顺序表的长度为 F[k]-1,则可以将该表分成长度为 F[k-1]-1 和 F[k-2]-1 的两段,即如上图所示。从而中间位置为 mid=low+F(k-1)-1

  2. 类似的,每一子段也可以用相同的方式分割

3)但顺序表长度 n 不一定刚好等于 F[k]-1,所以需要将原来的顺序表长度 n 增加至 F[k]-1。这里的 k 值只要能使 得 F[k]-1 恰好大于或等于 n 即可,由以下代码得到,顺序表长度增加后,新增的位置(从 n+1 到 F[k]-1 位置), 都赋为 n 位置的值即可。

while(n>fib(k)-1) k++;

三、代码实现

package cn.zzw.algorithm.search;import java.util.Arrays;public class FibonacciSearch {public static int maxSize=20;public static void main(String[] args) {int[] arr={1,7,66,89,25,63,98};System.out.println("index="+fibSearch(arr,7));}//由于后面mid=low + F(k-1)-1,需要使用到斐波那契数列,因此需要先//获取一个斐波那契数列,此处非递归得到一个斐波那契数列public static int[] fib(){int[] f=new int[maxSize];f[0]=1;f[1]=1;for(int i=2;i<maxSize;i++){f[i]=f[i-1]+f[i-2];}return f;}public static int fibSearch(int[] a,int key){int low=0;int high=a.length-1;//表示斐波那契数列分割数值的下标int k=0;int mid=0;//存放mid的值int f[]=fib();//获取到斐波那契数列//获取到斐波那契数列分割数值的下标while (high>f[k]-1){k++;}//由于f[k]值可能大于a的长度,因此,我们需要使用Arrays类,构造一个新的数组//并指向temp[],不足的部分用0填充int[] temp= Arrays.copyOf(a,f[k]);//实际上需要使用a数组最后的数填充tempfor(int i=high+1;i<temp.length;i++){temp[i]=a[high];}//使用while循环来处理,找到想要找到的数值keywhile (low<=high){mid=low+f[k-1]-1;if(key<temp[mid]){//继续向数组的左边查找high=mid-1;//说明为什么是k--,因为前面有f[k-1]个元素,所以可以//继续拆分f[k-1]=f[k-2]+f[k-3]//即在f[k-1]前面继续查找k--,即下次循环是mid=f[k-1-1]-1k--;}else if(key>temp[mid]){low=mid+1;//因为后面有f[k-2]=f[k-3]+f[k-4]//即在f[k-2]前面进行查找k-=2,即下次循环mid=f[k-1-2]-1;k-=2;}else{if(mid<=high){return mid;}else{return high;}}}return -1;}}
"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" "-javaagent:D:\IntelliJ IDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=39110:D:\IntelliJ IDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;C:\Users\1\IdeaProjects\algorithm\out\production\algorithm" cn.zzw.algorithm.search.FibonacciSearch
index=1Process finished with exit code 0

二十三、斐波那契查找算法相关推荐

  1. 斐波那契查找算法解析

    文章目录 前言 一.斐波那契数列 二.斐波那契查找算法 前言 学数据结构的时候被斐波那契查找算法困扰,刚开始难以理解,脑袋有点懵,翻看了许多大佬的博文,加上自己的理解发了出来 一.斐波那契数列 我们先 ...

  2. 查找算法之斐波那契查找算法

    斐波那契(黄金分割法)查找算法 (一)算法简介 (1)斐波那契数列 在讲算法之前,我们先介绍一下斐波那契数列,该数列公式为F(K) = F(k-1) + F(k-2),即 1.1.2.3.5.8.13 ...

  3. 查找算法:斐波那契查找算法实现及分析

    斐波那契查找算法介绍 斐波那契查找法肯定与斐波那契相关嘛,斐波那契数列 又称黄金分割数列.所以我们先把黄金分割弄懂,后面代码才能看得懂!黄金分割点大家都知道吧.1:0.618或者1.618:1,我们的 ...

  4. 007.斐波拉契查找算法

    1. 斐波拉契查找算法 斐波拉契查找算法也称为黄金分割查找算法,它是在折半查找算法的基础上根据斐波拉契数列进行分割.折半法是取排序好的中间值进行分割,而斐波拉契查找算法是根据黄金分割点进行分割. 黄金 ...

  5. 【数据结构与算法】插值查找算法、斐波那契查找算法(黄金分割法)的介绍和程序实现

    目录 1. 插值查找算法 1.1 插值查找算法的介绍 1.2 插值查找算法的程序实现 2. 斐波那契查找算法 2.1 斐波那契查找算法的介绍 2.2 斐波那契查找算法的程序实现 1. 插值查找算法 1 ...

  6. 顺序,二分,插值,斐波那契 查找算法

    总结: 博客详细描述:(http://www.cnblogs.com/maybe2030/p/4715035.html#_label4) 关注: 二分查找.插值查找以及斐波那契查找都可以归为一类插值查 ...

  7. 【Java数据结构与算法】第九章 顺序查找、二分查找、插值查找和斐波那契查找

    第九章 顺序查找.二分查找.插值查找和斐波那契查找 文章目录 第九章 顺序查找.二分查找.插值查找和斐波那契查找 一.顺序查找 1.基本介绍 2.代码实现 二.二分查找 1.基本介绍 2.代码实现 三 ...

  8. 查找算法-(顺序查找、二分查找、插值查找、斐波那契查找)

    1)顺序查找或叫线性查找 就是顺序遍历匹配 2)二分查找 package search;public class BinarySearch {/*** 二分查找数组必须有序*//**** @param ...

  9. JAVA数据结构与算法之斐波那契查找(黄金分割点)

    前言 最近面临毕业就业,在复习数据结构与算法,为了更好地掌握,加深印象,所以决定写一些博客来知识复现. 温馨提示:这篇博客可能不适合刚学数据结构的新手. 算法的简单介绍 黄金分割点是指把一条线段分割为 ...

最新文章

  1. [日更-2019.5.2、3、4] 关于JVM的概略分析
  2. 云从创始人周曦追忆导师黄煦涛:他是化繁为简的大师,对学生不求回报关怀细微...
  3. android的helloworld工程目录学习
  4. 解析html语言的软件,小程序解析html标签 div-Go语言中文社区
  5. 科大星云诗社动态20210424
  6. php bloginfo stylesheeturl,WordPress主题制作–bloginfo函数使用教程
  7. 第六十八期:程序员与医生
  8. springboot设置默认值_线上Bug无法复现?老司机教你一招,SpringBoot远程调试不用愁!...
  9. ContentProvider中gettype() 和MIME类型的理解
  10. c#实现16进制和字符串之间转换的代码
  11. [渝粤教育] 西南科技大学 旅客运输组织 在线考试复习资料
  12. arcgis坐标转换
  13. python课后练习(高琪400集第一季.第五章)
  14. 2023Mac装机系统优化软件CleanMyMacX
  15. Infragistics Ignite UI for Web
  16. HCIP-DATACOM-解题九月部分58+51题
  17. ngrok搭建服务器(超级详细)
  18. 第9期 | 家系、肿瘤临床基因组/外显子组数据分析实战
  19. 路由器设置,实现不同局域网下主机的相互访问
  20. 微型计算机多少瓦,电脑的实际用电功率是多少?

热门文章

  1. 存储过程执行不报错,时间太快,但是执行无效
  2. 总结open与fopen的区别
  3. RDKit | 读取PDB文件并可视化
  4. RDKit | 基于RDKit(≥2020.09.1)的相似图绘制新方法
  5. sangerbox平台使用(二)差异分析
  6. Cell Reports:中大骆观正+上科大季泉江-CRISPR引导的细菌靶向遗传筛选系统
  7. MPB:浙大王佳堃组瘤胃微生物移植(视频)
  8. 246.三元图的应用与绘图实战
  9. QIIME 2教程. 14数据评估和质控q2-quality-control(2020.11)
  10. 【为自己相亲】单身小姐姐你在哪里,我是书豪,我在等你