在100w個數中找最大的前100個數

2021-06-20 17:46:44 字數 747 閱讀 1111

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)。 

3.分塊查詢 

先把100w個數分成100份,每份1w個數。先分別找出每1w個數裡面的最大的數,然後比較。找出100個最大的數中的最大的數和最小的數,取最大數的這組的第二大的數,與最小的數比較。。。。

100w個數中找出最大的k個數

1.思路1 我們應該首先想到是先將100w個數排序,暫且不考慮效率問題,可是記憶體中能放得下嗎?2.思路2 堆排序,先從中去k個數進行堆排,然後乙個乙個數進行比較替換,每替換一次都得將堆下調一次,去保證堆得特性 函式findmaxknum 倆件事 一 取k個數進行建堆 二 進行資料替換,替換完一次下...

10億資料中取最大的100個資料

思路1 利用堆排序實現 1 取前m個元素 例如m 100 建立乙個小頂堆。保持乙個小頂堆得性質的步驟,執行時間為o lgm 建立乙個小頂堆執行時間為m o lgm o m lgm 2 順序讀取後續元素,直到結束。每次讀取乙個元素,如果該元素比堆頂元素小,直接丟棄。如果大於堆頂元素,則用該元素替換堆頂...

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

10億個浮點數大概佔據3g左右的空間,因此全部一次性讀入記憶體目前在個人pc上是不太現實的。本次討論不考慮記憶體等等,只考慮演算法。如果一次性比較排序,然後輸出前面最大的10w個,那麼眾所周知,演算法的時間複雜度不下於o n lgn 此處的n為數的個數 10億 如果用堆排序,由於堆排序像合併排序而不...