1. 斐波拉契查找算法

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

  • 黄金分割点:黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比,其比值约等于0.618。

  • 斐波拉契数列:又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)。斐波拉契数列越往后,前后两项的比值越接近0.618,也就是黄金比例的比值。

斐波拉契查找算法是在折半查找算法的基础上根据斐波拉契数列进行分割的。在斐波拉契数列中找到一个等于或略大于待查找长度的数F(n),待查找表长度扩展为F(n)-1(如果原来的数组长度不够F(n)-1,则需要扩展,扩展时候用原待查找表最后一项填充),mid = low + F(n)-1,已知 mid 为划分点(黄金分割点),将待查找表划分为左边、右边,即 F(n)个元素分割为前半部分F(n-1)-1个元素、后半部分F(n-2)-1个元素。

整体来说,它是根据斐波拉契数列的特点对有序表进行分割,寻找比例分割点mid,并进行比较,取舍范围。

2. 实现斐波拉契查找算法


def fibonacci_search(data, key):# 需要一个现成的斐波那契列表。其最大元素的值必须超过查找表中元素个数的数值。F = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,233, 377, 610, 987, 1597, 2584, 4181, 6765]low = 0                                                                 # 低位high = len(data) - 1                                                    # 高位# 为了使得查找表满足斐波那契特性,在表的最后添加几个同样的值# 这个值是原查找表的最后那个元素的值# 添加的个数由F[k]-1-high决定k = 0while high > F[k] - 1:k += 1i = high                                                                # 将i定位到high的位置while F[k] - 1 > i:                                                     # 添加数据data.append(data[high])                                             # 追加到high之后的位置上i += 1print("添加后的数据",data)# 算法主逻辑,count用于展示循环的次数。while low <= high:                                                      # 满足低位小于等于高位# 为了防止F列表下标溢出,设置if和elseif k < 2:mid = lowelse:mid = low + F[k - 1] - 1print("低位位置:%s, 中间位置:%s,高位位置:%s" % (low, mid, high))       # 输出每次分割情况if key < data[mid]:                                                 # 目标数据小于中间值数据,在左侧寻找high = mid - 1                                                  # 高位位置移到mid-1的位置k -= 1                                                          # 下标k此时减1elif key > data[mid]:                                               # 目标数据大于中间值数据,在右侧寻找low = mid + 1                                                   # 低位位置移到mid+1的位置k -= 2                                                          # 下标k此时减2else:                                                               # 否则if mid <= high:                                                 # 中间值小于等于midreturn mid                                                  # 此时的结果是mid就是目标值得位置,返回mid即可else:                                                           # 如果mid大于了高位位置值return high                                                 # 此时的结果直接返回high的值return False# 验证数据
data = [9,10,13,15,22,29,37,48,53]                                          # 数据列表
key=int(input("请输入想要查找的数据:"))
result = fibonacci_search(data, key)                                        # 调用斐波那契查找函数
print("目标数据",key,"的位置是", result)                                       # 输出结果

007.斐波拉契查找算法相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. 斐波拉契数列——算法

    斐波拉契数列 题目描述 斐波那契数列是一组第一位F1和第二位F2为1,从第三位开始,后一位是前两位和的一组递增数列Fn=Fn-1+Fn-2. 那么当n比较大时,Fn也非常大,现在我们想知道,第n项,F ...

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

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

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

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

最新文章

  1. 运动检测(前景检测)之——ViBe
  2. C++ 使用dynamic_cast执行基类向派生类的转换
  3. 【学术相关】选导师犹如选对象:真真切切,现现实实!
  4. XCTF WEB backup
  5. 【个人笔记】OpenCV4 C++ 快速入门 26课
  6. React Hooks 起手式,实现一个「高颜值实用」的色彩设计工具
  7. 广告终结者:使用AdBlock Plus屏蔽百度、CSDN广告
  8. 如何正确做笔记?符号笔记法、康奈尔笔记法总结!
  9. html语言亚马逊后台,「亚马逊」新手卖家指南-页面与术语
  10. java邮件撤回_JavaMail 退回邮件
  11. 跟着B站UP主小姐姐去华为坂田基地采访扫地僧
  12. ParNew回收器和Parallel Scavenge回收器介绍
  13. RxSwift核心逻辑
  14. RF使用技巧--返回值的妙用
  15. 取模运算的理解和应用
  16. php和java做众筹系统哪个好,Java版众筹系统和PHP众筹系统对比分析
  17. 美妆电商跌宕十年,跨境模式能否让其重新崛起?
  18. linux洪水攻击软件,SYN洪水攻击工具hping SYN-Flooding tool
  19. 怎样锻炼自己的意志力,绘制思维导图教你总结
  20. SOLO模型环境搭建训练流程及问题

热门文章

  1. 中国第一封电子邮件是谁发出的?
  2. pkpm快速入门教程_PKPM教程入门必知技巧
  3. 环信即时通讯集成过程
  4. AI研究院巡礼——小米AI研究院
  5. 模电实验——实验一 晶体管共射极单管放大器
  6. 胜博发表示玩游戏也能做公益!守望先锋为乳癌研究基金会募得一千多万美金
  7. php 半角 全角空格,PHP将全角空格转成半角, 并去除头尾空格
  8. 前端面试总结(持续更新中~~~~)
  9. 12.16 Daily Scrum
  10. 点云最小二乘法拟合曲线