RoaringBitmap資料結構及原理

2021-08-09 19:43:20 字數 2579 閱讀 4990

每個roaringbitmap(github鏈結)中都包含乙個roaringarray,名字叫highlowcontainer

highlowcontainer儲存了roaringbitmap中的全部資料。

roaringarray highlowcontainer;
這個名字意味著,會將32位的整形(int)拆分成高16位和低16位兩部分(兩個short)來處理。

roaringarray的資料結構很簡單,核心為以下三個成員:

short keys;

container values;

int size;

每個32位的整形,高16位會被作為key儲存到short keys中,低16位則被看做value,儲存到container values中的某個container中。keysvalues通過下標一一對應。size則標示了當前包含的key-value pair的數量,即keysvalues中有效資料的數量。

keys陣列永遠保持有序,方便二分查詢。

下面介紹到的是roaringbitmap的核心,三種container。

通過上面的介紹我們知道,每個32位整形的高16位已經作為key儲存在roaringarray中了,那麼container只需要處理低16位的資料。

static

final

int default_max_size = 4096

short content;

結構很簡單,只有乙個short content,將16位value直接儲存。

short content始終保持有序,方便使用二分查詢,且不會儲存重複數值。

因為這種container儲存資料沒有任何壓縮,因此只適合儲存少量資料。

arraycontainer占用的空間大小與儲存的資料量為線性關係,每個short為2位元組,因此儲存了n個資料的arraycontainer占用空間大致為2n位元組。儲存乙個資料占用2位元組,儲存4096個資料占用8kb。

根據原始碼可以看出,常量default_max_size值為4096,當容量超過這個值的時候會將當前container替換為bitmapcontainer。

final

long bitmap;

這種container使用long儲存位圖資料。我們知道,每個container處理16位整形的資料,也就是0~65535,因此根據點陣圖的原理,需要65536個位元來儲存資料,每個位元位用1來表示有,0來表示無。每個long有64位,因此需要1024個long來提供65536個位元。

因此,每個bitmapcontainer在構建時就會初始化長度為1024的long。這就意味著,不管乙個bitmapcontainer中只儲存了1個資料還是儲存了65536個資料,占用的空間都是同樣的8kb。

private

short valueslength;

int nbrruns = 0;

runcontainer中的run指的是行程長度壓縮演算法(run length encoding),對連續資料有比較好的壓縮效果。

它的原理是,對於連續出現的數字,只記錄初始數字和後續數量。即:

原始碼中的short valueslength中儲存的就是壓縮後的資料。

這種壓縮演算法的效能和資料的連續性(緊湊性)關係極為密切,對於連續的100個short,它能從200位元組壓縮為4位元組,但對於完全不連續的100個short,編碼完之後反而會從200位元組變為400位元組。

如果要分析runcontainer的容量,我們可以做下面兩種極端的假設:

只有bitmapcontainer可根據下標直接定址,複雜度為o(1),arraycontainer和runcontainer都需要二分查詢,複雜度o(log n)

這是我畫的一張圖,大致描繪了各container占用空間隨資料量的趨勢。

其中,建立時:

轉換:針對arraycontainer:

針對bitmapcontainer:

針對runcontainer:

RoaringBitmap資料結構及原理

首先 每個roaringbitmap github鏈結 中都包含乙個roaringarray,名字叫highlowcontainer。highlowcontainer儲存了roaringbitmap中的全部資料。roaringarray highlowcontainer 這個名字意味著,會將32位的...

RoaringBitmap原理和應用

設計思路 我們以存放 integer 值的 bitmap 來舉例 存放long型別的儲存方式會有所不同 rbm 把乙個 32 位的 integer 劃分為高16 位和低16 位,通過高16位找到該資料儲存在哪個桶中 高 16 位可以劃分 2 16 個桶 把剩餘的低 16 位放入該桶對應的 conta...

資料探勘 資料

對關注的屬性,樣本與原始資料集有相同的性質,則用抽樣計算的結果與全集是一樣。1.1 抽樣的方法 1 簡單隨機抽樣 random sampling 放回 不放回 2 分層抽樣 stratified sampling 如果資料集不同型別的資料數量差異過大,則隨機抽樣會丟失數量少的樣本。可針對不同資料組,...