斐波那契查找算法1111

想问下斐波那契查找的值小于key的话,为什么k要下调2个单位,谢谢

因为斐波拉契数列某一项等于前两项之和,所以要先得到k-1 k-2,才能得到key

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7497261
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:将链表中数据域为key 的节点删除(链表有重复值)
  • 除此之外, 这篇博客: 数据结构与算法随笔之------二分查找(一文彻底搞懂二分)中的 2.4 查找最后一个小于key的元素 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

      查找最后一个小于key的元素,也就是说返回小于key的最右边元素下标。

    // 查找最后一个小于key的元素
    static int findLastSmaller(int[] array, int key) {
        int left = 0;
        int right = array.length - 1;
    
        // 这里必须是 <=
        while (left <= right) {
            int mid = (left + right) / 2;
            if (array[mid] >= key) {
                right = mid - 1;
            }
            else {
                left = mid + 1;
            }
        }
        return right;
    }
  • 以下回答来自chatgpt:

    我很抱歉,我似乎回答错了问题。斐波那契查找算法中下调k值规则是指,在每一轮查找中,k的初始值为最小斐波那契数列中大于等于数组长度n的数,如果查找的元素比当前位置的元素小,则将查找范围左移两个位置,并将k值下调2个单位;如果查找的元素比当前位置元素大,则将查找范围左移一个位置,并将k值下调1个单位。这个规则可以减少查找次数,提高算法效率。下面是Python代码示例:

    def fibonacciSearch(arr, target):
        n = len(arr)
        FibM_minus_2 = 0  # 初始化斐波那契数列的第n-2项
        FibM_minus_1 = 1  # 初始化斐波那契数列的第n-1项
        FibM = FibM_minus_2 + FibM_minus_1  # 初始化斐波那契数列的第n项
    
        # 找到第一个大于等于n的斐波那契数列的数
        while FibM < n:
            FibM_minus_2 = FibM_minus_1
            FibM_minus_1 = FibM
            FibM = FibM_minus_2 + FibM_minus_1
    
        # 表示数组中前一部分的长度为FibM_minus_2,后一部分的长度为FibM_minus_1
        offset = -1
        while FibM > 1:
            # 确定中间的位置,并进行比较
            i = min(offset + FibM_minus_2, n - 1)
            if arr[i] < target:
                # 需要查找的元素在后一部分,移动范围并更新斐波那契数列的前三项
                FibM = FibM_minus_1
                FibM_minus_1 = FibM_minus_2
                FibM_minus_2 = FibM - FibM_minus_1
                offset = i
            elif arr[i] > target:
                # 需要查找的元素在前一部分,移动范围并更新斐波那契数列的前三项
                FibM = FibM_minus_2
                FibM_minus_1 -= FibM_minus_2
                FibM_minus_2 = FibM - FibM_minus_1
            else:
                # 找到了需要查找的元素
                return i
    
        # 对最后剩余的一个元素进行比较
        if FibM_minus_1 and arr[offset+1] == target:
            return offset+1
    
        # 查找失败
        return -1
    

    希望这段代码能帮助您更好地理解斐波那契查找算法中下调k值的规则。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^