位图法:判断一个数是否在40亿个整数中?

本文介绍了如何使用位图法在内存有限的情况下判断40亿个整数中是否包含特定数字。通过将每个整数映射到二进制位,可以高效地表示大量数字并进行查询,只需512M内存。举例说明和Java代码实现展示了这种方法的思路和应用。
摘要由CSDN通过智能技术生成

我们之所以无法将40亿个数字直接读取到内存去进行处理,是因为40亿个 unsigned int 的整数大约要占15G内存,正常情况下,没有这么大的内存,也不可能这样做。

这种情况是因为一个整数占用了4个字节(Byte),而在本题中,我们其实只关心某个数字是否存在,在这种情况下,我们可以通过位图法来解决该问题。

位图法思想:对于40亿个 unsigned int 的整数,每个数字用1个二进制数(一个二进制数占用1Bit,1Byte = 8Bit)来表示该数字是否存在,0为不存在,1为存在。从低位开始数:

第1个二进制数表示整数0是否存在,

第2个二进制数表示整数1是否存在,

第3个二进制数表示整数2是否存在,

依次类推 … …

第4294967296个二进制数用于表示整数4294967295是否存在。

unsigned int 在32&64位编译器的范围为 0~4294967295,4294967296个二进制数大约占用512M内存,是一个可以接受的范围。

例子

题目:我们读取了3个整数:1、2、4,要判断整数3是否被读取过了。

解答过程:

1)对于40亿个 unsigned int 的整数,我们可以定义4294967296个二进制数,并且全部初始化值为0。

2)读取整数1:将第2个二进制数赋值为1,表示整数1是存在的,此时值为:10(高位还有4294967294个0,为了方便阅读不写出来,下文同)

3)读取整数2:将第3个二进制数赋值为1,表示整数2是存在的,此时值为:110

4)读取整数4:将第5个二进制数赋值为1,表示整数4是存在的,此时值为:1 0110

5)判断整数3是否被读取过,因为第1个二进制数表示整数0是否存在,因此整数3则通过第4个二进制数表示,此时的值为:1 0110,第4个二进制数为0,所以得出结论:整数3没有被读取过。

代码实现

由于Java中无法直接操作二进制数,因此我们可以通过 int 来实现。1个二进制数占用1 Bit;1个 int 占用4 Byte,也就是32 Bit。因此,我们可以使用1个int来表示32个二进制数。

所以,我们有以下思路:

第1个int表示:整数0 ~ 31是否存在,

第2个int表示:整数32 ~ 63

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值