如何從100萬個數中找出最大的前100個數

下面摘自 http://blog.sina.com.cn/s/blog_682686610100xlrr.html

 1. 
算法以下:根據快速排序劃分的思想 
(1) 遞歸對全部數據分紅[a,b)b(b,d]兩個區間,(b,d]區間內的數都是大於[a,b)區間內的數 
(2) 對(b,d]重複(1)操做,直到最右邊的區間個數小於100個。注意[a,b)區間不用劃分 
(3) 返回上一個區間,並返回此區間的數字數目。接着方法仍然是對上一區間的左邊進行劃分,分爲[a2,b2)b2(b2,d2]兩個區間,取(b2,d2]區間。若是個數不夠,繼續(3)操做,若是個數超過100的就重複1操做,直到最後右邊只有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)。 

補充:這個方法的說法也能夠更簡化一些:
假設數組arr保存100個數字,首先取前100個數字放入數組arr,對於第101個數字k,若是k大於arr中的最小數,則用k替換最小數,對剩下的數字都進行這種處理。

3.分塊查找 
先把100w個數分紅100份,每份1w個數。先分別找出每1w個數裏面的最大的數,而後比較。找出100個最大的數中的最大的數和最小的數,取最大數的這組的第二大的數,與最小的數比較。。。。







http://www.cnblogs.com/nzbbody/p/3576894.html給出了另一個思路: 將這100萬的數字,平分爲100份,從每一份中取出最大的100個數字;將這1萬個數字組合在一塊兒,找到最大的100個數。 若是這100萬個數字跨度不大,能夠用位向量結合計數器的方法。
相關文章
相關標籤/搜索