一億數據獲取最大值的前100位

兩種思路:

1. 根據快速排序劃分的思想 

a. 假設數組爲 array[N] (N = 1 億),首先利用quicksort的原理把array分成兩個部分,左邊部分比 array[N - 1] (array中的最後一個值,即pivot) 大, 右邊部分比pivot 小。然後,可以得到 array[array.length - 1] (即 pivot) 在整個數組中的位置,假設是 k.
b. 如果 k 比 99 大,我們在數組[0, k - 1]裏找前 100 最大值。 (繼續遞歸)
c. 如果 k 比 99 小, 我們在數組[k + 1, ..., N ]裏找前 100 - (k + 1) 最大值。(繼續遞歸)
d. 如果 k == 99, 那麼數組的前 100 個值一定是最大的。(退出)

2.先取出前100個數,維護一個100個數的最小堆,遍歷一遍剩餘的元素,在此過程中維護堆就可以了。具體步驟如下: 
step1:取前m個元素(例如m=100),建立一個小頂堆。保持一個小頂堆得性質的步驟,運行時間爲O(lgm);建立一個小頂堆運行時間爲m*O(lgm)=O(m lgm);       
step2:順序讀取後續元素,直到結束。每次讀取一個元素,如果該元素比堆頂元素小,直接丟棄 
如果大於堆頂元素,則用該元素替換堆頂元素,然後保持最小堆性質。最壞情況是每次都需要替換掉堆頂的最小元素,因此需要維護堆的代價爲(N-m)*O(lgm); 

最後這個堆中的元素就是前最大的10W個。時間複雜度爲O(N lgm)。 


兩種思路比較:

基於最小堆方法運行時間很穩定(每次運行時間相差很小),基於quicksort原理的方法運行時間不穩定(每次運行時間相差大)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章