标签:ret avl code sea 长度 技术 == array str
插值查找是二分查找的改进,斐波那契查找是插值查找的改进。
二分查找:mid=(low+high)/ 2
插值查找:mid=(key-a[low])*(high-low)/ (a[high]-a[low])
斐波那契查找主要思想是只要长度符合斐波那契数列,则该段数字可以用两个子段来分割,F(k)-1=(F[k-1]-1)+(F[k-2]-1),即mid=low+F(k-1)-1
FibonacciSearch查找的实现:
package Fibonacci_Search; //fibonacci数列查找 public class FibonacciSearch { //fibonacci数列 public static int fib(int n) { if(n==0) return 0; if(n==1) return 1; return fib(n-1)+fib(n-2); } //查找 public static int fibonacci_search(int[] arr,int n,int key) { int low=1; //记录从1开始 int high=n; //high不用等于fib(k)-1,效果相同 int mid; int k=0; while(n>fib(k)-1) //获取k值 k++; int[] temp = new int[fib(k)]; //因为无法直接对原数组arr[]增加长度,所以定义一个新的数组 System.arraycopy(arr, 0, temp, 0, arr.length); //采用System.arraycopy()进行数组间的赋值 for(int i=n+1;i<=fib(k)-1;i++) //对数组中新增的位置进行赋值 temp[i]=temp[n]; while(low<=high) { mid=low+fib(k-1)-1; if(temp[mid]>key) { high=mid-1; k=k-1; //对应上图中的左段,长度F[k-1]-1 }else if(temp[mid]<key) { low=mid+1; k=k-2; //对应上图中的右端,长度F[k-2]-1 }else { if(mid<=n) return mid; else return n; //当mid位于新增的数组中时,返回n } } return 0; } public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = {0,1,16,24,35,47,59,62,73,88,99}; int n=10; int key=59; System.out.println(fibonacci_search(arr, n, key)); //输出结果为:6 } }
测试结果:6
标签:ret avl code sea 长度 技术 == array str
原文地址:https://www.cnblogs.com/siyyawu/p/10177054.html