大數據小內存TOPK,排序問題。
問題
10億個int數字,從小到大排序,或者得到TOP100,等問題。
解答
可以使用堆排序解決,小頂堆或者大頂堆。
從小到大排序,使用小頂堆,將所有數字按內存大小分段,內部排好序,從每一段中取出最小的數字,建立小頂堆,每次把堆定輸出到磁盤保存,再從堆定所在的段中取數字,重新建立小頂堆,最終完成排序。
對於排序問題,TOP100,維持一個有100個節點的小頂堆,每次讀入一個新數字,與堆定比較,如果比堆頂大,則拋棄堆定元素,重新建立大頂堆。
對於排序問題,可以用一個2^32的bit數組,每讀一個數,對應的位置上設置爲1,最後從小到大遍歷數組。
大數據去重
問題提出:
M(如10億)個int整數,只有其中N個數重複出現過,讀取到內存中並將重複的整數刪除。
解答
可以使用bitmap,將4字節的int值映射爲1字節的byte.