海量数据解题之道:Bitmap

本文介绍了如何使用Bit Map算法解决在有限内存下处理海量数据的问题,特别是针对寻找重复整数和判断整数是否存在。通过位运算,Bit Map能在2G内存中存储40亿个整数,并提供了算法的原始实现。该技术适用于数据排序和高效检索,如手机号码排序等场景。
摘要由CSDN通过智能技术生成

1.概述

本文将讲述Bit Map算法的相关原理,以及一些利用场景,例如BitMap解决海量数据寻找重复、判断个别元素是否在海量数据当中等问题。

最后说说BitMap的特点以及在各个场景的使用特性。

2.算法

题目:32位整数中有40亿个不重复的整数,给定一个整数,确定是否在40亿个中出现。PC内存为2G

思考:40亿个int大约占 (40*10^9*4)/1024/1024/1024 约为14.9G,很明显内存一般放不下。

因此不可能将这40亿数据放在内存中计算。但是想要快速的实现,就应该讲数据放在内存中,所以

问题就变为如何在2G内存空间以内存储着40亿个整数。一个int数在32位系统中中是占4个字节,即需要32bit

如果能够用一个bit位来表示一个int整数,那么存储空间将会减少32倍,大概为500M,这样的话我们完全可以将这

40亿个int数放在内存中进行处理。

具体实现思路:

1个int占4个字节即4*8=32位,那么我们需要申请一个int数组长度为 int tmp[1+N/32]即可存储完这些数据,

其中N代表要进行查找的总数,tmp中的每一个元素在内存都占32位,可以对应表示十进制数0~31,所以

可得到BitMap表:

tmp[0]:可表示0~31

tmp[1]:可表示32~63

tmp[2]:可表示64~95

...

那么接下来就看看十进制数如何转换为对应的bit位:

假设这40亿int数据为:6 3 8 32 36 ...    那么具体的BitMap表示为:

wKiom1NaKh-yltStAAJ8sL4gHCQ269.jpg

如何判断int数字在tmp数组的哪个下标,这个其实可以通过直接除以32取整数部分,例如:

整数8除以32 取整 等于0,那么8就在tmp[0]上。另外,我们如何知道8在tmp[0]中32个位中的哪个位呢,

这种情况直接mod32即可,比如整数8,在tmp[0]中的第 8mod32 = 8位。

3.bitmap算法原始实现

<span style="font-size:14px;">//set 设置所在的bit位为1
void set(int i) {      
    a[i>>SHIFT] |=  (1<<(i & MASK));
}
//clr 初始化指定的bit位为0
void clr(int i) {      
    a[i>>SHIFT] &= ~(1<<(i & MASK));
}
//test 测试所在的bit为是否为1
int  test(int i){
    return a[i>>SHIFT] &   (1<<(i & MASK));
}                                                                      
int main()
{   int i;
    for (i = 0; i < N; i++)
        clr(i);
    while (scanf("%d", &i) != EOF)
        set(i);
    for (i = 0; i < N; i++)
        if (test(i))
            printf("%d\n", i);
    return 0;
}</span>


代码解析:

void set(int 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值