本文共 3030 字,大约阅读时间需要 10 分钟。
left | mid | right | ||
---|---|---|---|---|
left到(mid - 1)这段为F(k - 1) - 1 | left到(mid - 1)这段为F(k - 1) - 1 | 由(mid + 1)到right这段为 F(k - 2) - 1 | 由(mid + 1)到right这段为 F(k - 2) - 1 | |
全长为:F(k) - 1 | 全长为:F(k) - 1 | 全长为:F(k) - 1 | 全长为:F(k) - 1 | 全长为:F(k) - 1 |
package faboccisearch;import java.util.Arrays;public class FabocciSearch { public static int max = 20; public static void main(String[] args) { int[] arr = { 1,2,4,6,8,56}; System.out.println(fabocciSearch(arr,56)); } //因为是采用斐波那契数列中的值,所以先获取数列 //返回斐波那契数列,用于数组查找 public static int[] fabocci(){ int[] arr = new int[max]; arr[1] = 1; arr[0] = 1; for(int i = 2;i < arr.length;i ++){ arr[i] = arr[i -1] + arr[i - 2]; } return arr; } public static int fabocciSearch(int[] arr,int searchVal){ int left = 0; int right = arr.length - 1; int[] f = fabocci(); int k = 0; int mid = 0; //找到对应的比原始数组长度大的fabocci数组 while ((f[k]) < arr.length){ k ++; } //根据所给的fabocci数将原始数组扩容 int[] temp= Arrays.copyOf(arr,f[k]); //为什么是扩容成f(k)? //因为是将整个数组长度变成斐波那契数列,f(k) = f(k - 1) + f(k - 2); //>>f(k) - 1 = f(k -1) - 1 + f(k - 2) - 1 + (mid)1 //根本上还是扩容成f(k) //将扩容的部分全部变成最大值 for (int i = arr.length;i < temp.length;i ++){ temp[i] = arr[arr.length - 1]; } //生成对应的重点进行比较 while (left <= right){ mid = left + f[k - 1] - 1; //f(k) - 1 = f(k -1) - 1 + f(k - 2) - 1 + (mid)1 //由mid1区分f(k -1) - 1 和f(k - 2) - 1 两者 if (searchVal < temp[mid]){ right = mid - 1; k --; }else if(searchVal > temp[mid]){ left = mid + 1; k -= 2; }else{ //因为在比较的时候,用的是temp而不是arr. //虽然二者的索引值是相同的,但是他们的长度不一样,最大值的做因可能是很多种情况 if (mid < arr.length - 1){ return mid; }else{ return arr.length - 1; } } } return -1; }}
转载地址:http://fqgpb.baihongyu.com/