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

  1. 黄金分割点是指把一条线段分割成两部分,是其中一部分与全长之比等于另一部分与这部分之比。取其前三位数字的近似值是 0.618. 由此按此比例设计的造型十分美丽,因此称为黄金分割,已成中外比。这是一个神奇的数字,会带来意想不到的结果
  2. 斐波那契数列{1, 1, 2, 3, 5, 8, 13, 21, 35}发现斐波那契数列的两个相邻数的比例,无线接近黄金分割值 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] - 1F[k - 2] - 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 search;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};System.out.println(fibSearch(arr, 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;}// 编写斐波那契查找算法/**** @param a     数组* @param key   我们需要查找的关键码* @return*/public static int fibSearch(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] 可能大于数组的长度,因此我们需要使用Arrays类,构造一个i虚拟的数组,并指向a[]int[] temp = Arrays.copyOf(a,f[k]);// 不足的部分使用a数组最后数填充for (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;// 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--k--;} 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 mid;}else {return high;}}}return  -1;}
}

**个人见解:**我认为斐波那契最难的就是它的 k 值的确定,我们通过使用 k 将整个数组分成两段,一段是 f[k - 1] -1 另一段是 f[k - 2] - 1的长度,如果比它小,那我们就从长度为 f[k - 1] -1 的那段里面找, 而 f[k-1] 又分为 f[k -1 -1] 和 f[k -1 - 2], 所以 我们只要 k = k -1 就可以实现,而如果我们要从另一段里面找,他又分成f[k - 2 -1] 和 f[k - 2 - 2],所以,我们要使用k= k - 2来实现

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

  1. 斐波那契(黄金分割)法查找:

    斐波那契(黄金分割法)查找算法: 斐波那契(黄金分割法)原理:**斐波那契查找**原理与前两种相似,仅仅改变了中间结点(mid)的位置,mid不再是中间或插值位于黄金割点附近,即==**mid=low ...

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

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

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

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

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

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

  5. 数论 —— 斐波那契数列(Fibonacci)

    [概述] 斐波那契数列(Fibonacci sequence),又称黄金分割数列,其指的是这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,3 ...

  6. 二十三、斐波那契查找算法

    一.基本介绍 1.黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比.取其前三位 数字的近似值是 0.618.由于按此比例设计的造型十分美丽,因此称为黄金分割,也称为 ...

  7. 数据结构与算法 | 斐波那契查找

    要想能够理解这一算法,需要先了解 1.二分查找 https://blog.csdn.net/qq_35423154/article/details/101383518 2.斐波那契数 https:// ...

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

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

  9. 理论基础 —— 查找 —— 斐波那契查找

    [概述] 斐波那契查找,其利用了黄金分割原理来对二分查找进行了改进. 黄金分割又称黄金比例,是指事物各部分间一定的数学比例关系,即将整体一分为二,较大部分与较小部分之比等于整体与较大部分之比,其比值约 ...

最新文章

  1. oracle rac启停数据库,Oracle rac 启动停止操作文档 PDF 下载
  2. 为什么面包板不能够做射频电路实验?
  3. 深度神经网络对脑电信号运动想象动作的在线解码
  4. 快递物流查询接口介绍
  5. Python4:DataStructure
  6. 傅立叶变换是如何改变我们生活的? ——四个角度告诉你答案
  7. 机器学习近年来之怪现状
  8. D365 ERP流程笔记
  9. Oracle Redo log 状态及工作原理解析
  10. POJ 3295 Tautology (模拟法,栈的使用)
  11. ST M24C01-WDW6TP EEPROM存储器芯片
  12. 使用uniapp做海报的坑
  13. INSERT INTO和INSERT IGNORE INTO 以及REPLACE INTO的区别
  14. 排查Java宕机,weblogic宕机问题排查
  15. 计算机网络实验——路由器基本配置
  16. 高代|共轭矩阵 自共轭矩阵
  17. 盛会落幕,精彩延续 | 云扩科技入选《2022中国AI商业落地市场研究报告》
  18. 每日一道leetcode(python)77. 组合
  19. 互联网快讯:极米NEW Z6X全新升级版Z6X Pro上线;海信提速海外业务;红杉资本掌门人退休
  20. 值得收藏 |140+页文章推荐系统系列文章汇总

热门文章

  1. 学途的踉跄~Top 1 (关于按位操作符的那些事)
  2. 工程造价课程-造价员必懂-脚手架计算
  3. 6款插件,满足你的报表多样化、个性化、酷炫的报表需求(附下载)
  4. PullToRefreshViewPager和ViewPager制作卡片效果
  5. 过渡动画 - 安卓R
  6. 禁止table表格中td的长度随着文本的长度而变化
  7. 维护条件记录_销项税(MWST)
  8. java集合的遍历删除
  9. JQuery 正则表达式
  10. 签了工作之后才发现,自己太草率了(我看过的关于职业规划最好最全面的一篇文章)