查找算法系列04-斐波那契查找

  • 斐波那契查找简介
  • 实现(java)
  • 时间复杂度

1.斐波那契查找简介

  • 有序表查找, 扩展数组, 令长度为f(k)-1, 则中间元素将数组分为f(k-1)-1和f(k-2)-1的2部分, 与中间元素比较, 比中间元素小, 在左半区域查找, 比中间元素大, 在右半区域查找
  • 数组必须有序
  • 斐波那契数列, 从第三个元素开始, 是前2个元素之和, 前后2个元素的比值越来越接近黄金分割点(0.618)

2.实现(java)

public class FibonacciSearch {
     

    public static void main(String[] args) {
     
        int[] arr = {
     5, 19, 21, 35, 40, 52, 63, 77, 82, 96};
        int index = search(arr, 82);
        if(-1 != index) {
     
            System.out.println("查询成功, 元素位于数组第" + (index + 1) + "位");
        }else {
     
            System.out.println("查询失败");
        }
    }

    public static int search(int[] arr, int key) {
     
        int low = 0;
        int high = arr.length - 1;
        int n = arr.length;
        int k = 0;
        while (n > f(k) - 1) {
     
            k++;
        }
        int[] tmpArr = Arrays.copyOf(arr, f(k) - 1);
        for(int i = n; i < tmpArr.length; i++) {
     
            tmpArr[i] = arr[high];
        }

        while (low <= high) {
     
            int mid = low + f(k - 1) - 1;
            if(key < tmpArr[mid]) {
     
                high = mid - 1;
                k -= 1;
            }else if(key > tmpArr[mid]) {
     
                low = mid + 1;
                k -= 2;
            }else {
     
                if(mid < n) {
     
                    return mid;
                }else {
     
                    return n - 1;
                }
            }
        }
        return -1;
    }

    public static int f(int k) {
     
        if(k == 0) {
     
            return 0;
        }
        if(k == 1) {
     
            return 1;
        }
        return f(k - 1) + f(k - 2);
    }
}

3.时间复杂度
时间复杂度为O(log2n)

你可能感兴趣的:(数据结构与算法,数据结构,算法)