• C++ 因项目需求,需要将0~2的32次方这个区间的数字保存到内存当中(内存大小为4G),并且可以实现对任意一个数字的增删。(先叙述设计思路,再写岀代码)


    问题: C++ 因项目需求,需要将0~2的32次方这个区间的数字保存到内存当中(内存大小为4G),并且可以实现对任意一个数字的增删。(先叙述设计思路,再写岀代码)

    为了在有限的内存(4GB)中存储和操作 0 到 2^32-1 之间的所有数字,我们需要考虑数据结构和存储策略。由于32位整数的范围很大(4,294,967,296 个可能的数字),我们需要一个高效的方式来存储和操作这些数字。在这种情况下,位图(bitmap)是一个合适的选择。

    设计思路

    1. 位图(Bitmap)

      • 使用位图来表示数字的存在与否,每一个位(bit)对应一个数字。
      • 位图的大小需要 2^32 bits(约 512MB),因为每个数字占用1 bit。
    2. 内存分配

      • 4GB内存足够容纳整个位图。
      • 位图可以使用std::vector来表示,每个uint8_t包含8个bit。
    3. 增删操作

      • 增加数字时,将对应位置的bit设置为1。
      • 删除数字时,将对应位置的bit设置为0。
    4. 辅助函数

      • 设置位函数:设置特定位置的bit为1。
      • 清除位函数:设置特定位置的bit为0。
      • 查询位函数:检查特定位置的bit是0还是1。

    代码实现

    #include 
    #include 
    #include 
    
    class Bitmap {
    public:
        Bitmap(uint64_t size) 
        {
            bitmap.resize((size + 7) / 8); // 每8个bit为1个byte
        }
    
        // 添加数字
        void add(uint32_t num) 
        {
            bitmap[num / 8] |= (1 << (num % 8));
        }
    
        // 删除数字
        void remove(uint32_t num) 
        {
            bitmap[num / 8] &= ~(1 << (num % 8));
        }
    
        // 检查数字是否存在
        bool contains(uint32_t num) const 
        {
            return bitmap[num / 8] & (1 << (num % 8));
        }
    
    private:
        std::vector<uint8_t> bitmap;
    };
    
    int main() 
    {
        Bitmap bitmap(1ULL << 32); // 创建一个包含 2^32 位的位图
    
        // 测试添加和删除数字
        uint32_t num = 123456789;
    
        bitmap.add(num);
        std::cout << "Contains " << num << "? " << (bitmap.contains(num) ? "Yes" : "No") << std::endl;
    
        bitmap.remove(num);
        std::cout << "Contains " << num << "? " << (bitmap.contains(num) ? "Yes" : "No") << std::endl;
    
        return 0;
    }
    
    

    说明

    1. Bitmap类

      • bitmap使用std::vector存储位图数据。
      • add方法将对应的bit设置为1。
      • remove方法将对应的bit设置为0。
      • contains方法检查对应的bit是否为1。
    2. main函数

      • 创建一个Bitmap对象,大小为2^32位。
      • 测试添加和删除数字操作。

    这种方法利用位图的高效性和位操作的快速性,在有限的内存中实现对大量数据的存储和操作。

  • 相关阅读:
    虚拟化技术基础
    『吴秋霖赠书活动 | 第四期』《Spring Boot微服务实战》
    世界前沿技术发展报告2023《世界航空技术发展报告》(二)军用飞机技术
    面向5G通信的射频关键技术解决毫米波传播距离短难题
    SAS|proc report
    101 本地存储
    刷题日常计~JS④
    从零开始实现一个分布式RPC框架
    池化(Pooling)的种类与具体用法——基于Pytorch
    spring boot 2.X中如何加密配置中的敏感信息
  • 原文地址:https://blog.csdn.net/weixin_44046545/article/details/140054582