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


    初识位图bitmap

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

    位图常用于以下情况:

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

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

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

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

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

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

    实现位图bitmap

    #include 
    #include 
    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;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    c++提供的bitset

    #include 
    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

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

  • 相关阅读:
    HJ69 矩阵乘法
    grpc实现跨语言(go与java)服务通信
    使用element-ui+sortablejs实现表格的拖拽排序
    基于Ansys workbench进行发动机风扇非定常流固耦合计算
    Qt第二十七章:QWidget、QMainWindow自定义标题栏并自由移动缩放
    kafka消息队列简单使用
    【Android Jetpack】DataStore的介绍
    21 Linux 自带的LED驱动
    常微分方程算法之编程示例四(龙格-库塔法)
    2022Java面试题大全,附答案,最新整理
  • 原文地址:https://blog.csdn.net/qq_40676869/article/details/132629977