100萬個數中找到最大的100個數

2021-06-26 07:40:32 字數 674 閱讀 5677

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

從100億隨機數中找到前100萬個最大的數

面試問到的一道題目 主要步驟 一 使用乙個大小為一百萬零一的整數陣列來構建堆 堆的下標從1開始 二 從檔案中讀取前一百萬個數,每讀入乙個數,呼叫函式,保持其最小堆的性質,堆的根永遠是堆中最小的元素。三 從一百萬零乙個數開始,每讀入乙個數開始,比較這個數與堆的根比較,如果比根大,就用這個數替換掉根,呼...

海量資料找到最大的100個資料

海量資料指的是資料量非常大,億級的資料。如果是 int 型資料,int型陣列佔4個位元組的記憶體,1億個int型資料就得占用近400m的記憶體,計算機效能差的話很難一次性讀入然後排序。所以一般的靠排序來做這道題是很尷尬的。這裡用最小堆來解決,上篇講了大頂堆的原理及大頂堆的排序,這裡由於是找最大的10...

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

1.演算法如下 根據快速排序劃分的思想 1 遞迴對所有資料分成 a,b b b,d 兩個區間,b,d 區間內的數都是大於 a,b 區間內的數 2 對 b,d 重複 1 操作,直到最右邊的區間個數小於100個。注意 a,b 區間不用劃分 3 返回上乙個區間,並返回此區間的數字數目。接著方法仍然是對上一...