讲师中心 微信公众号
AI工具推荐 视频效率加速

C++ 实现海量数据去重 Bitmap 位图算法设计查找提升优化【源码】

阿芳君_1511

阿芳君_1511

发布时间:2026-05-14 19:43:19

|

644人浏览过

|

来源于php中文网

原创

Bitmap位图算法通过五种优化方案高效处理海量整型数据去重与查找:一、std::vector紧凑实现;二、uint64_t数组手动位运算提升吞吐;三、分段Bitmap应对稀疏大范围;四、mmap支持百亿级只读位图;五、std::atomic封装保障并发安全。

c++ 实现海量数据去重 bitmap 位图算法设计查找提升优化【源码】

如果您需要在C++中高效处理海量整型数据的去重与查找,Bitmap位图算法是一种空间与时间兼顾的经典方案。以下是该算法的设计实现与性能优化步骤:

一、基于std::vector的紧凑位图实现

利用std::vector的特化实现,每个布尔值仅占用1比特,极大压缩内存开销,适用于已知数据范围且为非负整数的场景。

1、定义Bitmap类,内部使用std::vector存储位数组,容量根据最大可能值预分配。

2、构造函数中调用resize方法初始化所有位为false,确保索引安全访问。

立即学习“C++免费学习笔记(深入)”;

3、set方法通过下标操作将指定整数对应位置设为true,无需额外位运算封装。

4、test方法直接返回vector对应索引的布尔值,实现O(1)查找。

5、遍历所有索引,收集值为true的索引,构成去重后的有序结果集。

二、手动管理uint64_t数组的高性能位图

规避std::vector的代理对象开销与迭代器限制,采用原生无符号整数数组,通过位运算直接控制每一位,提升设置与查询吞吐量。

1、计算所需uint64_t元素个数:(max_value + 63) / 64。

2、使用new uint64_t[size]动态分配连续内存块,并用memset初始化为0。

3、set操作中,先计算目标值所在字的索引:index / 64;再计算位偏移:index % 64;最后执行bits[word] |= (1ULL

4、test操作中,同样计算word与bit,返回(bits[word] >> bit) & 1ULL。

5、提供bulk_set接口,支持一次设置连续整数区间,减少循环分支开销。

三、分段Bitmap支持超大范围稀疏数据

当数据最大值极大但实际分布稀疏时,全量分配位图将造成严重内存浪费。分段Bitmap将值域划分为固定大小桶(如64K),仅对非空桶分配子位图。

1、定义桶大小BUCKET_SIZE,通常取65536或131072。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

2、使用std::unordered_map>存储活跃桶,键为桶序号(value / BUCKET_SIZE)。

3、set操作中,先计算桶号bucket_id = value / BUCKET_SIZE,若桶不存在则分配并清零新数组;再在桶内执行标准位设置。

4、test操作中,先查map是否存在对应bucket_id,不存在则直接返回false;存在则按桶内偏移查询。

5、遍历时枚举map中每个桶,对每个桶内位图扫描并还原原始值:bucket_id * BUCKET_SIZE + bit_pos。

四、内存映射文件支持百亿级静态位图

针对只读、超大规模位图(如标记百亿URL是否已爬取),将位图持久化至磁盘并使用mmap加载,避免启动时全部载入内存。

1、预计算总位数N,确定所需字节数:(N + 7) / 8。

2、创建指定大小的空文件,使用posix_fallocate确保空间分配。

3、以PROT_READ | PROT_WRITE和MAP_SHARED标志调用mmap,获取可读写内存指针。

4、所有set/test操作均作用于mmap返回的指针,操作系统自动处理页调度与脏页回写。

5、程序退出前调用msync确保修改落盘,munmap释放映射。

五、并发安全的原子位图封装

在多线程插入场景下,需保证位操作的原子性,防止多个线程同时修改同一字内的不同位引发竞态。

1、底层仍使用uint64_t数组,但每个字对应一个std::atomic,而非原始类型。

2、set操作中,循环执行fetch_or:desired = 1ULL

3、test操作可直接load原子变量后执行位与,因读操作本身不改变状态,无需循环。

4、为降低争用,采用哈希分片策略:将值映射到多个独立原子数组之一,分片数通常为CPU核心数的2倍。

5、每个分片维护独立的atomic*数组及长度,set前先hash(value) % shard_count选择目标分片。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2268

2024.03.14

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

1039

2024.03.14

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

447

2024.03.14

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

327

2024.03.14

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

426

2024.03.14

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

600

2024.03.14

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

1429

2024.03.21

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

1237

2024.03.22

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn