
【LeetCode】斐波那契查找(Python版)
发布日期:2021-05-08 05:47:55
浏览次数:19
分类:精选文章
本文共 2233 字,大约阅读时间需要 7 分钟。
一、含义
斐波那契数列(Fibonacci)又称黄金分割数列,指的是这样一个数列:1,1,2,3,5,8,13,21,…
在数学上,斐波那契被递归方法如下定义:F(1) = 1;F(2) = 1;F(N) = F(n-1)+F(n-2) (n>=2),该数列越往后,相邻的两个数的比值越趋于黄金比例值(0.618)。斐波那契查找就是在二分法查找的基础上根据斐波那契数列进行分割。 斐波那契查找为二分法查找的变种,也需要提前对数列记性排序,当被查找数列长度为20时,二分法首次查找选择的是数列中第10个元素做参考物。Fibonacci首次查找按照选取的是数列中第13个元素做参考物。如果被查找数列长度为100,二分法首次查找选择的是数列第50个元素做参照物。而斐波那契数首次查找选取的数列中第89个元素做参考物,数列越长,选择参考点的位置差别越大。具体需要根据斐波那契数列的递归方法选取得到。二、输出结果
三、代码实现
import randomimport timeitdef randomList(n): iList = [] for i in range(n): iList.append(random.randrange(0,1000)) return iListdef quicksort(iList): if(len(iList)<=1): return iList left = [] right = [] for i in iList[1:]: if i<=iList[0]: left.append(i) else : right.append(i) return quicksort(left)+[iList[0]]+quicksort(right)def fibonacci(n): iList = [1,1] k = n; while(k>1): #获取的斐波那契数列第n位数据,即要查找列表的位置 #iList[-1]、iList[-2]表示列表最后一位数的前两位数据 iList.append(iList[-1] + iList[-2]) k -= 1 return iList[-1]def fibonacciSearch(iList,key): ilen = len(iList) left = 0 right = ilen - 1 if(ilen == 0): return -1 #########斐波那契数列的长度k######### k = 1 while fibonacci(k)-1 < ilen-1: k += 1 ################################### while right - left > 1: #20个数的数列查找,斐波那契数列为[1 1 2 3 5 8 13 21] #k = 7时,fibonacci(k-1)的值为13 #因此第一个mid=14,14表示查询数据的位置 mid = left +fibonacci(k-1) if key < iList[mid]: right = mid-1 k -= 1 elif key > iList[mid]: left = mid+1 k -=2 else: return mid ################################## if(key == iList[right]): return right elif(key == iList[left]): return left else: return -1if __name__ == "__main__": iList = quicksort(randomList(20)) print(iList) keys=[random.choice(iList),random.randrange(min(iList),max(iList))] for key in keys: num = fibonacciSearch(iList,key) if(num>=0): print("%d number is %d\n"%(key,num)) else: print("%d the key number is not find\n"%key) #print(timeit.timeit("fibonacciSearch(iList,key)","from __main__ import selectsort,iList",number=100))
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月04日 05时37分20秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Java集合总结系列2:Collection接口
2021-05-09
Linux学习总结(九)—— CentOS常用软件安装:中文输入法、Chrome
2021-05-09
比技术还重要的事
2021-05-09
linux线程调度策略
2021-05-09
软中断和实时性
2021-05-09
Linux探测工具BCC(可观测性)
2021-05-09
SNMP介绍及使用,超有用,建议收藏!
2021-05-09
HDU5589:Tree(莫队+01字典树)
2021-05-09
不停机替换线上代码? 你没听错,Arthas它能做到
2021-05-09
Python开发之序列化与反序列化:pickle、json模块使用详解
2021-05-09
采坑 - 字符串的 "" 与 pd.isnull()
2021-05-09
无序列表 - 链表
2021-05-09
Matplotlib绘制漫威英雄战力图,带你飞起来!
2021-05-09
机器学习是什么
2021-05-09
《小王子》里一些后知后觉的道理
2021-05-09
《你当像鸟飞往你的山》总结
2021-05-09
《我是猫》总结
2021-05-09
《抗糖化书》总结
2021-05-09
apache虚拟主机配置
2021-05-09
PHP官方网站及PHP手册
2021-05-09