思路1:利用堆排序實現
(1)取前m個元素(例如m=100),建立乙個小頂堆。保持乙個小頂堆得性質的步驟,執行時間為o(lgm);建立乙個小頂堆執行時間為m*o(lgm)=o(m lgm);
(2)順序讀取後續元素,直到結束。每次讀取乙個元素,如果該元素比堆頂元素小,直接丟棄。如果大於堆頂元素,則用該元素替換堆頂元素,然後保持最小堆性質。最壞情況是每次都需要替換掉堆頂的最小元素,因此需要維護堆的代價為(n-m)*o(lgm);最後這個堆中的元素就是10億個資料中最大的100個。時間複雜度為o(n lgm)。』
思路2:根據快速排序劃分的思想
(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個數為止。
思路3:分塊查詢
先把10億個數分成100份,每份1000w個數,然後在1000w個數中分別找出最大的100個數,最後在100*100個數中找出最大的100個。這裡我想可以用分布式的處理,多台主機才會更快。
10 億個數取中位數
10 億個數取中位數 1 取 16 1024 個數,生成乙個 treemap 取得最大值 max 和最小值 min。2 構造乙個1024個元素的計數陣列 t i 對最初的 1024 個數按區間計數 對 min 和 max 進行 1024 個等分,各等分值為 n i 當資料 n a 3 將大於 n 5...
100萬個數中找到最大的100個數
1.演算法如下 根據快速排序劃分的思想 1 遞迴對所有資料分成 a,b b b,d 兩個區間,b,d 區間內的數都是大於 a,b 區間內的數 2 對 b,d 重複 1 操作,直到最右邊的區間個數小於100個。注意 a,b 區間不用劃分 3 返回上乙個區間,並返回此區間的數字數目。接著方法仍然是對上一...
100億資料找出最大的1000個數字
這是網際網路領域乙個比較經典的演算法問題 top k 如何在巨大的資料中找出最大,或者訪問量最高的前10個,前100個或者前1000個資料。比如在2億使用者記錄中找出信用等級最高的,在上億個搜尋詞彙中找出被搜尋次數最高的10個關鍵字。前提是資料儲存在檔案中 一般遇到這個問題,第一反應會想到排序,但是...