其實,二分法真的不那麼簡單,尤其是二分法的各個變種。 最最簡單的二分法,就是從乙個排好序的陣列之查詢乙個key值。 如下面的程式:
int search(int *arr, int n, int key)
return -1;
}
這個程式,相信只要是乙個合格的程式設計師應該都會寫。 稍微注意一點, 每次移動left和right指標的時候,需要在mid的基礎上+1或者-1, 防止出現死迴圈, 程式也就能夠正確的執行。
但如果條件稍微變化一下, 你還會寫嗎?如,陣列之中的資料可能可以重複,要求返回匹配的資料的最小(或最大)的下標;更近一步, 需要找出陣列中第乙個大於key的元素(也就是最小的大於key的元素的)下標,等等。 這些,雖然只有一點點的變化,實現的時候確實要更加的細心。 下面列出了這些二分檢索變種的實現。
1. 找出第乙個與key相等的元素
int searchfirstequal(int *arr, int n, int key)
if( left < n && arr[left] == key) return left;
return -1;
}
2. 找出最後乙個與key相等的元素
int searchlastequal(int *arr, int n, int key)
if( right>=0 && arr[right] == key) return right;
return -1;
}
3. 查詢第乙個等於或者大於key的元素
int searchfirstequalorlarger(int *arr, int n, int key)
return left;
}
4. 查詢第乙個大於key的元素
int searchfirstlarger(int *arr, int n, int key)
return left;
}
5. 查詢最後乙個等於或者小於key的元素
int searchlastequalorsmaller(int *arr, int n, int key)
return right;
}
6. 查詢最後乙個小於key的元素
int searchlastsmaller(int *arr, int n, int key)
return right;
}
很多的時候,應用二分檢索的地方都不是直接的查詢和key相等的元素,而是使用上面提到的二分檢索的各個變種,熟練掌握了這些變種,當你再次使用二分檢索的檢索的時候就會感覺的更加的得心應手了。 二分檢索歸納
二分法搜尋並不是什麼很高深的演算法,任何時候需要編寫乙個這樣的演算法恐怕都不是難事,甚至c 標準庫里已經有相關數但是當現在的我看到二分法搜尋的 仁需要想一想是否確實是這樣寫的時候,我就知道我應該要寫一篇這樣的總結,把我對二法這個說難不難的問題梳理歸納一下,這樣即使以後忘記了也能夠比較完整地回憶起這方...
最優二分檢索樹
前面給出了二分檢索樹的定義,下圖給出了關於保留字的乙個子集的兩棵二分檢索樹。為了確定識別符號x是否在一棵二分檢索樹中出現,將x先與根比較,如果x比根中識別符號小,則檢索在左子樹中繼續 如果x等於根中識別符號,則檢索成功地終止 否則檢索在右子樹中繼續下去。上述步驟可以形式化為過程search。line...
演算法 二分檢索總結
演算法正確性證明 檢驗到引數的每類取值 檢驗演算法的每個分支 演算法所需空間 對於含有n個內節點的二元樹,證明e 2n 1。其中e,i分別為外部和內部路徑長度。當n 1時,e 2,i 0,所以e n i n 2n成立 不妨假設 e k i k 2k成立 當n k 1時,不妨對二元樹中h級的葉子節點x...