大数据:快速查找一个数字是否存在在40亿个数字中

首先,我们先看个问题     

在给定的一台4G的PC机器上实现,一个包含40亿个不重复并且没有排过序的无符号的int整数,给出一个整数,找出给定的某个数 m,是否在文件40亿个数据当中的需求。

我这边推荐两个做法。

第一种做法:

需求分析:Int类型在Java中的存储占用4个Byte,32Bit,如果在内存中定义40亿个int类型数组来读取文件,占用大小:(40*100000000*4/1024/1024/1024)G=14.901G。这已经远远超出了机器的内存限制,这时候常规思路是,将数据存在磁盘,分批读取数据到内存中,但这样就会产生磁盘IO,对于追求速率的我们来讲,这种情况我们不考虑。

 对于数据来说,某个数据有还是没有,我们可以用0和1来表示,这正好符合二进制的0 1属性,我们知道Java中1 Int = 4 Byte = 32 Bit,这种情况下,我们需要的内存空间是,(40*100000000/8/1024/1024)M = 476.8!竟然满足了我们的要求。

具体思路:

   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

.......

那么接下来就看看十进制数如

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值