二分檢索的多種應用

2021-07-04 06:12:43 字數 1401 閱讀 1024

其實,二分法真的不那麼簡單,尤其是二分法的各個變種。 最最簡單的二分法,就是從乙個排好序的陣列之查詢乙個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...