資料結構 BitMap的理解與應用

2021-09-17 03:06:01 字數 1727 閱讀 8790

場景:

給出10億個無序不重複整數,對於某個整數m,是否存在於這10億個數內,機器記憶體限定2g,怎麼實現?

考慮幾個方面的問題:

1.10億個整數的記憶體占用時多大?乙個整型int占用4個位元組(byte),32位(bit)。10億個整數的記憶體大小就是

(10億 * 4[byte])/(1024[kb] * 1024[m] * 1024[g]) =

3.72g。很明顯,超出當前機器記憶體。

2.沒法一次性載入到記憶體裡怎麼辦?可以存放到磁碟裡,分段讀取,判斷,這樣的話也是一種辦法,但是會浪費io,導致程式效率不高。

3.此時,二進位制可以充分利用起來,二進位制只有0和1,0表示不存在,1表示存在,那麼最小粒度就是在bit上做文章,而不是像上面說的乙個整數需要32bit儲存,因此利用"位"的話,每一位都能表示這個數是否存在,那麼對於原先1 int表示1個數,此時1 int可以表示32個數,大大提高了記憶體利用率。如果是這樣算的話,需要記憶體:(10億)/ (8[bit] * 1024[kb] * 1024[m])= 119m,只需要119m就能在記憶體裡操作了,完全沒問題。

思路實現:

為了簡化操作和模擬,我們不用int陣列,改用byte陣列,例如,現在有4個整數,如果使用byte陣列的話,儲存就是下面圖中的樣式:

如果現在有個整數13,該怎麼存呢?很簡單,儲存到byte[1]裡面就行:

那麼,對於乙個整數來說,其實就是要計算兩個值,乙個是byte陣列的下標(取整操作),另乙個就是byte陣列內的位置(取餘操作)

**實現:

1. add(新增方法),主要就是計算下標和位置,然後將對應位置置為「1」

public void add(int num)
2. clear(去除方法),將「1」左移對應位數然後取反再&操作就行。

public void clear(int num)
3. contains(是否包含方法)。

public boolean contain(int num)
主要就是這三段邏輯,完整**如下:

public class bitmap 

public void add(int num)

public boolean contain(int num)

public void clear(int num)

public static void main(string args)

}

資料結構 BitMap

問題 已知有n個整數,這些整數的範圍是 0,100 請你設計一種資料結構,使用陣列儲存這些資料,並提供兩種方法,分別是addmember和i ist.下面是這種資料結構的類的定義。思路1 用陣列儲存,查詢是否存在需要for迴圈n,有n個數那麼複雜度為o n 思路2 用陣列儲存,新增資料則arr in...

資料結構之BITMAP

給40億個不重複的無符號整數,沒排過序。給乙個無符號整數,如何快速判斷乙個數是否在這40億個數中。這個問題怎麼解決呢?1 將40億資料儲存起來 儲存在陣列 鍊錶 樹中 再和該數判斷是否相等。那我們思考一下需要多少記憶體 2 借助點陣圖bitmap解決。位圖 bitmap 是用乙個陣列中的每個資料的每...

資料結構 bitmap剖析

最近在看 程式設計珠璣 這本書。第1章中引入了bitmap 位圖 的資料結構。以前沒有接觸過,抽空研究了一下,記錄下來。書中描述的情景 1.最多1000萬個7位數 號碼 號碼不重複,實際大概800萬個 儲存在文字中 2.每隔一段時間要對號碼進行排序 3.程式模組最多可用1m bytes的記憶體,磁碟...