[大資料量]BitMap即java.util.BitSet的應用

大搜車-自娛發表於2012-08-01
Bitmap演算法,
問題:對40億個資料進行排序,資料型別為 int,無相同資料。
思考:關於40億個資料的排序,首先想如何儲存呢?一個int 4個位元組,也就是160億個位元組,也就是大概有16GB的資料,現在所有的計算機估計
沒有這麼大的記憶體吧,所以我們就可以檔案歸併排序,也可以分段讀入資料在進行Qsort,但是都需要不停地讀入檔案,可以想象不停地讀取檔案硬體操作會有多麼浪費時間。

我們這樣都是用4個位元組來儲存了一個資料,在計算機裡都是用二進位制進行表示,
例如 5 :0000 0000 0000 0000 0000 0000 0000 0101
現在引入Bitmap,所謂Bitmap就是用一個bit來表示一個資料。平時32位儲存一個資料,我們可以換一種想法,用一個位元組32位來儲存0-31這32個資料,例如我們對2,1,5,12這四個資料進行由小到大的排序,首先把32位初始化為0,我們可以把這4個資料儲存為0000 0000 0000 0000 0001 0000 0010 0110

我們就把32位中的分別把 2 1 5 12位置為1,然後從第0位開始遍歷,看相應位是否為1,為1就進行輸出,就完成了資料從小到大的排序。

再返回原題應用Bitmap就可以把16GB的儲存空間縮小為16GB/32 = 512M,就可以大大減少讀取檔案的工作。直接讀一次檔案存入記憶體,然後遍歷輸出就完成了排序。

優點:既大量節省了空間,又把時間複雜度降低到O(n)。
不足:如果資料過於稀疏就會有大量無用遍歷,浪費時間。


一個比較簡單解釋的介紹:
http://blog.csdn.net/lushuaiyin/article/details/7546144
(java.util.BitSet 研究(存數海量資料時的一個途徑))

相關文章