二分法搜尋並不是什麼很高深的演算法,任何時候需要編寫乙個這樣的演算法恐怕都不是難事,甚至c++標準庫里已經有相關數但是當現在的我看到二分法搜尋的**仁需要想一想是否確實是這樣寫的時候,我就知道我應該要寫一篇這樣的總結,把我對二法這個說難不難的問題梳理歸納一下,這樣即使以後忘記了也能夠比較完整地回憶起這方面的內容。
分法檢索的目的一般有兩個,乙個是判斷某數是否存在與乙個有序數列之中(包括單調函式列),另乙個是得到數列中第乙個大於等於這個數或第乙個小於等於這個數的數的索引一般來講,第二個目的要求要更高一些 ;
下面是我對兩種二分檢索的歸納:
#include using namespace std;
//先寫滿足第乙個目的的:
bool binary_search_1(int a, int left, int right, int key)
return false; //也可以是 return 0;
} /*
注意: 1.其實right = mid 也可以,而且while判斷用 (left < right)就足夠了(加=也可)
2.用 right = mid - 1 效率稍高一點點,但是要和 while (left <= right)搭配
3.千萬不要用left = mid,否則容易陷入死迴圈 ;
*/ //再寫滿足第二個目的的:
int binary_search_2(int a, int left, int right, int key)
return left;
} /*
注意: 1.這裡一定要用right = mid;(不可以用right = mid - 1);
2.最後一行用 return left 返回第乙個大於等於的數的索引,也就是upper_bound;
3.如果用 return left - 1 則返回第乙個小於等於的索引,也就是lower_bound;
*/ int main()
最優二分檢索樹
前面給出了二分檢索樹的定義,下圖給出了關於保留字的乙個子集的兩棵二分檢索樹。為了確定識別符號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...
二分檢索的多種應用
其實,二分法真的不那麼簡單,尤其是二分法的各個變種。最最簡單的二分法,就是從乙個排好序的陣列之查詢乙個key值。如下面的程式 int search int arr,int n,int key return 1 這個程式,相信只要是乙個合格的程式設計師應該都會寫。稍微注意一點,每次移動left和rig...