斐波那契查找算法

本文解析斐波那契查找算法的工作原理,通过与二分查找和插值查找对比,展示其利用黄金分割思想提高搜索效率的过程,并提供了一个Java实现示例。通过createFibList函数生成斐波那契数列,帮助理解如何在搜索过程中定位分割点。
摘要由CSDN通过智能技术生成

1-斐波那契查找算法思想

这个算法不是很懂!需要再补充!(未完成)

思想比较

  • 二分查找过程中,mid= left + (left + right) / 2
  • 插值查找过程中,引入了比例因素,
    mid = left + [(key - arr[left])/(arr[high] - arr[left])](high - left)

斐波那契查找算法mid计算是通过下面公式实现的

mid = left + fibList[fibIndex - 1] - 1; 

可以使每一次的查询都接近黄金分割比

2-代码实现

package select;

import java.util.Arrays;

public class FibonacciSearch {
    private static int length = 20;

    public static void main(String[] args) {
        int[] arr = {1, 8, 10, 89, 1000, 1234};
        int findIndex = fibSearch(89, arr);
        System.out.println(findIndex);

    }

    // 生成一个斐波那契数列,后续寻找mid分割点时使用
    public static int[] createFibList() {
        int[] fib = new int[length];
        fib[0] = 1;
        fib[1] = 1;

        for (int i = 2; i < length; i++){
            fib[i] = fib[i-1] + fib[i-2];
        }
        return fib;
    }

    public static int fibSearch(int keyValue,int[] arr){
        int right = arr.length -1;
        int left = 0;
        int fibIndex = 0; // 斐波那契数列下标
        int mid = 0; // 中间索引
        int[] fibList = createFibList(); // 斐波那契数列

        while (right > fibList[fibIndex] - 1){ // 找到在createFibList创建的方法中,需要截取到哪些
            fibIndex++;
        }

        int[] temp = Arrays.copyOf(arr, fibList[fibIndex]); // 新创建的数组

        // 元素进行填充
        for (int i = right +1; i < temp.length; i++){
            temp[i] = arr[right];
        }

        while (left <= right){
            mid = left + fibList[fibIndex - 1] - 1; // 更新mid值

            if (keyValue < temp[mid]){ // 如果查找的key在mid的左边
                right = mid - 1; // 更新right
                fibIndex--;  // 更新mid
            }else if (keyValue > temp[mid]){ // 如果查找的key在mid的右边
                left = mid + 1;
                fibIndex -= 2;
            }
            else { // 找到了mid,此时就是keyValue,但是这时无法保证此时的mid在数组中存在
                if (mid <= right){
                    return mid;
                }else {
                    return right;
                }
            }
        }
        return -1; // 找不到
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值