文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

一篇带给你索引技术之位图

2024-12-02 04:42

关注

要点

概述

位图算法,是指使用一个bit位来表示数据状态。通常应用于海量数据去重、海量数据计算及判断海量数据中是否存在某个数据的场景中。

以海量数据中是否存在某个数据的应用场景为例,假设用16个bit位,分别表示数字0-15。bit位的值,表示该数字是否存在,0表示不存在,1表示存在。如上图所示,在该数据集合中,存在的元素有1、2、6、10、11和13。

可以发现,在数据比较稠密的情况下,位图算法能够节约存储空间,如图中,使用2个字节便可以表示16个数字,同时可以在O(1)的时间复杂度下,判断是否存在某个数字,大大提高了计算速度。

但是,在数据稀疏时,存储空间会存在一定程度的浪费。由于位图算法中,位图空间的大小是一定的,并不会根据存储数据量的大小而改变。因此,当位图空间中存储的数据量很小时,大量地位图空间是空闲的,存在大量的浪费。

算法实现

位图算法在主流开发语言中,都有对应的实现。基本操作主要有写入、查询、删除、交集、并集等。下面通过一个示例来了解一下,位图算法的实现。

位图结构定义例子使用char类型数组来存储位图信息(通常的实现中,会使用长整型数组),一个char类型有8个bit位。定义结构如下:

// 为了简化问题,LEN必须定义为CHAR_SIZE的倍数
#define LEN 16
#define CHAR_SIZE 8
typedef char BitSet[LEN/CHAR_SIZE];

写入在某个bit位写入数据时,首先通过整除,计算出该bit位在数组的哪个下标,然后,用取余计算出char元素中的哪个bit上。最后通过或运算将对应位设置为1。

// 置bit位
void set(BitSet& bits, int pos) {
// 查找对应数组下标
int unit = pos / CHAR_SIZE;
// 查找在字节中的bit位
int p = pos % CHAR_SIZE;
// 通过与运算实现对应bit位置1
bits[unit] = bits[unit] | (0x1 << p);

查询同写入操作,先计算出bit位置,查找到对应的bit位,然后返回该位置的数值。

// 查询bit位
int get(BitSet& bits, int pos) {
// 查找对应数组下标
int unit = pos / CHAR_SIZE;
// 查找在字节中的bit位
int p = pos % CHAR_SIZE;
// 通过与运算实现对应bit位置1
return (bits[unit] & (0x1 << p)) > 0 ? 1 : 0;
}

删除首先查找到对应的位置,然后通过与运算将该位置清空。

// 清空bit位
void clear(BitSet& bits, int pos) {
// 查找对应数组下标
int unit = pos / CHAR_SIZE;
// 查找在字节中的bit位
int p = pos % CHAR_SIZE;
// 通过与运算实现对应bit位置1
bits[unit] = bits[unit] & (~(0x1 << p));
}

交集对数组逐个元素进行或运算。

// 求位图b1和b2的并集
void unionn(const BitSet& b1, const BitSet& b2, BitSet& res) {
for (auto i = 0; i < (LEN/CHAR_SIZE); ++i) {
res[i] = b1[i] | b2[i];
}
}

并集对数组逐元素进行与运算。

// 求位图b1和b2的交集
void inter(const BitSet& b1, const BitSet& b2, BitSet& res) {
for (auto i = 0; i < (LEN/CHAR_SIZE); ++i) {
res[i] = b1[i] & b2[i];
}
}

在生产实现时,可能会进行一些优化:

扩展

为了解决位图稀疏时,位图低效率的问题,工业界,有多种位图压缩算法,其中,最经典的是RoaringBitmap。

RoaringBitmap的核心思想是,将整数进行分桶,高16位的值作为其桶的索引,每个桶对应一个容器。如下图所示:

roaring bitmap

容器的结构有三种类型:有序数组、未压缩位图、和行程长度编码。

在进行插入和删除操作之后,需要根据元素个数进行容器转换。插入元素时,若元素个数达到4096,则需要转换为未压缩位图进行存储。删除元素时,若元素个数小于4096时,则需要转换为有序数组存储。

参考

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯