斐波那契数列查找算法

简介: 斐波那契数列(Fibonacci sequence),又称黄金分割数列。

java实现斐波那契数列查找算法


什么是斐波那契数列?
斐波那契数列指的是这样一个数列: 0, 1, 1, 2, 3, 5, 8, 13, 21....

特别指出: 第0项是0,第1项是第一个1

这个数列从第三项开始,每一项都等于前两项之和。

斐波那契公式: F(k)=F(k-1)+F(k-2) 提示:F(1)=1 F(2)=1


基本原理:

斐波那契查找原理与二分查找算法相似也要求数组有序,与二分查找算法相比仅仅改变了中间结点(mid)的位置,mid不再是中间或插值得到,而是位于黄金分割点附近,即mid=left + fibona[k - 1] - 1 (fibona代表斐波那契数列)


java代码实现:

//斐波那契数列 查找算法
public class FibonacciSearch {
    //斐波那契数列的大小
    public static int maxSize = 10;

    public static void main(String[] args) {
        int[] arr = {10, 11, 12, 50, 60, 99, 100};
        int index = fibonacciSearch(arr, 100);
        System.out.println("index=" + index);

    }


    //创建一个斐波那契数列
    public static int[] fid() {
        int[] arr = new int[maxSize];
        arr[0] = 1;
        arr[1] = 1;
        for (int i = 2; i < maxSize; i++) {
            arr[i] = arr[i - 1] + arr[i - 2];
        }
        return arr;
    }


    /**
     * 利用斐波那契  查找对应的元素
     *
     * @param arr 待查找的数组
     * @param key 待查找的数
     * @return 如果找到就返回对应数的下标,如果找不到就返回-1.
     */
    public static int fibonacciSearch(int[] arr, int key) {
        int left = 0;
        int right = arr.length - 1;
        int[] fibona = fid();
        int k = 0;
        //将创建一个适合斐波那契数列的数组
        while (right > fibona[k] - 1) {
            k++;
        }
        int[] temp = Arrays.copyOf(arr, fibona[k]);
        for (int i = right + 1; i < fibona[k]; i++) {
            temp[i] = arr[right];
        }

        int mid = 0;
        while (left <= right) {
            mid = left + fibona[k - 1] - 1;
            if (key < temp[mid]) {
                right = mid - 1;
                k -= 1;
            } else if (key > temp[mid]) {
                left = mid + 1;
                k -= 2;
            } else {
                if (mid < right) {
                    return mid;
                } else {
                    return right;
                }
            }
        }
        return -1;
    }
}
目录
相关文章
|
6月前
|
算法
【算法优选】 动态规划之斐波那契数列模型
【算法优选】 动态规划之斐波那契数列模型
|
6月前
|
机器学习/深度学习 算法 测试技术
【动态规划】C++算法:446等差数列划分 II - 子序列
【动态规划】C++算法:446等差数列划分 II - 子序列
|
1月前
|
算法 Java 索引
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
18 0
|
1月前
|
算法 Java 编译器
【递归算法】斐波那契变形问题(C/C++)
【递归算法】斐波那契变形问题(C/C++)
|
3月前
|
存储 算法
读《趣学算法》:重开算法之门,神奇的兔子数列(斐波那契数列)
本文通过《趣学算法》中的斐波那契数列问题,探讨了算法的递归实现、时间复杂度分析,并展示了如何通过迭代和优化存储空间来改进算法,最终将时间复杂度从指数级降低到线性级,并将空间复杂度从线性级降低到常数级。
83 0
读《趣学算法》:重开算法之门,神奇的兔子数列(斐波那契数列)
|
5月前
|
算法 Java
斐波那契查找算法 (java)
斐波那契查找算法 (java)
|
5月前
|
存储 SQL 算法
解锁动态规划:从斐波那契到高效算法
解锁动态规划:从斐波那契到高效算法
|
5月前
|
算法
算法特训,AB5 .点击消除BC.149简写单词牛客.除2!牛客.Fibonacci数列
算法特训,AB5 .点击消除BC.149简写单词牛客.除2!牛客.Fibonacci数列
|
6月前
|
算法
算法沉淀 —— 动态规划篇(斐波那契数列模型)
算法沉淀 —— 动态规划篇(斐波那契数列模型)
53 0
|
6月前
|
算法
算法修炼-动态规划之斐波那契数列模型
算法修炼-动态规划之斐波那契数列模型