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

2021-10-04 19:28:40 字數 871 閱讀 7784

面試問到的一道題目:

主要步驟:

一、使用乙個大小為一百萬零一的整數陣列來構建堆(堆的下標從1開始)

二、從檔案中讀取前一百萬個數,每讀入乙個數,呼叫函式,保持其最小堆的性質,堆的根永遠是堆中最小的元素。

三、從一百萬零乙個數開始,每讀入乙個數開始,比較這個數與堆的根比較,如果比根大,就用這個數替換掉根,呼叫函式,保持最小堆性質。

時間複雜分析:

先取出前100個數,維護乙個100個數的最小堆,遍歷一遍剩餘的元素,在此過程中維護堆就可以了。具體步驟如下: 

step1:取前m個元素(例如m=100),建立乙個小頂堆。保持乙個小頂堆得性質的步驟,執行時間為o(lgm);

建立乙個小頂堆執行時間為m*o(lgm)=o(m lgm);       

step2:順序讀取後續元素,直到結束。每次讀取乙個元素,如果該元素比堆頂元素小,直接丟棄 

如果大於堆頂元素,則用該元素替換堆頂元素,然後保持最小堆性質。最壞情況是每次都需要替換掉堆頂的最小元素,因此需要維護堆的代價為(n-m)*o(lgm); 

最後這個堆中的元素就是前最大的10w個。時間複雜度為o(n lgm)。

快排的思想:

根據快速排序劃分的思想

(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個數為止。

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

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

C 生成100 不重複的隨機數

方法1 思想是用乙個陣列來儲存索引號,先隨機生成乙個陣列位置,然後把這個位置的索引號取出來,並把最後乙個索引號複製到當前的陣列位置,然後使隨機數的上限減一,具體如 先把這100個數放在乙個陣列內,每次隨機取乙個位置 第一次是1 100,第二次是1 99,將該位置的數用最後的數代替。int index...

java實現100個不重複隨機數

前幾天,做了這個題目。發現實現起來有不同的路子。1.是隨便對int陣列內的數進行調換。2.是建立兩個陣列,乙個是1 100,另乙個從其中隨機取值。這裡可以設定乙個end變數記錄取值長度。1.public class randomarr for int i 0 i 100 i 2.public cla...