問題
一個文件中有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));
}