斐波那契数列查找算法

简介: 斐波那契数列(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;
    }
}
目录
相关文章
|
2月前
|
机器学习/深度学习 算法 测试技术
【动态规划】C++算法:446等差数列划分 II - 子序列
【动态规划】C++算法:446等差数列划分 II - 子序列
|
2月前
|
算法
【算法优选】 动态规划之斐波那契数列模型
【算法优选】 动态规划之斐波那契数列模型
|
27天前
|
算法
算法沉淀 —— 动态规划篇(斐波那契数列模型)
算法沉淀 —— 动态规划篇(斐波那契数列模型)
21 0
|
6月前
|
算法
趣味算法-神奇的兔子数列
趣味算法-神奇的兔子数列
|
7月前
|
算法
数列极差(大根堆的删和贪心算法模板)
数列极差(大根堆的删和贪心算法模板)
32 0
|
7月前
|
机器学习/深度学习 算法
蓝桥杯:递推算法 递归算法 例题:斐波纳契数列
蓝桥杯:递推算法 递归算法 例题:斐波纳契数列
38 0
|
10月前
|
算法 Python
算法创作|规则数列计算解决方法
算法创作|规则数列计算解决方法
50 2
05【C语言 & 趣味算法】经典:兔子产子问题(即:Fibonacci数列)
05【C语言 & 趣味算法】经典:兔子产子问题(即:Fibonacci数列)
05【C语言 & 趣味算法】经典:兔子产子问题(即:Fibonacci数列)
|
搜索推荐 C语言
用c语言代码将数列8、6、1、9、2从大到小排序。(要求:画出冒泡排序算法的排序过程)
用c语言代码将数列8、6、1、9、2从大到小排序。(要求:画出冒泡排序算法的排序过程)
91 0
|
算法
算法练习——(6)斐波那契数列前20个
在数学上有一个著名的斐波那契数列,它的规律为:1,1,2,3,5,8,13,21……,请编程输出其前20个数字。
109 0