搜索求职文章

腾讯笔试题一则

2009-10-14 4:09:45 韩梅梅 访问:1134 我要评论[已关闭]
一个文件中有40亿个整数,每个整数为四个字节,内存为1GB,写出一个算法:求出这个文件里的整数里不包含的一个整数答:方法一: 4个字节表示的整数,总共只有2^32约等于4G个可能。为了简单起见,可以假设都是无符号整数。分配500MB内存,每一bit代表一个整数,刚好可以表示完4个字节的整数

     一个文件中有40亿个整数,每个整数为四个字节,内存为1GB,写出一个算法:求出这个文件里的整数里不包含的一个整数

答:方法一: 4个字节表示的整数,总共只有2^32约等于4G个可能。

为了简单起见,可以假设都是无符号整数。

分配500MB内存,每一bit代表一个整数,刚好可以表示完4个字节的整数,初始值为0。基本思想每读入一个数,就把它对应的bit位置为1,处理完40G个数后,对500M的内存遍历,找出一个bit为0的位,输出对应的整数就是未出现的。算法流程:

1)分配500MB内存buf,初始化为0

2)unsigned int x=0×1;

for each int j in file
 buf=buf ¦x < <j;
 end
 (3) for(unsigned int i=0; i <= 0xffffffff; i++)
 if (!(buf & x < <i))
 {
 output(i);
 break;
 }

以上只是针对无符号的,有符号的整数可以依此类推。

方法二:

文件可以分段读啊,这个是O(2n)算法,应该是很快的了,而且空间也允许的。

不过还可以构造更快的方法的,更快的方法主要是针对定位输出的整数优化算法。

思路大概是这样的,把值空间等分成若干个值段,比如值为无符号数,则

00000000H-00000FFFH
 00001000H-00001FFFH
 ……
 0000F000H-0000FFFFH
 …..
 FFFFF000H-FFFFFFFFH

     这样可以订立一个规则,在一个值段范围内的数第一次出现时,对应值段指示值Xn=Xn+1,如果该值段的所有整数都出现过,则Xn=1000H,这样后面输出定位时就可以直接跳过这个值段了,因为题目仅仅要求输出一个,这样可以大大减少后面对标志数值的遍历步骤。

     理论上值段的划分有一定的算法可以快速的实现,比如利用位运算直接定位值段对应值进行计算。


顶(270)

踩(20)
分享到人人网 分享到新浪微博 分享到开心网 添加到QQ书签 分享到豆瓣网 分享到搜狐白社会
【该评论已关闭】
性格特征测评
性格特征测评通过了解人们在做事、获取信息、决策等方面的偏好为择业提供比较准确的依据。
个税起征点特别专题策划
全国人大常委会6月30日通过了关于修...
       [查看详情]
2011高考志愿
高考志愿填报怎样才能既能发挥考生的优...
       [查看详情]

热文排行

职业困惑及解读

       [查看详情]