Python中如何实现斐波那契查找算法

2023-04-16 00:00:00 算法 查找 如何实现

斐波那契查找算法是一种利用斐波那契数列进行查找的算法,其原理类似于二分查找,但比二分查找更优秀。在实现斐波那契查找算法之前,我们需要先了解斐波那契数列的相关知识。斐波那契数列是一个无限数列,其前两个数为0和1,而后续每个数都是前两个数之和,即0,1,1,2,3,5,8,13,21,……。

下面是Python实现斐波那契查找算法的代码:

def fibonacciSearch(arr, x):
    # 定义斐波那契数列
    fibList = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]
    n = len(arr)
    # 初始化斐波那契数列的下标
    fibIndex = 0
    while fibList[fibIndex] < n:
        fibIndex += 1
    # 定义辅助数组
    assistList = [-1] * fibList[fibIndex]
    for i in range(n):
        assistList[i] = arr[i]
    # 斐波那契查找
    low = 0
    high = n - 1
    while low <= high:
        mid = low + fibList[fibIndex - 1] - 1
        if x < assistList[mid]:
            high = mid - 1
            fibIndex = fibIndex - 1
        elif x > assistList[mid]:
            low = mid + 1
            fibIndex = fibIndex - 2
        else:
            if mid <= high:
                return mid
            else:
                return -1
    return -1

# 测试代码
arr = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
print(fibonacciSearch(arr, 9))  # 打印 4
print(fibonacciSearch(arr, 8))  # 打印 -1
print(fibonacciSearch(['p', 'i', 'd', 'a', 'n', 'c', 'o', 'd', 'e', '.', 'c', 'o', 'm'], 'o'))  # 打印 6
print(fibonacciSearch(['p', 'i', 'd', 'a', 'n', 'c', 'o', 'd', 'e', '.', 'c', 'o', 'm'], 'z'))  # 打印 -1
print(fibonacciSearch(['皮', '蛋', '编', '程'], '编'))  # 打印 2
print(fibonacciSearch(['皮', '蛋', '编', '程'], '鸡'))  # 打印 -1

上面的代码中,我们首先定义了斐波那契数列和辅助数组。然后使用while循环来找到斐波那契数列中第一个大于等于给定数组长度的值所对应的下标。然后将辅助数组的长度扩充到斐波那契数列中的值。在循环里面,我们根据当前斐波那契数列下标和中间值的比较结果来进行查找操作。如果给定值小于中间值,则在低位查找,同时将斐波那契数列下标减去1;如果给定值大于中间值,则在高位查找,同时将斐波那契数列下标减去2;如果给定值等于中间值,则返回下标。最后如果查找失败,则返回-1。

需要注意的是,以上代码实现的斐波那契查找算法只适用于有序数组,不适用于无序数组。而且,对于无法进行比较的字符串,需要手动实现比较操作才能使用斐波那契查找算法。

相关文章