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

查找、AVL樹、散列表

測試 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樹、散列表