【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))
上一篇:【LeetCode】分块查找(Python版)
下一篇:【LeetCode】二分法查找(Python版)

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月04日 05时37分20秒