package com.datastructure.searchalgorithm;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 斐波那契查找算法(黄金分割查找算法)
*/
public class Fibonacci {
public static void main(String[] args) {
int[] arr = {1,2,3,19,29,39,49,59,59};
List<Integer> position = fibonacci(arr,59);
System.out.println(position);
}
//首先获得斐波那契数组
public static int[] fib(int maxSize){
int[] arr = new int[maxSize];
arr[0] = 1;
arr[1] = 1;
for (int i = 2; i <arr.length ; i++) {
arr[i] = arr[i-1] + arr[i-2];
}
return arr;
}
//斐波那契查找算法(黄金分割查找算法)mid = low+f[k-1]-1
public static List<Integer> fibonacci(int[] arr, int key){
int low = 0;
int high = arr.length-1;
//分割点
int k = 0;
int[] arrFib = fib(arr.length);
//找K值,使得f[k]-1>=high
while (high>arrFib[k]-1){
k++;
}
//但是 f[k]-1 可能大于数组的长度,所以我们构建一个新的数组,指向temp[],
int[] temp = Arrays.copyOf(arr,arrFib[k]);
//所以需要给数组补充长度,有high值补充
for (int i = high+1; i <temp.length ; i++) {
temp[i] = high;
}
//使用while循环来找到我们的key
while (low<=high){
int mid = low + arrFib[k-1]-1;
if (key<temp[mid]){
high = mid-1;
k--;
}else if(key>temp[mid]){
low = mid+1;
k-=2;
}else {
List<Integer> list = new ArrayList<>();
if (mid<=high){
int index = mid - 1;
while (index>=0&&arr[index]==arr[mid]){
list.add(index);
index--;
}
list.add(mid);
index = mid + 1;
while (index<=high && arr[index]==arr[mid]){
list.add(index);
index++;
}
}else {
list.add(high);
}
return list;
// if (mid<=high){
// return mid;
// }else {
// return high;
// }
}
}
//没有找到返回-1
return new ArrayList<>();
}
}
斐波那契查找算法(黄金分割查找算法)
最新推荐文章于 2023-07-31 07:00:00 发布