1-斐波那契查找算法思想
这个算法不是很懂!需要再补充!(未完成)
思想比较
- 二分查找过程中,mid= left + (left + right) / 2
- 插值查找过程中,引入了比例因素,
mid = left + [(key - arr[left])/(arr[high] - arr[left])](high - left)
斐波那契查找算法mid计算是通过下面公式实现的
mid = left + fibList[fibIndex - 1] - 1;
可以使每一次的查询都接近黄金分割比
2-代码实现
package select;
import java.util.Arrays;
public class FibonacciSearch {
private static int length = 20;
public static void main(String[] args) {
int[] arr = {1, 8, 10, 89, 1000, 1234};
int findIndex = fibSearch(89, arr);
System.out.println(findIndex);
}
// 生成一个斐波那契数列,后续寻找mid分割点时使用
public static int[] createFibList() {
int[] fib = new int[length];
fib[0] = 1;
fib[1] = 1;
for (int i = 2; i < length; i++){
fib[i] = fib[i-1] + fib[i-2];
}
return fib;
}
public static int fibSearch(int keyValue,int[] arr){
int right = arr.length -1;
int left = 0;
int fibIndex = 0; // 斐波那契数列下标
int mid = 0; // 中间索引
int[] fibList = createFibList(); // 斐波那契数列
while (right > fibList[fibIndex] - 1){ // 找到在createFibList创建的方法中,需要截取到哪些
fibIndex++;
}
int[] temp = Arrays.copyOf(arr, fibList[fibIndex]); // 新创建的数组
// 元素进行填充
for (int i = right +1; i < temp.length; i++){
temp[i] = arr[right];
}
while (left <= right){
mid = left + fibList[fibIndex - 1] - 1; // 更新mid值
if (keyValue < temp[mid]){ // 如果查找的key在mid的左边
right = mid - 1; // 更新right
fibIndex--; // 更新mid
}else if (keyValue > temp[mid]){ // 如果查找的key在mid的右边
left = mid + 1;
fibIndex -= 2;
}
else { // 找到了mid,此时就是keyValue,但是这时无法保证此时的mid在数组中存在
if (mid <= right){
return mid;
}else {
return right;
}
}
}
return -1; // 找不到
}
}