1. 程式人生 > >100億個整數,找出中位數

100億個整數,找出中位數

100億個整數,記憶體足夠,如何找到中位數?記憶體不足,如何找到中位數?

(1)當記憶體足夠時:

採用快排,找到第n大的數。

• 隨機選取一個數,將比它小的元素放在它左邊,比它大的元素放在右邊
• 如果它恰好在中位數的位置,那麼它就是中位數,直接返回
• 如果小於它的數超過一半,那麼中位數一定在左半邊,遞迴到左邊處理(還是第幾大)
• 否則中位數一定在右半邊,根據左半邊的元素個數計算出中位數是右半邊的第幾大(重新算第幾大),然後遞迴到右半邊處理

(2)當記憶體不足時:

分桶法

把所有數劃分到各個小區間,把每個數對映到對應的區間裡,對每個區間中數的個數進行計數,數一遍各個區間,看看中位數落在哪個區間,若夠小,使用基於記憶體的演算法,否則繼續劃分。

比如數是32位的,根據每個整數的二進位制前5位,劃分為32個桶,把數放進對應桶中。如果該桶放不下,繼續劃分,直至記憶體可以放心為止。統計每個桶中元素個數,算出中位數一定出現在哪個桶中,而且計算出是該桶中的第幾大。