【高效数据结构——位图bitmap】

初识位图bitmap

位图(Bitmap)是一种用于表示和操作位(bit)的数据结构。它是由一系列二进制位(0 或 1)组成的序列,每个位都可以单独访问和操作。

位图常用于以下情况:

  • 压缩存储:位图可以有效地存储大量的布尔值信息,每个位只占用一个比特,因此可以大幅减少存储空间的占用。例如,当需要存储大量的开关状态、标志位或者布尔型数据时,使用位图可以节省内存。

  • 快速查找和查询:由于位图的特殊存储结构,它可以快速进行位的查找和查询。例如,可以用位图表示一组元素的存在与否,然后通过位运算来快速进行成员的查找、去重、交集、并集等操作。

  • 数据压缩和索引:位图可以用于压缩和索引数据,特别是在数据集合较小且有规律的情况下。例如,在数据库中,可以使用位图索引来加速数据的查询操作。

  • 布隆过滤器:布隆过滤器是一种基于位图的概率型数据结构,用于快速判断一个元素是否存在于一个集合中。它通过多个哈希函数和位图来判断元素的存在性,具有较低的空间占用和高效的查询速度。

在实现位图时,常用的数据结构有数组、位集合(bit set)或者使用整型数据类型(如整型数组、位域等)来表示。在现代编程语言中,也常常提供了专门的位图类或库,如 C++ 中的 std::bitset。

总结起来,位图是一种用于表示和操作位的数据结构,它可以节省存储空间、实现快速的位操作,并在许多领域中有着广泛的应用,包括存储、索引、查询、数据压缩等。

实现位图bitmap

#include <iostream>
#include <vector>
using namespace std;
class Bitmap {
private:
    std::vector<uint8_t> data; // 位图数据存储
    uint64_t size; // 位图大小(位数)

public:
    Bitmap(uint64_t bitmapSize) {
        size = bitmapSize;
        data.resize((size + 7) / 8, 0); // 位图数据初始化为0
    }

    void set(uint64_t index) {
        if (index >= size) {
            std::cout << "Index out of range." << std::endl;
            return;
        }
        uint64_t byteIndex = index / 8;
        uint8_t bitOffset = index % 8;
        data[byteIndex] |= (1 << bitOffset);
    }

    bool test(uint64_t index) {
        if (index >= size) {
            std::cout << "Index out of range." << std::endl;
            return false;
        }
        uint64_t byteIndex = index / 8;
        uint8_t bitOffset = index % 8;
        return (data[byteIndex] & (1 << bitOffset)) != 0;
    }
};
int main(){
    const uint64_t bitmapSize = 28; // 位图大小

    Bitmap bitmap(bitmapSize); // 创建位图

    // 设置一些位
    bitmap.set(0);
    bitmap.set(5);
    bitmap.set(10);
    bitmap.set(15);
    bitmap.set(18);

    // 测试位状态
    for (uint64_t i = 0; i < bitmapSize; i++) {
        std::cout << "Bit " << i << ": " << bitmap.test(i) << std::endl;
    }

    return 0;

}

c++提供的bitset

#include <iostream>
#include <bitset>

int main() {
    // 创建一个位图,表示 8 个标志位
    std::bitset<8> bitmap;

    // 设置第 2 位和第 5 位为 1
    bitmap.set(2);
    bitmap.set(5);

    // 输出位图的值
    std::cout << "Bitmap: " << bitmap << std::endl;

    // 获取第 3 位的值
    bool bit3 = bitmap.test(3);
    std::cout << "Bit 3: " << bit3 << std::endl;

    // 清除第 5 位
    bitmap.reset(5);

    // 输出位图的值
    std::cout << "Bitmap: " << bitmap << std::endl;

    // 获取位图的大小(位数)
    size_t size = bitmap.size();
    std::cout << "Bitmap size: " << size << std::endl;

    return 0;
}

github链接:https://github.com/mulinhu/CPPer/tree/main/util/bitmap_demo

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值