RoaringBitmap

RoaringBitmap是一种高效的位图数据结构,通过独特的索引方式和三种容器(ArrayContainer,BitmapContainer,RunContainer)的智能切换,有效提升位图的内存使用效率。适用于大数据场景下的位图操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GITHUB实现地址

RoaringBitmap

RoaringBitmap是最近刚刚看到的一个压缩位图数据结构,可以有效的提升位图的内存使用效率,整个算法基本结构并不复杂,对于2^32位的数据, 将数据分成两部分做索引,高16位主要用来用来索引container, container中存放低16位数据, 其中container的实现分成三种,ArrayContainer, BitmapContainer, RunContainer

ArrayContainer

是用一个数组来存储一个short整数, 每次插入需要使用二分查找,插入数据的时候需要进行数组拷贝,适用于数量比较稀疏的场景,数据没有压缩

BitmapContainer

当ArrayContainer的数量超过4096(可以自行计算一下存储效率)的时候,ArrayContainer变成一个BitmapContainer, BitmapContainer是一个是用位图存储,这个时候数据是压缩的

RunContainer

RunContainer比较时候存储连续数据,比如11,12,13,14,15 压缩后的数据就是11,5,

总结

RoaringBitmap是一个效率比较高的位图实现,这里只是一个简单的介绍,具体的实现可以参考github上的开源实现。

### RoaringBitmap 数据结构实现 Roaring Bitmap 是一种高效且灵活的位图压缩数据结构,能够针对不同类型的输入数据自动调整内部表示方式以达到最佳的空间和时间效率[^3]。 #### 内部机制 Roaring Bitmap 将整个位图分割成多个长度固定的区间(通常是 2^16),每个区间的索引称为容器。对于每一个容器,根据其包含的有效位的数量来决定采用何种具体的数据结构: - **数组(Array)**:当有效位较少时使用,适合稀疏分布的情况; - **BitSet**:当有效位较多接近满载时使用,适用于密集型场景; - **Run Container**:专门用来处理连续序列,可以极大减少内存占用并加速某些操作的速度。 这种设计使得 Roaring Bitmap 在面对各种形态的数据集时都能保持较高的性能水平。 ```cpp // C++ 示例代码展示如何创建和操作 Roaring Bitmap 对象 #include "roaring/roaring.h" int main() { roaring_bitmap_t *rb = roaring_bitmap_create(); // 添加单个元素 roaring_bitmap_add(rb, 1); roaring_bitmap_add(rb, 2); // 批量添加范围内的整数 for(int i=10;i<20;++i){ roaring_bitmap_add(rb,i); } // 进行交集计算 roaring_bitmap_t* rb2 = /* ... */; roaring_bitmap_andnot_inplace(rb, rb2); roaring_bitmap_free(rb); } ``` ### 应用实例 在 Greenplum Database (GPDB) 中实现了对 Roaring Bitmap 的支持,这不仅提高了系统的查询速度还减少了所需的磁盘空间。特别是在涉及大量布尔向量运算的任务里表现尤为突出,比如用户行为追踪、广告投放效果评估等领域都可以看到它的身影[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值