處理海量資料常用【堆排序】:
(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...