Algs4-1.4.22斐波那契查找算法(Fibonacci Search)Java 实现
来源:互联网 发布:linux服务器禁用ip 编辑:程序博客网 时间:2024/05/17 22:31
Code of Fiboonacci Search
package sed.algorithm.chapter1.section4;import edu.princeton.cs.introcs.StdOut;public class FibonacciSearch{ private static final int MAXSIZE = 13; public static void fibonacci(int[] f){ f[0] = 1; f[1] = 1; StdOut.print(f[0] + " "); StdOut.print(f[1] + " "); for (int i = 2; i < MAXSIZE; i++) { f[i] = f[i-1] + f[i-2]; StdOut.print(f[i] + " "); } StdOut.println(); } public static int fibonacci_search(int[] a, int key, int n){ int low = 0, high = n-1; int mid = 0; int k = 0; int[] F = new int[MAXSIZE]; fibonacci(F); while( n > F[k]-1){ //确保fibonacci数列中的值可以表示整个待搜索数组中的位置 ++k; } //将待搜索数组的规模扩展为F[k]-1;原来不足的部分用a[high]填充 int[] tempArray = new int[F[k]-1]; for (int i = n; i < F[k]-1; i++) { tempArray[i] = a[high]; } for (int i = 0; i < n; i++) { tempArray[i] = a[i]; } a = tempArray; //对于规模为F[k]-1的数组 //黄金分割搜索, 每次将数组分为三部分, //第一部分为从low(包含)开始的F[k-1]-1个元素,到mid-1(包含)为止; //第二部分即为单个的a[mid],其中 mid = low+F[k-1]-1; //第三部分为 从啊mid+1 (包含)开始的F[k-2]-1个元素,到high为止 //每次循环均遵循这一规律 while(low <= high){ mid = low + F[k-1] -1; if (a[mid] > key) { high = mid -1; k = k - 1; }else if (a[mid] < key){ low = mid + 1; k = k - 2; }else{ if (mid <= high) { return mid; }else { return -1; } } } return -1; } public static void main(String[] args) { int[] a = {5,15,19,20,25,31,38,41,45,49,52,55,57}; for (int i = 0; i < a.length; i++) { StdOut.print(a[i] + " "); } StdOut.println(); StdOut.println(fibonacci_search(a,57,13)); }}
Caution:
斐波那契搜索算法的作用的对象一定是F[k]-1规模大小的有序数组
原因:只有这样,每次分割才会分为(F[k-1]-1)+(F[k-2]-1) + 1= F[k] -1 正好为代码注释中所提到的前,后 ,中间元素三部分。初始时填充的元素为有序数组中的最大 值,是为了在不引入新值得同时保持数组的单调性
其分割方法称为黄金分割的原因是当斐波那契数列足够大时,F[k-1]/F[K]的值接近0.618
Reference:http://www.cnblogs.com/cpoint/
Copyright:
Author: vmxplusFrom: http://blog.csdn.net/vmxplus本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
0 0
- Algs4-1.4.22斐波那契查找算法(Fibonacci Search)Java 实现
- 斐波那契查找(Fibonacci Search)
- 斐波那契数列算法 Fibonacci Search 优化二分法查找算法
- 比较二分查找与斐波那契查找(binary search & fibonacci search)
- Java数据结构与算法---斐波那契数列Fibonacci
- 有序表查找_斐波那契(Fibonacci)查找
- Java实现斐波那契数列Fibonacci
- python和Java实现斐波那契Fibonacci数列
- Fibonacci(斐波那契)序列的递归算法
- Fibonacci(斐波那契)数列实现
- 斐波那契 python实现Fibonacci
- mips汇编语言实现Fibonacci(斐波那契)数列
- 用Python实现斐波那契(Fibonacci)函数
- Fibonacci(斐波那契数列)的实现
- 斐波那契数(JAVA实现)--递归中的Fibonacci数列
- 算法1.4背包(algs4)
- 算法--查找--斐波那契查找
- 算法#02--斐波那契Fibonacci数列算法优化
- 虚拟现实(VR)vs增强现实(AR)
- MySQL查看数据库连接数和状态
- sql中的group by 和 having 用法解析
- Dagger 2 入门
- 线索二叉树
- Algs4-1.4.22斐波那契查找算法(Fibonacci Search)Java 实现
- IOS NSDate
- ios NSString format 保留小数点 float double
- 【MFC】如何使编辑框自动滚动到最后一行,就像QQ那样?
- 初学必看的lvs负载均衡教程
- java中collection、map、set、list简介
- 遇见C++ Lambda
- Dell服务器BIOS操作
- MPMoviePlayer浅谈