在无序数中查找是否存在重复元素

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

http://blog.csdn.net/v_JULY_v/article/details/6279498

 

看到这个题的第一反应就是使用位图,使用内存空间为2^32bit = 512MB,遍历序列,把对应的bit位置一,查找的时间复杂度为O(1)

 

用位图来操作效率很高,这里提出了一种新的方法,在编程珠玑里边把每一个整数用32位的二进制来表示,然后把40亿的数据分为两类最低位为0和最低位为1,并把它们分别存入两个文件中,其中一个文件中整数个数大于20亿,另外一个文件中整数个数小于20亿,判断要查找的整数的最低位是0还是1,并在相应的文件中进行查找。

 

第二次再根据次低位把文件分成两部分,次低位分别为0和1的,然后再缩小查找范围,这样每次查找总能把范围缩小将近一半,这样经过31次划分之后,如果目标文件大小为0则表示目标数字不存在,如果为1则表示存在,如果大于1表示存在重复元素,时间复杂度为O(nlogn)

转载于:https://www.cnblogs.com/qianye/archive/2012/11/29/2794125.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值