码迷,mamicode.com
首页 > 编程语言 > 详细

斐波那契查找 java

时间:2020-10-09 20:41:20      阅读:21      评论:0      收藏:0      [点我收藏+]

标签:while   下标   填充   lse   n+1   index   ram   param   static   

/*
* 斐波那契思路(黄金比例):
* 首先斐波那契为 1 1 2 3 5 8 13 21 34 55.。。 第个数开始,等于前面2个数的和。而且n/n+1无限接近与0.618
* f[i] = f[i-1] + f[i-2]
* */


import java.util.Arrays;

public class FibonacciSearch {
public static int maxSize = 20;
public static void main(String[] args) {
int []arr = {1,8,11,89,1000,4002};
System.out.println("index = " + fibSearch(arr,89));
}

//后面需要 mid = low +F(k-1)-1,需要使用到斐波那契,因此先获取该数列
public static int[] fib(){
int [] f = new int[maxSize];
f[0] = 1;
f[1] = 1;
for (int i = 2; i < maxSize; i++) {
f[i] = f[i-1] + f[i-2];

}
return f;

}

/**
* @param a 数组
* @param key key 查找的关键字
* @return
*/
//查找算法
public static int fibSearch(int[] a , int key) {
int low = 0;
int high = a.length - 1;
int k = 0;//表示斐波那契下标
int mid = 0;
int f[] = fib();//获取数列
//获取下标
while (high > f[k] - 1) {
k++;

}

//因为f[k]值可能大于a的长度,一次需要i使用Arrays类,构建一个新的数组,指向阿【】
//不足的部分使用0填充
int[] temp = Arrays.copyOf(a, f[k]);
//实际上需求使用a数组最后的填充temp
for (int i = high + 1; i < temp.length; i++) {
temp[i] = a[high];
}

//使用while循环处理,找到key值
while (low <= high) {
mid = low + f[k - 1] - 1;
if (key < temp[mid]) {//应该向左边查找
high = mid - 1;
k--;
} else if (key > temp[mid]) {//应该向右边查找
low = mid + 1;
k -= 2;
} else {
if(mid <= high){
return mid;
} else {
return high;
}
}

}

return -1;
}
}

斐波那契查找 java

标签:while   下标   填充   lse   n+1   index   ram   param   static   

原文地址:https://www.cnblogs.com/liang-shi/p/13783234.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!