斐波那契查找

Posted mytrip

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了斐波那契查找相关的知识,希望对你有一定的参考价值。

package Search;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class FibonacciSearch
{
    int F[] = new int[20];//斐波那契 数列
    //被查找数组
    List<Integer> A = new ArrayList<Integer>()
    {
        {
            add(1);
            add(2);
            add(3);
            add(4);
            add(5);
            add(6);
            add(7);
            add(8);
            add(9);
            add(10);
            add(11);
        }
    };

    public static void main(String[] args) throws IOException
    {
        FibonacciSearch ob = new FibonacciSearch();
        ob.CreateFibonacci();
        ob.ShowData();
        ob.Find(4);

    }
//开始查找
    public void Find(int searchvalue)
    {
        int index = Search(A.size(), searchvalue);//传入原始长度,和查找值;注意原始长度必传
        if (index >= 0)
            System.out.println("get position at:" + index);
        else
            System.out.println("Not Found Anything");

    }
 //显示斐波那契数列和原始数组
    public void ShowData()
    {
        for (int i = 0; i < F.length; i++)
        {
            if (i < F.length - 1)

                System.out.print(F[i] + ",");
            else
                System.out.println(F[i]);
        }

        for (int i = 0; i < A.size(); i++)
        {
            System.out.println(A.get(i));
        }

    }
//构造斐波那契数列
    public void CreateFibonacci()
    {
        F[0] = 1;
        F[1] = 1;
        for (int i = 2; i < 20; i++)
        {
            F[i] = F[i - 1] + F[i - 2];
        }
    }
  //判断被查找数组的长度是否落在斐波那契数列中 
    private int GetFibonacciIndex_ForSerarchArray()
    {
        int k = 0;
        int arraySize = A.size();// 数组下标从 0开始
        while (F[k] < arraySize)
        {
            k = k + 1;//查找斐波那契 中第几个元素中,声明的数组长度 ==查找数组长度
        }        
        
        //假定查找数组的长度  不够F[k]元素中定义的长度,那么从 n+1->F[k]补齐元素,内容为查找数组第n个元素的内容
        for (int i = arraySize; i < F[k]; i++)
        {
            A.add(i, A.get(arraySize - 1));
        }
        return k;
    }

    public int Search(int originlen, int Serarchvalue)
    {
        int n = A.size();
        int k = GetFibonacciIndex_ForSerarchArray();//查找数组的长度,为F数列 的第k个元素(从0开始)所指示的值
        int low = 0;
        int high = n - 1;

        int mid = 0;
        while (low <= high)
        {
            mid = low + F[k - 1] - 1;//长度为F[k] 时,中间元素为F[k - 1] - 1,考虑到查找值在mid右边的情况,故加上low

            if (Serarchvalue < A.get(mid))
            {
                high = mid - 1;// 移到:前半部
                k = k - 1;// 表示前半部元素个数的索引
            }

            if (Serarchvalue > A.get(mid))
            {
                k = k - 2;//表示后半部元素个数的索引
                low = mid + 1;//移到:后半部
            }

            if (Serarchvalue == A.get(mid))
            {
                if (mid > originlen - 1)
                {

                    return originlen - 1;
                }
                else
                    return mid;
            }
        }

        return -1;
    }

}

 

以上是关于斐波那契查找的主要内容,如果未能解决你的问题,请参考以下文章

leetcode查找算法(顺序查找,二分法,斐波那契查找,插值查找,分块查找)

Scala练习-斐波那契查找

斐波那契查找算法解析

有序数组的二分查找&斐波那契查找

[Algorithm]二分插值斐波那契查找算法 Java 代码实现

[Algorithm]二分插值斐波那契查找算法 Java 代码实现