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>来表示,每个uint8_t包含8个bit。
  3. 增删操作

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

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

代码实现

cpp 复制代码
#include <iostream>
#include <vector>
#include <cstdint>

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<uint8_t>存储位图数据。
    • add方法将对应的bit设置为1。
    • remove方法将对应的bit设置为0。
    • contains方法检查对应的bit是否为1。
  2. main函数

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

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

相关推荐
高-老师几秒前
基于R语言的物种气候生态位动态量化与分布特征模拟
开发语言·r语言·物种气候
大翻哥哥24 分钟前
Python 2025:量化金融与智能交易的新纪元
开发语言·python·金融
~|Bernard|27 分钟前
在 PyCharm 里怎么“点鼠标”完成指令同样的运行操作
算法·conda
战术摸鱼大师30 分钟前
电机控制(四)-级联PID控制器与参数整定(MATLAB&Simulink)
算法·matlab·运动控制·电机控制
Christo332 分钟前
TFS-2018《On the convergence of the sparse possibilistic c-means algorithm》
人工智能·算法·机器学习·数据挖掘
weixin_437830941 小时前
使用冰狐智能辅助实现图形列表自动点击:OCR与HID技术详解
开发语言·javascript·ocr
鹿鹿学长1 小时前
2025年全国大学生数学建模竞赛(C题) 建模解析|婴儿染色体数学建模|小鹿学长带队指引全代码文章与思路
c语言·开发语言·数学建模
好家伙VCC2 小时前
数学建模模型 全网最全 数学建模常见算法汇总 含代码分析讲解
大数据·嵌入式硬件·算法·数学建模
zhousenshan2 小时前
Python爬虫常用框架
开发语言·爬虫·python
利刃大大2 小时前
【高并发内存池】五、页缓存的设计
c++·缓存·项目·内存池