中位數之第K小的線性選擇算法

   1973年,Blum、Floyd等幾位大仙合併一體,寫了一篇題爲 “Time bounds for selection” 的章,給出了一種在數組中選出第k小元素的算法,俗稱"中位數之中位數算法"。該算法從理論上保證了最壞情形下的線性時間複雜度(O(n))。而一個簡單的排序算法像快速排序的時間複雜度是O(nlogn),利用類似於快速排序的做法是:首先對該無序數組進行排序(O(nlogn)),然後進行一次遍歷(O(k))就可以找到第k小元素。下面我們來重點看看中位數排序法。


   該算法使用分而治之的策略,查找到第K小元素在最壞情況下的時間複雜度爲O(n)。


   實現該算法的步驟如下:


    1.如果n是一個比較小的數,比如n<6,那麼只需要對此無序數組進行排序後,即可很容易的得到第K小元素。

此時約束時間T=7。

    2.如果n>5,那麼我們將這個無序數組分成五組。此時約束時間T=n/5。

    3.找出每組的中位數,構成集合M。此時的約束時間T=7n/5.

    4.遞歸的調用selection(M,|M|/2)算法查找上一步中所有中位數的中位數,設爲m。此時的約束時間

T=T(n/5)。

    5.用m來分割此時的數組,比較m與其他的(n-1)個數,小於m的數置於左集合L,大於m的數置於右集合R。當

然,中位數m的下標r=|L|+1(|L|是左集合L的個數)。此時的約束時間T=T(n)。


    如果r=k,那麼返回m。

    如果r<k,那麼在小於m的左集合L中遞歸查找第K小數。

    如果r>k,那麼在大於m的右集合R中遞歸查找第K小數。


遞歸方程:T(n)=O(n) + T(n/5) + T(7n/10) (證明過程略)

如果你想知道怎樣得到次方程的,不妨找一本關於算法的書看一看或直接給我留言,謝謝!


    另外,我想說的是:我爲什麼分爲五組而不是分爲其他的組。

    假設我們將此數組分爲三組,那麼有:T(n) = O(n) + T(n/3) + T(2n/3) so T(n) > O(n)。如果我

們將此數組分成五組以上,那麼就會顯得有些麻煩了,所以分爲五個組是最理性的選擇。


    由於鄙人的翻譯水平所致,文中不妥之處還望各位指出來,謝謝!


發佈了23 篇原創文章 · 獲贊 11 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章