大數據排序問題


問題

一個文件中有9億條不重復的9位整數,對這個文件中數字進行排序

直接想法

9億條(9e8)數據,每個數據能用int存儲
因此所需要內存 9e8x4B = 3.6e9B = 3.6GB,這是裝載所需要的 排序復雜度一般都是nlogn
因此需要的內存更大

方法一 數據庫排序

將文本文件導入到數據庫中,讓數據庫進行索引排序操作后提取數據到文件。

評價

操作簡單, 運算速度較慢,對數據庫設備要求較高

方法二 分治法

通過Hash法 將9億條的數據分為20段,每段大約 5000萬條,大概占用5e7x4 = 2e8B = 200MB內存
在文件中依次搜索 0-5000萬,5000萬+1 - 1億 ....等等

評價

需要進行20次排序,縮小了每次使用的內存,但編碼復雜,速度也慢

方法三 位圖法

考慮9位數,所以從0 - 999999999 共10億個數
然后我們用bit來表示 bit為0,代表不存在,bit為1 代表存在
因此我們需要 10e8 / 8 = 125M內存
然后用bitMap 掃一遍就可以了。

// N 表示數據量的多少
const int N = 1e7;

int bit[N/32 + 1];

void addValue(int n) {
    // n / 32
    int row = n >> 5;
    // n % 32
    bit[row] |= 1 << (n & 0x1F);
    return ;
}

bool exists(int n) {
    int row = n >> 5;
    return bit[row] & (1 << (n & 0x1F));
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM