談從10億個數中找出前10萬個最大的

2021-06-22 06:05:14 字數 657 閱讀 9353

10億個浮點數大概佔據3g左右的空間,因此全部一次性讀入記憶體目前在個人pc上是不太現實的。本次討論不考慮記憶體等等,只考慮演算法。

如果一次性比較排序,然後輸出前面最大的10w個,那麼眾所周知,演算法的時間複雜度不下於o(n lgn),此處的n為數的個數(10億)。

如果用堆排序,由於堆排序像合併排序而不像插入排序,堆排序的執行時間為o(n lgn);又想插入排序而不像合併排序,堆排序是一種原地排序。因此堆排序具有相對小的執行時間和占用相對小的額外空間的優點。

再則,利用最小堆的性質,堆頂元素是整棵樹中具有最小值的元素,因此,我們可以構建這樣的乙個最小堆:

step1:取前m個元素(例如m=10萬),建立乙個小頂堆

保持乙個小頂堆得性質的步驟,執行時間為o(lgm);

建立乙個小頂堆執行時間為m*o(lgm)=o(m lgm);

其實建立乙個小頂堆實際執行時間為o(m);具體分析參考演算法導論。

step2:順序讀取後續元素,直到結束

每次讀取乙個元素,如果該元素比堆頂元素小,直接丟棄

如果大於堆頂元素,則用該元素替換堆頂元素,然後保持最小堆性質

最壞情況是每次都需要替換掉堆頂的最小元素,因此需要維護堆的代價為(n-m)*o(lgm);

最後這個堆中的元素就是前最大的10w個。

時間複雜度為o(n lgm)。

(演算法)從10000個數中找出最大的10個

從10000個整數中找出最大的10個,最好的演算法是什麼?演算法一 氣泡排序法 千里之行,始於足下。我們先不說最好,甚至不說好。我們只問,如何 從10000個整數中找出最大的10個 我最先想到的是用氣泡排序的辦法 我們從頭到尾走10趟,自然會把最大的10個數找到。方法簡單,就不再這裡寫 了。這個演算...

10 億個數取中位數

10 億個數取中位數 1 取 16 1024 個數,生成乙個 treemap 取得最大值 max 和最小值 min。2 構造乙個1024個元素的計數陣列 t i 對最初的 1024 個數按區間計數 對 min 和 max 進行 1024 個等分,各等分值為 n i 當資料 n a 3 將大於 n 5...

如何從 5 億個數中找出中位數

從 5 億個數中找出中位數。資料排序後,位置在最中間的數就是中位數。當樣本數為奇數時,中位數 n 1 2 當樣本數為偶數時,中位數為 n 2 與 1 n 2 的均值。如果這道題目沒有記憶體大小的限制,則可以把所有的數字排序後找出中位數,但是最好的排序演算法的時間複雜度都是 o nlogn n 為數字...