裴波那契查找(Fibonacci Search)是利用黄金分割原理实现的查找方法。

  斐波那契查找的核心是:

   1.当key == a[mid]时,查找成功;

   2.当key < a[mid]时,新的查找范围是low至mid-1, 此时范围个数为F[k-1] - 1个,即数组左边的长度;

   3.当key < a[mid]时,新的查找范围是mid+1至high,此时范围个数为F[k-2] - 1个,即数组右边的长度;

import random

#source为待查找数组,key为要查找的数
def fibonacciSearch(source,key):
#生成裴波那契数列
fib = [0,1]
for i in range(1,36):
fib.append(fib[-1]+fib[-2]) #确定待查找数组在裴波那契数列的位置
k = 0
n = len(source) #此处 n>fib[k]-1 也是别有深意的
#若n恰好是裴波那契数列上某一项,且要查找的元素正好在最后一位,此时必须将数组长度填充到数列下一项的数字
while(n > fib[k]-1):
k = k + 1 #将待查找数组填充到指定的长度
for i in range(n,fib[k]):
a.append(a[-1]) low,high = 0,n-1 while(low <= high): #获取黄金分割位置元素下标
mid = low + fib[k-1] - 1 if(key < a[mid]):
#若key比这个元素小,则key值应该在low至mid-1之间,剩下的范围个数为F(k-1)-1
high = mid - 1
k = k -1
elif(key > a[mid]):
#若key比这个元素大,则key至应该在mid+1至high之间,剩下的元素个数为F(k)-F(k-1)-1=F(k-2)-1
low = mid + 1
k = k - 2
else:
if(mid < n):
return mid
else:
return n-1 return -1 ### 函数测试 ### #生成待查找的数组
a = [random.randint(1,100000) for x in range(0,33)]
a.append(673990)
a.sort() #待查找的数
key = 673990 #输出查找到的位置下标
print(fibonacciSearch(a,key))

Python新手,如有不对的地方请指正。

裴波那契查找详解 - Python实现的更多相关文章

  1. python实现斐波那契查找

    通过在网上找教程解释和看书,总结出一套比较简单易懂的代码实现. 斐波那契查找和二分查找一样,针对的是有序序列,在此前提下: # 先创建一个Fibonacci函数 fib = lambda n: n i ...

  2. 2.裴波那契(Fibonacci)数列

    裴波那契(Fibonacci)数列 f(n)= ⎧⎩⎨0,1,f(n−1)+f(n−2),n =0n =1n>1 求裴波那契数列的第n项.(题目来自剑指offer) 1.递归解法,效率很低的解法 ...

  3. 详解 Python 的二元算术运算,为什么说减法只是语法糖?

    原题 | Unravelling binary arithmetic operations in Python 作者 | Brett Cannon 译者 | 豌豆花下猫("Python猫&q ...

  4. 举例详解Python中的split()函数的使用方法

    这篇文章主要介绍了举例详解Python中的split()函数的使用方法,split()函数的使用是Python学习当中的基础知识,通常用于将字符串切片并转换为列表,需要的朋友可以参考下   函数:sp ...

  5. 剑指offer例题——裴波那契数列

    编程题:大家都知道裴波那契数列,现在要求输入一个整数n,请你输出裴波那契数列的第n项(从0开始,第0项为0).n<=39 public class Solution { public int F ...

  6. 【Java】 大话数据结构(10) 查找算法(1)(顺序、二分、插值、斐波那契查找)

    本文根据<大话数据结构>一书,实现了Java版的顺序查找.折半查找.插值查找.斐波那契查找. 注:为与书一致,记录均从下标为1开始. 顺序表查找 顺序查找  顺序查找(Sequential ...

  7. 详解Python中re.sub--转载

    [背景] Python中的正则表达式方面的功能,很强大. 其中就包括re.sub,实现正则的替换. 功能很强大,所以导致用法稍微有点复杂. 所以当遇到稍微复杂的用法时候,就容易犯错. 所以此处,总结一 ...

  8. 关于k阶裴波那契序列的两种解法

    在学校的anyview的时候,遇到了这个题: [题目]已知k阶裴波那契序列的定义为f(0)=0, f(1)=0, ..., f(k-2)=0, f(k-1)=1;f(n)=f(n-1)+f(n-2)+ ...

  9. 详解Python模块导入方法

    python常被昵称为胶水语言,它能很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松联结在一起.python包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的 ...

随机推荐

  1. 如何在Windows系统中配置Mysql群集(Mysql Cluster)

    MySQL群集技术在分布式系统中为MySQL数据提供了冗余特性,增强了安全性,使得单个MySQL服务器故障不会对系统产生巨大的负面效应,系统的稳定性得到保障. Mysql群集(Cluster)简介 M ...

  2. Lavarel artisan 命令

    [alex@iZ25c5aeyiiZ yiqizou3.0]# php artisan list Laravel Framework version Usage: command [options] ...

  3. 2017年十大奇葩画风的H5页面案例,原来脑洞可以这样大

    每个人都是视觉动物,画面精美.体验奇特的H5,用户在内心一般都会满分打出,毫不吝啬,同时也毫不犹豫分享,因为此时的分享不掉价儿~ 今天给大家准备了十支H5,画风超级奇特,非常值得一看所有案例均可在19 ...

  4. Windows 10「设置」应用完整MS-Settings快捷方式汇总

    分类 设置名称 快捷方式 系统 显示 ms-settings:display 通知和操作 ms-settings:notifications 平板电脑模式 ms-settings:tabletmode ...

  5. win10 uwp 保存用户选择文件夹

    如果我们每次把临时处理的文件保存,都要让用户选择一次,用户会不会觉得uwp垃圾?如果我们每次打开应用,都从某个文件读取,而这个文件不在应用目录和已知的目录,那么每次都需要用户选择,用户会不会觉得uwp ...

  6. 恶意软件Mirai换了个马甲 瞄上我国2亿多台IoT设备

    恶意软件Mirai换了个马甲 瞄上我国2亿多台IoT设备   想要起来时,一种沉重感阻碍着他,这是一种安全感:感觉到一张床为他铺好了,而且只属于他:想要静卧时,一种不安阻碍着他,把他从床上赶起来,这是 ...

  7. Linux下PHP连接MS SQLServer的办法

    Linux下PHP连接MS SQLServer的办法分析问题 本来PHP脚本读写SQLServer是没有什么问题的,在Apache for windows和Windows IIS下可以工作的很好,一般 ...

  8. 5分钟看懂svg path 路径的所有命令(更有API解释、有图、有图文对比解析)

    友情提示:更多详情.每个命令的例子.参数变化对比图文详解,欢迎关注九十七度的博客:SVG<Path>命令详解 M = moveto M x y 移动到指定坐标,xy分别为x轴和y轴的坐标点 ...

  9. LeetCode 191. Number of 1 bits (位1的数量)

    Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also know ...

  10. Stack by pointer

    前言:因为栈的很多操作是基于表的,所以这篇文章里的例程就不再大面积地写注释了,有不理解的地方可以翻看之前的链表笔记,或者直接写在评论区. 咳咳,说到这个栈,很多人乍听之下感觉很陌生.卧槽这是什么玩意. ...