golang之路 bitmap 實現

2021-08-27 09:50:51 字數 1321 閱讀 1863

介紹一下bitmap的思想:

情景1:

有些時候我們為了判斷乙個某個元素是否存在乙個集合中,普通的方式是map[int]***x儲存。資料量小的時候還可以

待資料量龐大的時候,比如我們判斷某人的momoid是否在某個momoid切片中,儲存就悲劇了。算一下:

乙個int = 4byte  倘若儲存500w個資料 4 * 500 * 1000  / 1024 /1024 = 2g的儲存,怎麼辦放棄吧…

改進:對於這種數字形式存在性問題上完全可以用bit的0,1來確定數字的存在。那麼之前的乙個int = 32bit 只能儲存 1種狀態

現在可以儲存 32x  個數字狀態。瞬間 儲存空間降低額32倍。

演算法:設定 : int  為 32 bit     

int bitmap  

1.給定乙個整數計算其歸屬的陣列下標,因為是 0 - 31 ,32 - 63 ….為乙個整數 很顯然下標計算就是

idx = momoid  / 32 = momoid >> 5 

2,設定改下標 bitmap[ idx ] 對應整數的位標識,很顯然,只要對 momoid 對 32 取餘即可得到狀態位下標

bitidx = momoid % 32  

3. 設定該數的狀態, 只要將1<< bitidx 位 再與bitmap[idx] 值求或就可完成

bitmap[idx] = bitmap[idx] | ( 1 << bitidx)

狀態位,刪除、判斷存在性與否 不再贅述了。

好處:省空間、查詢方便

附上實現**:

var bitmap uint32 = make(uint32, max)

const (

shift = uint32(5)

mask  = 0x1f

max   = 1024 * 1024 * 1024

)/**

* 整數32bit可表示32個整數是否存在

* 只要將整數除以32既可以得到下標

* 而32位的置位0或1可以直接通過對

* momoid求mod獲取對第幾位置位

*/func adduser(momoid uint32)

/** 

* 判斷是否存在

* 直接取出 第幾位判斷該位是否為1即可

*/func containuser(momoid uint32) bool

/*** 刪除使用者

* 把momoid % mask 位數 設定為 0即可

* 方式下:

* ^(momoid % mask) & bitmap 

*/func deluser(momoid uint32)

Golang學習之路 01

1 在go的結構體中,如果成員屬性小寫開頭代表這個成員是私有的,如果是大寫開頭代表是公開的。因此在定義一些json資料的結構體時,需要將成員屬性均改為大寫,否則無法解析 2 beego建立乙個純api專案,通過bee api 為專案名 建立以後我們需要進入專案目錄直接執行bee run gendoc...

Golang 學習之路(三)函式

函式可以為我們隱藏某乙個分解的任務的細節實現,暴露出需要的引數和返回結果。在 go 語言中,如果一組形參或者返回值有相同的型別,我們不必為每個形參都寫出引數型別。func f i int j int k int s string t string 等價於 func f i,j,k int s,t s...

golang之路 時間格式化

有人問了問go的時間格式化問題,於是乎自己嘗試了下,發現巨坑爹,不按常理出牌啊 format的竟然模版必須如下面的每個數字,t time.unix 1362984425,0 nt t.format 2006 01 02 15 04 05 fmt.println nt 附上現有的go格式 const ...