1. 程式人生 > >查詢、AVL樹、散列表

查詢、AVL樹、散列表

插值查詢是二分查詢的改進,斐波那契查詢是插值查詢的改進。

二分查詢: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