现在的位置: 首页 > 综合 > 正文

一道算法题的学习

2013年12月05日 ⁄ 综合 ⁄ 共 524字 ⁄ 字号 评论关闭
问题描述如下:
有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,直到所有整数处理完毕

起初没有明白为什么是4G个bit,后来一下想明白了,这里就是把4G个bit对应到相应的数字。就是将4G个数字做bit数组的下标,
if bits[n] == 1
   continue;
else
   ++count;
   bits[n] = 1;

有人说这个答案是分两个数组,题目没有说数字是内存还是外存,没有要求把数字考虑在内,不然那样 500M内存不够用,想想也是外存。读一个丢一个就好了。
BS一下自己,一开始还想用set呢,简直就是小题大做,呵呵。不能太依赖STL东西了。
 

抱歉!评论已关闭.