查找、AVL樹、散列表
阿新 • • 發佈:2018-12-26
測試 cci println http ner eth 斐波那契查找 新增 插值查找
插值查找是二分查找的改進,斐波那契查找是插值查找的改進。
二分查找: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
查找、AVL樹、散列表