java Bitmap 資料結構

玄星子發表於2014-04-22

轉自http://luozhong915127.iteye.com/blog/1460411


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)。

不足:如果資料過於稀疏就會有大量無用遍歷,浪費時間。

 



 

 

對於幾億int資料如要查詢出相等的資料,利用Bitmap演算法,只是使byte達到了極限,也是一種解決問題的一種方法。下一篇描述講一下原始碼的

描寫。


相關文章