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

来源:互联网 发布:淘宝怎么关闭私人定制 编辑:程序博客网 时间:2024/04/28 07:34
问题描述:从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)的数组大小来表示











0 0
原创粉丝点击