10G數中找到前5G大的數

2021-10-16 09:10:35 字數 646 閱讀 2657

處理海量資料常用【堆排序】:

(1)不需要一次性將所有資料載入到記憶體中;

(2)不用對所有元素進行排序,只需要和堆的根結點比較大小即可;

(3)對於海量資料而言,要求前k小/大的數,我們只需要構建乙個k個大小的堆,然後將讀入的數依次和根節點比較就行了(當然這裡的前提是記憶體需要存的下k個數)

最大堆求前n小,最小堆求前n大。

構建乙個k個數的最大堆,當讀取的數大於根節點時,捨棄;當讀取的數小於根節點時,替換根節點,重新塑造最大堆,然後繼續讀取,最後讀取完所有的資料之後,最大堆中的數就是最小k個數

構建乙個k個數的最小堆,當讀取的數小於根節點時捨棄;當讀取的數大於根節點時,替換根節點,重新塑造最小堆,然後繼續讀取,讀取完所有的資料之後,最小堆中的數就是最大k個數

所以我們本題採用堆排序來求中位數

對於10g的資料,它的中位數就是第5g個元素,按常理來說我們需要構建乙個5g大小的堆,但是允許的記憶體只有兩個g,所以我們先構建乙個1g大小的大頂堆,然後求出第1g個元素(根節點),然後利用該元素構建乙個新的1g大小的堆,求出第2g大的元素,依次類推,求出第5g大的元素

每次構建乙個堆求第幾g大的元素,都需要重新遍歷完所有10g的資料,相當於要遍歷5 * 10g次,這需要頻繁的io操作,需要不斷的從硬碟中讀取資料

還有其他方法,參考(

從10G個數中找到中數

在乙個檔案中有 10g 個整數,亂序排列,要求找出中位數。記憶體限制為 2g。不妨假設10g個整數是64bit的。2g記憶體可以存放256m個64bit整數。我們可以將64bit的整數空間平均分成256m個取值範圍,用2g的記憶體對每個取值範圍內出現整數個數進行統計。這樣遍歷一邊10g整數後,我們便...

G 第X大的數

g 第x大的數description x最近愛上了區間查詢問題,給出n n 100000 個數,然後進行m m 50 次詢問,每次詢問時,輸入乙個數x 1 x n 輸出n個數中第x大的數。input 每組首先輸入乙個整數n,代表有n個數,下面一行包含n個整數,用空格隔開。然後為乙個整數m,代表有m次...

在陣列中找到第二大的數

在陣列中找到第二大的數 你可以假定至少有兩個數字 您在真實的面試中是否遇到過這個題?樣例 給出 1,3,2,4 返回 3.給出 1,2 返回 1.public class findtwo system.out.println secondmax nums 找出第二大的數 param nums ret...