每天一個知識點:分治算法:選擇問題

選擇問題的要求是找出含有 N 個元素的表 S 中的第 k 個最小的元素。

基本的算法是簡單的遞歸策略。設 N 大于截止點(cutoff point),在截止點后元素將進行簡單的排序,v 是選出的一個元素,叫做樞紐元(pivot)。其余的元素被放在兩個集合 S_1S_2 中。S_1含有那些不大于 v 的元素,而 S_2則包含那些不小于 v 的元素。

為了得到一個線性算法,必須保證子問題只是原問題的一部分,而不僅僅只是比原問題少幾個元素。這里要解決問題就是如何花費更少的時間來尋找樞紐元。

為得到一個好的最壞情形,關鍵想法是再用一個間接層。不是從隨機元素的樣本中找出中項,而是從中項的樣本中找出中項。

基本的樞紐元選擇算法如下:

  1. 把 N 個元素分成 「N/5」組,5 個元素一組,忽略(最多 4 個)剩余的元素。
  2. 找出每組的中項,得到「N/5」個中項的表 M。
  3. 求出 M 的中項,將其作為樞紐元 v 返回。

上面給出的樞紐元選擇法,有一個專業(yè)的術語,叫做“五分化中項的中項”?!拔宸只许椀闹许棥北WC每個遞歸子問題的大小最多是原問題的大約 70%。對于整個選擇算法,樞紐元可以足夠快的算出,以確保 O(N) 的運行時間。

定理:使用“五分化中項的中項”的快速選擇算法的運行時間為 O(N)。

降低比較的平均次數(shù)

分治算法還可以用來降低算法預計所需要的比較次數(shù)。

設有 N 個數(shù)的集合 S 并且要尋找其中第 k 個最小的數(shù) X。我們選擇 S 的子集 S‘,令 δ 是某個數(shù),使得計算過程所用的平均比較次數(shù)最小化。

找出 S’ 中第 (v_1 = ks/N-δ) 個和第 v2 = ks/N+δ 個最小的元素,幾乎可以肯定 S 中的第 k 個元素將落在 v_1v_2 之間,此時,問題變成了 2δ 個元素的選擇問題。

經過分析,會發(fā)現(xiàn),若 s\;=\;N^\frac23\;\log\left(\frac13\right)\;N\delta\;=\;N^\frac13\;\log\left(\frac23\right)\;N,則期望的比較次數(shù)為 N+k+O(N^\frac23\;\log\left(\frac13\right)\;N),除低次項外它是最優(yōu)的。(如果 k>N/2,那么我們可以考慮查找第(N-k)個最大元素的對稱問題。)

最后一項代表進行兩次選擇以確定 v_1v_2 的代價。假設采用合理聰明的策略,則劃分的平均代價等于 N 加上 v_2 在 S 中的期望階(expected rank),即 N+k+O(Nδ/s)。如果第 k 個元素在 S‘ 中出現(xiàn),那么代價就是 O(N)。然而,s 和 δ 已經被選取以保證這種情況以非常低的概率 o(1/N) 發(fā)生,因此該可能性的期望代價是 o(1),當它的 N 越來越大時趨向于 0。

這個分析指出,找出中項平均大約需要 1.5N 次比較。當然,該算法為計算 s 需要浮點運算,這在一些機器上可能使該算法減慢速度。不過即使是這樣,若能正確實現(xiàn),則該算法完全能夠比得上快速選擇實現(xiàn)方法。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容