斐波那契查找法
来源:互联网 发布:java框架cs通讯 编辑:程序博客网 时间:2024/06/15 08:07
不同于二分查找的对半切割,斐波那契查找法(Fibonacci Search)是以斐氏级数的方式对排序范围进行切割。
斐氏级数即斐波那契数列:
F(0)=F(1)=1,
F(i)=F(i-1)+F(i-2), i>=2
该数列越往后相邻两个数值的比值越接近黄金比例值(0.618)。斐波那契查找法主要步骤为:
1.类比二分查找,在斐波那契数列里找一个等于略大于查找表中元素个数的数F(n),将原查找表的长度扩展为F(n),补充元素时重复补充最后一个元素。
2.进行斐波那契分割,即F(n)分割为两部分元素:F(n-1)个和F(n-2)个。
3.找出要查找的元素在哪个部分并递归,直至找到为止。
Java实现代码如下:
package test.algorithm.FastSlowPointer;/** * 斐波那契查找(黄金分割法查找) * */public class FibonacciSearch { public final static int MAXSIZE = 20; /** * 斐波那契数列 * @return */ public static int[] fibonacci(){ int[] f = new int[20]; int i =0; f[0] = 1; f[1] = 1; for(i=2;i<MAXSIZE;i++){ f[i] = f[i-1]+f[i-2]; } return f; } public static int fibonacciSearch(int[] data,int key){ int low = 0; int high = data.length-1; int mid = 0; //斐波那契分割数值下标 int k = 0; //序列元素个数 int i=0; // 获取斐波那契数列 int[] f = fibonacci(); //获取斐波那契分割数值下标 while(data.length>f[k]-1){ k++; } //创建临时数组 int[] temp = new int[f[k]-1]; for(int j=0;j<data.length;j++){ temp[j] = data[j]; } //序列补充至f[k]个元素 //补充的元素值为最后一个元素的值 for(i=data.length;i<f[k]-1;i++){ temp[i]=temp[high]; } for(int j:temp){ System.out.print(j+" "); } System.out.println(); while( low <= high ) { // low:起始位置 // 前半部分有f[k-1]个元素,由于下标从0开始 // 则-1 获取 黄金分割位置元素的下标 mid = low + f[k-1] - 1; if( temp[mid] > key ) { // 查找前半部分,高位指针移动 high = mid - 1; // (全部元素) = (前半部分)+(后半部分) // f[k] = f[k-1] + f[k-1] // 因为前半部分有f[k-1]个元素,所以 k = k-1 k = k - 1; }else if( temp[mid] < key ) { // 查找后半部分,高位指针移动 low = mid + 1; // (全部元素) = (前半部分)+(后半部分) // f[k] = f[k-1] + f[k-1] // 因为后半部分有f[k-1]个元素,所以 k = k-2 k = k - 2; }else{ //如果为真则找到相应的位置 if( mid <= high ) { return mid; }else{ //出现这种情况是查找到补充的元素 //而补充的元素与high位置的元素一样 return high; } } } return -1; } public static void main(String[] args) { int[] f = fibonacci(); for(int i:f){ System.out.print(i+" "); } System.out.println(); int[] data = {1, 5, 15, 22, 25, 31, 39, 42, 47, 49, 59, 68, 88}; int search = 39; int position = fibonacciSearch(data,search); System.out.println("值"+search+"的元素位置为:"+position); }}
0 0
- 斐波那契查找法
- 斐波那契查找法
- 斐波那契查找法
- 斐波那契查找法
- 斐波那契查找(黄金分割法查找)
- 查找——斐波那契查找法
- 查找-斐波那契查找
- 算法--查找--斐波那契查找
- 斐波那契查找
- 斐波那契查找
- 斐波那契查找
- 斐波那契查找
- 斐波那契查找
- 斐波那契查找
- 斐波那契查找
- 斐波那契查找
- 斐波那契查找
- 斐波那契查找
- 数据导入和导出的几种方法
- Json
- 利用颜色索引,判断from变化检测
- HDU 3582 BFS
- App的解析
- 斐波那契查找法
- 使用WebView中的JavaScript调用Android方法
- mysql数据表字段与系统关键字重名的问题
- Clouda框架环境搭建
- mysql的update的问题
- Loading...
- 复制表结构及数据
- "Activity"-安卓面试必问技能点大总结"
- js浮点数运算