【LeetCode】斐波那契查找(Python版)

一、含义

斐波那契数列(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个元素做参考物,数列越长,选择参考点的位置差别越大。具体需要根据斐波那契数列的递归方法选取得到。

二、输出结果

在这里插入图片描述

三、代码实现

【csdn】斐波那契查找参考

import random
import timeit

def randomList(n):
    iList = []
    for i in range(n):
        iList.append(random.randrange(0,1000))
    return iList
def 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 -1

if __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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值