二分检索
現在理論的還是少說些,例子更能理解吧,來個例子用二分檢索算法設計與分析,下面算法函數過程bin_search有n+2個輸入:a,n 和 x,一個輸出j。只要待檢索的元素存在,while循環就繼續下去。case語句根據compare(x,a[mid])的結果的三種情況進行選擇運行。函數過程結束時,如果x不在表a中,則j=0,否則 a(j)=x。
void bin_search(elemType a[],int n,elemType x,int &j) { //給定一個按非遞減排列的元素數組a(1:n),n>1,判斷x是否出現。 //若是,則置j,使得x=a(j),若非,則j=0。函數返回j。 int low,high,mid; low=1;high=n;j = 0; while(low<=high) { mid = (low + high) / 2; //mid取不大于(low + high)÷2的整數。 switch(compare(x,a[mid])) { case ‘<’ : high = mid -1;break; //x小于a[mid] case ‘>’ : low = mid +1;break; //x大于a[mid] case ‘=’ : j = mid;return j;break; //x等于a[mid] }//switch }//while return j; }//bin_search
判斷bin_search是否為一個算法,除了上面的描述外,還必須使函數compare(x,a[mid])具有恰當的定義。如果a的元素是整數,實數或字符串,則這些比較運算都可用適當的指令正確完成的。另外,還需判斷bin_search是否能終止。關于這一點留待證明算法正確性時回答,但是關于程序正確性的證明,至今為止還是一個尚未解決的課題。
bin_search需要的空間很容易確定,它要用n個單元存放數組a[],還要有存放變量low、high、mid、x和j的5個空間單元。因此所需的空間單元是n+5。至于它的計算時間,則要分別考慮最好、平均和最壞三種情況。
下面述說那幾個定理吧。
(1)函數過程bin_search(a[],n,x,j)能正確地運行。
(2)若n在區域[2k-1,2k]中,則對于一次成功的檢索,bin_search至多作k次比較;而對于一次不成功的檢索,或者作k-1次比較或者作k次比較。這個說明:
最壞情況下的成功或不成功檢索的計算時間都是О(log2n);
最好情況下的成功檢索在1級結點處達到,計算時間為Θ(1);
最好情況下的不成功檢索要作log2n次元素比較,所以計算時間是Θ(log2n)。
由于外部結點都在k和k+1級,因此每種不成功檢索的時間都為Θ(log2n),故
平均情況下不成功檢索的計算時間為Θ(log2n),記為U(n)。
(3)?設A(l:n)含有n(≥1)個不同的元素,且A(1)<A(2)<…<A(n)。又設用以比較為基礎的判斷x是否在A(l:n)出現的任何算法在最壞情況下所需的最小比較次數是FIND(n),那么, FIND(n)≥「log2(n+1)」。
關于這個真的是好難呀,筆者覺得要在實踐的基礎上,練習,加上理論才能深刻了解,在此只是簡約的總結一下二分檢索的相關知識。
?
?
轉載于:https://www.cnblogs.com/lihuidashen/p/3414970.html
總結
- 上一篇: HashMap和Hashtable的区别
- 下一篇: 如何在Access中参数化日期类型,以解