斐波那契(黄金分割法)查找算法(FibonacciSearch)

1.基本介绍

1)黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。取其前三位数字的近似值是0.618。由于按此比例设计的造型十分美丽,因此称为黄金分割,也称为中外比。这是一个神奇的数字,会带来意向不大的效果。
2)斐波那契数列 {1, 1, 2, 3, 5, 8, 13, 21, 34, 55 } 发现斐波那契数列的两个相邻数 的比例,无限接近 黄金分割值0.618

2.斐波那契(黄金分割法)原理

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

(2).对F(k-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
  • 类似的,每一子段也可以用相同的方式分割
  • 但顺序表长度n不一定刚好等于F[k]-1,所以需要将原来的顺序表长度n增加至F[k]-1。这里的k值只要能使得F[k]-1恰好大于或等于n即可,由以下代码得到,顺序表长度增加后,新增的位置(从n+1到F[k]-1位置),都赋为n位置的值即可。
//获取到斐波那契分割数值的下标while (high > f[k] - 1){k++;}
import java.util.Arrays;public class FibonacciSearch {public static int maxSize = 20;public static void main(String[] args) {int [] arr = {1,8, 10, 89, 1000, 1234};/*int f[] = fib();System.out.println(Arrays.toString(f));*/System.out.println("下标为:" + fibSearche(arr, 10));}//生成一个人fibonacci数列public static int[] fib(){int f[] = new int[maxSize];f[0] = 1;f[1] = 1;for (int i = 0; i < 20; i++) {if(i >= 2){f[i] = f[i-1] + f[i-2];}}return f;}//斐波那契查找算法public static int fibSearche(int a[], int key){int low = 0;int high = a.length - 1;int k = 0; //表示斐波那契分割数值的下标int mid = 0;int f[] = fib();//获取到斐波那契分割数值的下标while (high > f[k] - 1){k++;}//因为f[k] 可能大于a的长度,因此我们需要使用Arrays类,构造一个新的数组,并指向temp//不足的部分用0填充int temp[] = Arrays.copyOf(a, f[k]);//将填充的0 换位afor (int i  = a.length; i < f[k]; i++) {f[i] = a[high];}//循环找到keywhile (low <= high){ //当 low <= high 则一直循环mid = low +f[k-1] -1;if(key < temp[mid]){ //向左递归high -= 1;//1. 全部元素 = 前面的元素 + 后边元素//2. f[k] = f[k-1] + f[k-2]//因为 前面有 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;//1. 全部元素 = 前面的元素 + 后边元素//2. f[k] = f[k-1] + f[k-2]//3. 因为后面我们有f[k-2] 所以可以继续拆分 f[k-2] = f[k-3] + f[k-4]//4. 即在f[k-2] 的前面进行查找 k -=2//5. 即下次循环 mid = f[k - 1 - 2] - 1k -= 2;}else { //相等,找到了if(mid > high){return a.length;}else {return mid;}}}return -1;}
}
  • 结果

斐波那契(黄金分割法)查找算法(FibonacciSearch)相关推荐

  1. 数据结构与算法-查找算法(二分查找,插值查找,斐波那契(黄金分割法)查找)

    查找算法 以下三种算法的基本思想相同,都是利用递归来寻找 二分查找 思路分析 1.首先确定该数组的中间下标,min = (left + right) / 2 2.然后让需要查找的的数findVal和a ...

  2. 我所知道查找算法之斐波拉契(黄金分割法)查找

    作者前言 大家好,我是阿濠,今篇内容跟大家分享的是查找算法之斐波那契(黄金分割法)查找,很高兴分享到segmentfault与大家一起学习交流,初次见面请大家多多关照,一起学习进步. 一.斐波那契数列 ...

  3. JavaScript实现闭式函数计算特定位置的斐波那契数fibonacciNthClosedForm算法(附完整源码)

    JavaScript实现闭式函数计算特定位置的斐波那契数fibonacciNthClosedForm算法(附完整源码) fibonacciNthClosedForm.js完整源代码 fibonacci ...

  4. JavaScript实现动态规划方法计算特定位置的斐波那契数fibonacciNth算法(附完整源码)

    JavaScript实现动态规划方法计算特定位置的斐波那契数fibonacciNth算法(附完整源码) fibonacciNth.js完整源代码 fibonacciNth.js完整源代码 export ...

  5. JavaScript实现以数组形式返回斐波那契数列fibonacci算法(附完整源码)

    JavaScript实现以数组形式返回斐波那契数列fibonacci算法(附完整源码) fibonacci.js完整源代码 fibonacci.js完整源代码 export default funct ...

  6. C语言DP备忘计算指数N的斐波那契级数的算法(附完整源码)

    C语言DP备忘计算指数N的斐波那契级数的算法 C语言DP备忘计算指数N的斐波那契级数的算法完整源码(定义,实现,main函数测试) C语言DP备忘计算指数N的斐波那契级数的算法完整源码(定义,实现,m ...

  7. 斐波那契数列系列算法最优复杂度-------O(logN)

    斐波那契数列系列算法最优复杂度--时间复杂度优化到O(LogN) 对于菲薄那契系列问题的探讨很多,下面就以两个例子来分析: 案例 一: 在迷迷糊糊的大草原上,小红捡到了n根木棍,第i根木棍的长度为i, ...

  8. 数据结构三大查找算法(二分查找、插值查找、斐波那契数列查找)C语言实现

    文章目录 查找 二分查找(折半查找) 插值查找 斐波拉契查找 总结: 查找 查找是在大量的信息里面寻找一个特定的信息元素 (1)静态查找和动态查找: 静态或者动态都是针对查找表而言的.动态表指查找表中 ...

  9. 【斐波那契数列】算法优化笔记

    题目:斐波那契数列为:1,1,2,3,5,8-,求第n项? 初步分析 设an为斐波那契数列. a1=a2=1;(n<=2) an=a(n-1) + a(n-2);(n>=2) 本章总结 [ ...

  10. java斐波那契优化_用HashMap优化斐波那契数列 java算法

    斐波那契是第一项为0,第二项为1,以后每一项是前面两项的和的数列. 源码:Fibonacci.java public class Fibonacci{ private static int times ...

最新文章

  1. shell访问php文件夹,Shell获取某目录下所有文件夹的名称
  2. 海南医学院计算机,海南医学院医学信息学院
  3. SQL自动审核-自助上线平台
  4. ios模拟器快捷键操作
  5. 从路由原理出发,深入阅读理解react-router 4.0的源码
  6. 哪些CSS是可以被继承的--简单整理
  7. PHP实现四位数字+字母验证码
  8. python excel导入oracle数据库_【Python代替Excel】12:Python操作oracle数据库
  9. Python之面向对象的程序设计
  10. 3.Shell 编程从入门到精通 --- 编程基础的基本元素
  11. Java一键多值Map 之Guava Multimap 用法简介
  12. java数据结构——树的实现
  13. java 后台接受json参数的几种方式_java后台发送及接收json数据
  14. unity内部图集切割
  15. 计算机无法锁定在任务栏,win10系统无法锁定任务栏的处理办法
  16. 2020年欧空局10m土地覆盖数据数据分享
  17. 嵌入式开发日记(3)——利用Python接收并处理JY61传感器数据
  18. iOS 开发中遇到的各种证书的详细说明以及申请讲解
  19. 想不到吧,实体类能自己CRUD,MyBatis-Plus AR模式了解下
  20. 借助Grub4DOS的grldr启动Windows PE(软启动)

热门文章

  1. 夏普Sharp MX-B401 一体机驱动
  2. java高级工程师认证考试_Java高级软件工程师人才缺口巨大
  3. PLC的IO点位是什么意思
  4. PLC是什么?它的作用是什么?
  5. Linux部署rsyslog日志服务器(主机部分)
  6. “闽南金三角”——世丰管道福建漳州高级水电工程师会议
  7. linux主机如何安装杀毒软件,Linux 杀毒软件ClamAV安装部署
  8. Unity 资源池,对象池,Object Poor
  9. KEGG Orthology 数据库简介
  10. SecureCRT复制粘贴快捷设置