从2.5亿个数字里面找出不重复的数字的个数

本文介绍了一种高效算法,用于从2.5亿个整数中找出不重复的数字数量。算法利用了有限内存资源(600MB),通过比特位操作标记每个整数的存在状态,从而实现快速计数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述如下:
有2.5亿个整数(这2.5亿个整数存储在一个数组里面,至于数组是放在外存还是内存,没有进一步具体说明);
要求找出这2.5亿个数字里面,不重复的数字的个数
另外,可用的内存限定为600M;

要求算法尽量高效,最优;


用一个bit表示一个数是否存在,32bit中无符号整数有4G个,共需4G bits,每个字节8 bits,需要4G/8 = 512M字节


1,申请512M内存,作为一个数是否存在的标记flag,全清0
2,设置记数器 count,清0
3,读入一个数,查看相应flag是否为0,如果为0,flag置1,count加1,如果为1,不做处理
4,重复3,直到所有整数处理完毕


题目:从2.5亿个正整数中找到不重复的整数。 
解答: 
int有4个字节,32位bit,最多可表示2^32个正整数,即4G个正整数(1G=2^30,1K=2^10
用2Bitmap法,每个正整数用两个bit的标志位,00表示没有出现,01表示出现1次,10表示出现多次。 
开辟一个用2Bitmap法标志4G个正整数的桶数组,则总共需要4G*2bit=1G内存。

扫描整数,如果标志位为00(=0),则将对应位置的标志置为01(=1)。如果为01,则置为10(=2)。 
数组用byte数组 来表示,byte[] flag; 
一个byte 8bit,

i/j 3 2 1 0
0 00 00 00 00
1 00 00 00 00

换算的时候, 
行数int i=number/4; 
列数int j=number%4; 
则number对应的标志位为int numberFlag=(flag[i]&(0x03<<(2*j)))>>(2*j);

扫描整数时可能需要设置新的标志值,设置时 
(flag[i]&(~(0x03<<(2*j))&0xff))|(((newFlag%4)<<(2*j))&0xff)

标志位所在那俩bit更新,其他保持不变。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值