1. 程式人生 > >Top K問題-BFPRT演算法、Parition演算法

Top K問題-BFPRT演算法、Parition演算法

BFPRT演算法原理

在BFPTR演算法中,僅僅是改變了快速排序Partion中的pivot值的選取,在快速排序中,我們始終選擇第一個元素或者最後一個元素作為pivot,而在BFPTR演算法中,每次選擇五分中位數的中位數作為pivot,這樣做的目的就是使得劃分比較合理,從而避免了最壞情況的發生。演算法步驟如下

1. 將  n 個元素劃為  \lfloor n/5\rfloor 組,每組5個,至多隻有一組由  n\bmod5 個元素組成。 
2. 尋找這  \lceil n/5\rceil 個組中每一個組的中位數,這個過程可以用插入排序。 
3. 對步驟2中的  \lceil n/5\rceil
 箇中位數,重複步驟1和步驟2,遞迴下去,直到剩下一個數字。 4. 最終剩下的數字即為pivot,把大於它的數全放左邊,小於等於它的數全放右邊。 
5. 判斷pivot的位置與k的大小,有選擇的對左邊或右邊遞迴。

求第 k 大就是求第 n-k+1 小,這兩者等價。

 

基於Partition演算法

  • 選擇一個Position(稱為基準),基於該演算法的Top k演算法,非常受Position好壞的影響,所謂的壞,有可能使時間複雜度達到O(n*n)。
  • 然後利用Partition演算法進行劃分,如果Partition得到的p小於K,則繼續劃分p的右邊,如果p大於K,則繼續劃分p的左邊,如果p等於K,則演算法結束。


作者:遠o_O
連結:https://www.jianshu.com/p/495e5019669c
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。