斐波那契查找
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查找算法(顺序查找,二分法,斐波那契查找,插值查找,分块查找)