Algs4-1.4.22斐波那契查找算法(Fibonacci Search)Java 实现

package sed.algorithm.chapter1.section4;

import edu.princeton.cs.introcs.StdOut;

public class FibonacciSearch{

    private static final int MAXSIZE = 13; 

    public static void fibonacci(int[] f){
        f[0] = 1;
        f[1] = 1;
        StdOut.print(f[0] + " ");
        StdOut.print(f[1] + " ");


        for (int i = 2; i < MAXSIZE; i++) {
            f[i] = f[i-1] + f[i-2];
            StdOut.print(f[i] + " ");
        }

        StdOut.println();

    } 

    public static int fibonacci_search(int[] a, int key, int n){
        int low = 0, high = n-1;
        int mid = 0;
        int k = 0;
        int[] F =  new  int[MAXSIZE];
        fibonacci(F);

        while( n > F[k]-1){ //确保fibonacci数列中的值可以表示整个待搜索数组中的位置
            ++k;
        }

        //将待搜索数组的规模扩展为F[k]-1;原来不足的部分用a[high]填充
        int[] tempArray = new int[F[k]-1];

        for (int i = n; i < F[k]-1; i++) {
            tempArray[i] = a[high];
        }

        for (int i = 0; i < n; i++) {
            tempArray[i] = a[i];
        }

        a = tempArray;

        //对于规模为F[k]-1的数组
        //黄金分割搜索, 每次将数组分为三部分,
        //第一部分为从low(包含)开始的F[k-1]-1个元素,到mid-1(包含)为止; 
        //第二部分即为单个的a[mid],其中 mid = low+F[k-1]-1;
        //第三部分为 从啊mid+1 (包含)开始的F[k-2]-1个元素,到high为止
        //每次循环均遵循这一规律

        while(low <= high){
            mid = low + F[k-1] -1;
            if (a[mid] > key) {
                high = mid -1;
                k = k - 1;
            }else if (a[mid] < key){
                low = mid + 1;
                k = k - 2;
            }else{
                if (mid <= high) {
                    return mid;
                }else {
                    return -1;
                }
            }

        }

        return -1;
    }


    public static void main(String[] args) {
        int[] a = {5,15,19,20,25,31,38,41,45,49,52,55,57};
        for (int i = 0; i < a.length; i++) {
            StdOut.print(a[i] + " ");
        }

        StdOut.println();
        StdOut.println(fibonacci_search(a,57,13));
    }

}

Caution:

  1. 斐波那契搜索算法的作用的对象一定是F[k]-1规模大小的有序数组
    原因:只有这样,每次分割才会分为(F[k-1]-1)+(F[k-2]-1) + 1= F[k] -1 正好为代码注释中所提到的前,后 ,中间元素三部分。

  2. 初始时填充的元素为有序数组中的最大 值,是为了在不引入新值得同时保持数组的单调性

  3. 其分割方法称为黄金分割的原因是当斐波那契数列足够大时,F[k-1]/F[K]的值接近0.618

Reference:http://www.cnblogs.com/cpoint/
Author: vmxplus
From: http://blog.csdn.net/vmxplus
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值