《编程珠玑》---找到缺失的整数(位图+二分)

问题描述:从40亿个随机排列的32位整数中找到不存在文件中的整数;
根据题目的解析,这里我们缩小范围来举例,从8个随机排列的3位整数中找到不存在文件中的整数,假如我们放进的是(000, 001, 010, 011, 100, 111)缺少( 101,110);
算法第一趟:(把起始位为0的整数读入到一个文件,把起始位为1的整数读入到另一个文件)。
文件1: 000, 001, 010, 011
文件2: 100, 111 
由于是3位表示的整数,应当有2^3=8个整数,起始位为0,1的各占一半,由此记录两个文件中读入的数的个数,分别是4,2由此来看缺少的数应该存在于文件2类型的数,所以我们只对文件2进行操作,这里便是一个二分
算法第二趟:(以第二位开始同上一趟一样以0,1为区别进行区分)
文件21:100
文件22:111
按道理文件21和文件22都应该有2个数,但这里都只有1个,所以两个文件都存在缺失的数所以都要进行处理
算法第三趟(针对文件21): 区分方法以数位的第3位区分
文件211:100
文件212:  空  (这里可以判断缺少数101)
算法第四趟(针对文件22):
文件221:空 (可判断缺少数110)
文件222:111

由此缺少的两个数都被找了出来分别是101 和 110

位图的运用:由于40亿个数太大,需要40亿位来表示,所以需要采用位图压缩表示,一个int是32位,所以需要开2^(32-5)的数组大小来表示











评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值