介紹一下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 ...