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


 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個最大的數中的最大的數和最小的數,取最大數的這組的第二大的數,與最小的數比較。。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM