package search;
import java.util.Arrays;
/**
* @author chenyi
* @Description 斐波那契查找
* @date 2022/2/16 15:54
*/
public class FibonacciSearch {
private int maxSize = 20;
public int[] fib() {
int[] arr = new int[maxSize];
arr[0] = 1;
arr[1] = 1;
for (int i = 2; i < maxSize; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr;
}
public int search(int[] arr, int key) {
// 先生成斐波那契数组
int[] fib = fib();
int k = 0;
while (fib[k]-1 < arr.length) {
k++;
}
// 创建临时数组,并填补空白
int[]temp = Arrays.copyOf(arr, fib[k]-1);
for (int i = arr.length; i < temp.length; i++) {
temp[i] = arr[arr.length-1];
}
int low = 0;
int high = arr.length-1;
while(low<=high) {
int m = low+fib[k-1]-1;
if(temp[m]>key) {
// key值比较小,从左边找
high = m-1;
// 斐波那契变为小的那一段
k-=2;
}else if(temp[m]<key) {
// key值比较大,从右边找
low = m+1;
// 斐波那契变为大的那一段
k--;
} else {
return m>high?high:m;
}
}
return -1;
}
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int idx = new FibonacciSearch().search(arr, 9);
System.out.println(idx);
}
}
斐波那契查找
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 查找概念 查找(Searching): 即根据给定的某个值,在查找表中确定一个其关键字给定值的数据元素(或记录)。...
- 除了排序,查找指定值也是常见的功能,所以非常有必要掌握一下相关算法。经典查找算法有顺序查找、二分查找、差值查找、斐...
- 查找算法: 静态查找:数据集合稳定,不需要添加、删除元素的查找操作 动态查找:数据集合在查找的过程中需要同时添加或...
- 一、插值查找 原理 在介绍插值查找之前,首先考虑一个新问题,为什么二分查找算法一定要是折半,而不是折四分之一或者折...