Bit-map法处理大数据问题

文章介绍了如何使用Bitmap解决大数据问题,如快速判断数是否存在、找出重复元素、排序和不重复整数。通过C++实现的Bitmap类展示了高效处理数据的能力,并讨论了在大数据量下其他解决方案的优缺点,如HashSet、数据库存储、哈希函数和Bloom Filter。
摘要由CSDN通过智能技术生成
问题引入:

1.给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
2.给定一个千万级别数据量的整数集合,判断哪些是重复元素。
3.给定一个千万级别数据量的整形数组,对其进行排序。
4.在5亿个整数中找出不重复的整数(注意,假设内存不足以容纳这5亿个整数)。

从数据量上看,使用常规的解法(普通排序算法,逐个比较等)明显不合适,所以这里我们引入一个新的解法,就是Bitmap。

Bitmap就是用一个bit位来标记某个元素对应的Value, 而Key即是该bit的位序。由于采用了Bit为单位来存储数据,因此可以大大节省存储空间。 bitmap通过1个位表示一个状态,比如:int类型有2^32个数字,即4G个数字,那么每个数字一个状态,就是2^32个bit,即512 MB(也就是说,用512兆存储空间就可以处理4G个数据,即40+亿数据)。

下面是我用C++写的一个bitmap类,可以通过构造对象时传入数据规模,动态申请所需的内存,然后处理用户的大量数据:

  1 #include<iostream>
  2 #include<fstream>
  3 #include<ctime>
  4 using namespace std;
  5 const unsigned SIZE = 512000000;//512兆静态存储区可处理40.96亿数据
  6 
  7 class Bitmap {
  8     typedef struct Byte {
  9         unsigned char bit8;
 10         static const unsigned char mask[9];//用来取得一个字节每一位的辅助数组
 11         Byte()
 12         {
 13             bit8 = 0;
 14         }
 15         //设置该位,就是存储该数
 16         void set1(unsigned at)
 17         {
 18             bit8 |= mask[at];
 19         }
 20         //读取该位是否有数
 21         bool get1(unsigned at)
 22         {
 23             return bit8 & mask[at];
 24         }
 25 <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值