python 实现fibonacci search斐波那契查找算法

fibonacci search斐波那契查找算法介绍

斐波那契查找(Fibonacci Search)是一种在有序数组中查找特定元素的算法,它基于斐波那契数列。斐波那契数列是一个著名的数列,其中每个数是前两个数的和,序列以0和1开始。斐波那契查找算法利用斐波那契数列的性质来减少查找过程中不必要的比较次数,从而提高查找效率。

斐波那契查找算法的基本思想是通过构造一个斐波那契数列来逼近目标值的位置。算法的关键在于,它首先计算一个大于等于数组长度的斐波那契数(通常是斐波那契数列中第一个大于或等于数组长度的数),然后根据斐波那契数列的性质,将数组分为两部分,比较中间元素与目标值的大小,根据比较结果调整查找的范围,然后递归地在新的范围内继续查找,直到找到目标值或查找范围为空。

斐波那契查找算法的主要步骤如下:

计算斐波那契数:首先,需要找到一个斐波那契数F(n),使得F(n)大于等于数组的长度L。

补充数组:由于斐波那契数列中的数通常比数组长度大,因此需要将数组补充至长度为F(n)的数组,补充的元素可以设为数组中的最后一个元素(或者是无穷大,如果目标值不可能大于数组中的最大值)。

斐波那契查找:利用斐波那契数列的性质进行查找。假设F(n-1)和F(n-2)是斐波那契数列中相邻的两个数,且F(n-1) + F(n-2) = F(n),则可以将数组分为长度为F(n-1)和F(n-2)的两部分。比较中间元素(即第F(n-1)个元素)与目标值的大小:

如果目标值等于中间元素,则查找成功。
如果目标值小于中间元素,则继续在左侧长度为F(n-1)的数组中查找。
如果目标值大于中间元素,则继续在右侧长度为F(n-2)的数组中查找。

递归查找:在缩小后的数组中递归执行上述查找过程,直到找到目标值或查找范围为空。

返回结果:如果找到目标值,则返回其索引;如果查找范围为空,则返回未找到(或相应的错误码)。

需要注意的是,斐波那契查找算法在查找结束后需要恢复原始数组(即移除补充的元素),并释放相关资源。此外,由于斐波那契查找算法涉及到斐波那契数列的计算和递归查找,因此在实现时需要注意性能和空间复杂度的问题。

然而,需要注意的是,斐波那契查找算法在实际应用中并不常见,因为它相对于其他查找算法(如二分查找)来说,实现较为复杂,且性能提升并不明显。因此,在大多数情况下,推荐使用更简单、更高效的查找算法。

fibonacci search斐波那契查找算法python实现样例

下面是一个使用Python实现Fibonacci Search的例子:

def fibonacci_search(arr, x):
    n = len(arr)

    fibMMm2 = 0
    fibMMm1 = 1
    fibM = fibMMm2 + fibMMm1

    while fibM < n:
        fibMMm2 = fibMMm1
        fibMMm1 = fibM
        fibM = fibMMm2 + fibMMm1

    offset = -1

    while fibM > 1:
        i = min(offset + fibMMm2, n - 1)

        if arr[i] < x:
            fibM = fibMMm1
            fibMMm1 = fibMMm2
            fibMMm2 = fibM - fibMMm1
            offset = i

        elif arr[i] > x:
            fibM = fibMMm2
            fibMMm1 = fibMMm1 - fibMMm2
            fibMMm2 = fibM - fibMMm1

        else:
            return i

    if fibMMm1 and arr[offset + 1] == x:
        return offset + 1

    return -1


# 示例
arr = [10, 22, 35, 40, 45, 50, 80, 82, 85, 90, 100]
x = 45

index = fibonacci_search(arr, x)
if index == -1:
    print(x, "is not present in the array")
else:
    print(x, "is present at index", index)

输出:

45 is present at index 4

这个算法的时间复杂度为O(log n),其中n为数组的长度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luthane

您的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值