我們知道乙個1g=1024m,1m=1024k,1k=1024byte,1byte=8bit,所以1個位元組等於8bit,也就是8個二進位制位,位圖法的概念是用乙個位(bit)來標記某個數的存放狀態,所以節省了大量的空間。
以二進位制位來表示數字
例如:第27位為1,第28位為0。表示在map中27存在28不存在
大量資料進行排序,查詢和去重上可以使用這個策略來降低記憶體的使用。舉例
1:開發乙個使用者畫像系統,實現使用者資訊的標籤化。使用者標籤包含使用者的社會屬性,生活習慣,消費行為。
2:redis 用setbit(bitmap)統計活躍使用者
unsigned int bit[n],在這個陣列裡面,可以儲存n * php_int_size * 8個資料,但是最大的數只能是n * php_int_size * 8-1。例如我們要儲存的資料範圍為0-63,則我們只需要將n=1,這樣就可以把資料存進去,如下圖:
資料為[5,1,7,15,0,4,6,10,14],將這些資料存入這個結構中為
/** * 校驗引數
* @param array $arr
* @return bool
*/private
function
checkparams
($arr
)return
true;}
/** * 獲取index
* @param int $item
* @return array
*/private
function
getindex
($item)}
$bitmap
=new
bitmap()
;print_r
($bitmap
->
set(
array(1
,2,3
,500))
);print_r
($bitmap
->
contain
(array(1
,2,3
)));
print_r
($bitmap
->
setandsort
(array
(100,1
,3000,2
,3))
);print_r
($bitmap
->
del(
array
(500))
);print_r
($bitmap
->
contain
(array(1
,2,3
,500))
);?>
位運算子
$a
<
<
$b shift left(左移) 將 $a 中的位向左移動 $b 次(每一次移動都表示"乘以 2")。
$a>
>
$b shift right(右移) 將 $a 中的位向右移動 $b 次(每一次移動都表示"除以 2")。 $a|
$bor(按位或) 將把 $a 和 $b 中任何乙個為 1 的位設為 1。 $a&
$band(按位與) 將把 $a 和 $b 中都為 1 的位設為 1。 $a^
$bxor(按位異或) 將把 $a 和 $b 中乙個為 1 另乙個為 0 的位設為 1。
~$a not(按位取反) 將 $a 中為 0 的位設為 1,反之亦然。
無法進行非運算以乙個使用者資料為例,使用者基本資訊如下。
按照年齡標籤,可以劃分成90、00後兩個bitmap
問題引出
當我想獲取非90後使用者的數量時,是無法直接非運算的,因為如果直接非運算,得到的數時是8,顯然是
不符合我們預期的,我們的預期是1
解決思路
借助乙個全量的bitmap
我們給定 90 後使用者的 bitmap,再給定乙個全量使用者的 bitmap。最終要求出的是存在於全量使用者,但又不存在於 90 後使用者的部分。
90後使用者
全量使用者
我們可以使用異或操作,即相同位為0,不同位為1
問題引出
如果在乙個很長的bitmap裡只存一兩個使用者,那豈不是很浪費空間。
問題解決
谷歌所實現的ewahcompressedbitmap,對bitmap儲存空間做了一定的優化。
BitMap的原理和實現
32位機器上,對於乙個整型數,比如int a 1,int佔4位元組,1位元組 8位 1 byte 8 bit 佔32bit位。如果每個數字用int儲存,那就是20億個int,因而占用的空間約為 2000000000 4 1024 1024 1024 7.45g 如果按位儲存就不一樣了,20億個數就是...
bitmap原理及實現
以二進位制位來表示數字 例如 第27位為1,第28位為0。表示在map中27存在28不存在 實現 新增,即設定對應位為1 param arg return this public function set arg else return this 判斷數字是否存在 param arg return ...
BitMap演算法原理及實現實現
1.bitmap是什麼 bitmap是乙個十分有用的結構。所謂的bit map就是用乙個bit位來標記某個元素對應的value,而key即是該元素。由於採用了bit為單位來儲存資料,因此可以大大節省儲存空間。2.bitmap優勢 舉個例子,有乙個無序有界int陣列,初步估計占用記憶體44 16位元組...