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. Hibernate 缓存机制
  2. 用 CALL TRANSACTION USING... 调用批输入时的一些注意事项
  3. SQL Server 扩展事件系列 (1 of 31) -- 扩展事件概述
  4. Easyexcel文件下载时,中文名称显示为下划线
  5. MATLAB怎么表示均布荷载,MATLAB平面四节点等参元分析程序说明
  6. python对象模型_[译] 用 Python 实现一个最简单的对象模型
  7. python根据频率画出词云_利用pandas+python制作100G亚马逊用户评论数据词云
  8. python 生成testbench_(Testbench用法总结)1. Testbench中文本数据的存储读取操作对比
  9. Fileupload
  10. Teleport Ultra网站静态资源下载工具
  11. 2018年南京公积金贷款新政答疑来了!首套房最高可贷50万元/人(附首套房认定标准)...
  12. Linux之ss命令
  13. Maven从私服下载相关jar包报错Could not find artifact问题
  14. 魔兽争霸之PHP设计模式-单件模式[Singleton]
  15. 分步傅里叶算法_快速分步傅里叶算法,split-step fast Fourier transform,音标,读音,翻译,英文例句,英语词典...
  16. 如何进行市场细分并初步绘制用户画像?
  17. 组态王怎么做进度条_三种方法制作进度条效果
  18. pgpool mysql_pgpool分析二
  19. DataBinder.Eval 的用法细则
  20. 东芝核电及半导体去向令日美政府忧心忡忡

热门文章

  1. “中软综合项目实训”——把学生当员工培养
  2. APP爬虫| 逆向神器 frida 初试
  3. gateway配置https访问
  4. Python问题解决二:使用Radon变换进行线检测
  5. 医院项目-预约挂号-第五部分
  6. AVR单片机Atmega128外扩RAM
  7. 4399前端面试总结
  8. 大学计算机基础教程魏长宝答案,容易并发脓气胸的是A.肺炎球菌肺炎B.支原体肺炎C.肺炎杆菌肺炎D.绿脓杆菌肺炎E.金黄色葡萄球菌肺...
  9. C语言 求10的阶乘
  10. 06年java星战ol,《星战三国》微端网游 左转是网游右拐是页游