大数据算法:40亿未排序int数中是否存在给定数

题目:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?

方法一:位图法

就是bit+hash的思想.具体做法:
1.hash思想:数组中我们以每个下标作为一位,位图法中,我们具体到bit,每个bit就是一个数.

2.40亿个数,4*10的9次方个数,4*10的9次方个bit/8/1024/1024=476M.所以我们只需要512M空间就能够记录这40亿个数字了.

3.读取40亿个数字,在相应的bit记录为1.因为要遍历,所以时间复杂度O(n).

4.记录完40亿个数字后,根据给定的数,去找相应位置是否为1.如果是就说明这个数存在于40亿个数当中.

总的时间复杂度O(n),空间512M

方法二:512M空间都没有的情况下,使用二分法

二分法依据:
因为40亿个整数都是unsigned int类型的,unsigned int类型最大的数2的32次方=4 294 967 296,就是42亿多.所以每一个整数肯定是可以用32位bit来表示的.于是我们考虑,可以通过每个整数的32bit中的每一个bit进行分类,分32次.
具体做法:
1.我们先根据32位中的最高位0或者1,把40亿个数分成两份文件,一份最高位全是0,另一份最高位全是1.然后可以把我们要判断的数的最高位0或1归为其中一份文件中,这个数只能在这份文件中,或者没有.

2.接下来,我们再根据32位bit中的次高位,继续把第1步中选定的文件分成两份文件.

3.第1 2部,循环32次,最终判断32位bit都完全相同的是否存在就可以了.

由于把一个文件分成两个文件的过程中,需要扫描文件中的每一个数字的当前bit,所以总的时间复

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值