面试题:给定一个包含4300000000个32位证书的顺序文件,求出一个至少包含两次的整数
2011-03-19 09:07
429 查看
面试题:给定一个包含4300000000个32位整数的顺序文件,求出一个至少包含两次的整数。
思路:考虑两个条件
1. 所有的整数都存储在顺序文件中,因此,读取文件的次数将明显影响算法的效率
2. 顺序文件中包含的整数个数为4300000000,如果全部读取放在内存中的话,必须要考虑内存空间因素。
那么,有没有既节省时间又节省空间的solution呢?也就是,尽可能只顺序读取一次文件,并且采用尽可能少的内存的方法呢?
解决方案:
由上面的问题,我们想到了Bit-Map,可以申请537500000个char型数组,数组中每个位对应4300000000个整数中的一个数,刚开始时,都所有的位都置0,如果有存在相对应的数,那么对应的位就置一。
问题又出来了,如何才能表示至少包含两次的整数呢?
这是,我们发现,要表示至少包含两次的整数,仅用一位来表示是不够的。那么用两位呢?00表示没有数据,01表示存在一个,10表示存在两个,11表示存在两个以上,over啦。
我们需要申请大小为1075000000的char类型的数组,两位对应一个数。
初始时,所有位都置零,然后开始读取顺序文件,读到整数后,相应的位做相应的改变。
这样,我们便只需要一次操作,而且使用了最少的内存便解决这个问题啦。
是不是很容易啊?
思路:考虑两个条件
1. 所有的整数都存储在顺序文件中,因此,读取文件的次数将明显影响算法的效率
2. 顺序文件中包含的整数个数为4300000000,如果全部读取放在内存中的话,必须要考虑内存空间因素。
那么,有没有既节省时间又节省空间的solution呢?也就是,尽可能只顺序读取一次文件,并且采用尽可能少的内存的方法呢?
解决方案:
由上面的问题,我们想到了Bit-Map,可以申请537500000个char型数组,数组中每个位对应4300000000个整数中的一个数,刚开始时,都所有的位都置0,如果有存在相对应的数,那么对应的位就置一。
问题又出来了,如何才能表示至少包含两次的整数呢?
这是,我们发现,要表示至少包含两次的整数,仅用一位来表示是不够的。那么用两位呢?00表示没有数据,01表示存在一个,10表示存在两个,11表示存在两个以上,over啦。
我们需要申请大小为1075000000的char类型的数组,两位对应一个数。
初始时,所有位都置零,然后开始读取顺序文件,读到整数后,相应的位做相应的改变。
这样,我们便只需要一次操作,而且使用了最少的内存便解决这个问题啦。
是不是很容易啊?
相关文章推荐
- 编程珠玑 第二章 习题 2 给定一个包含4300000000个32位证书的顺序文件,求出一个至少包含两次的整数
- 编程珠玑:给定一个包含4300000000个32位证书的顺序文件,求出一个至少包含两次的整数
- 给定包含4300000000个32位整数的顺序文件,如何找出一个出现至少两次的整数
- 新解:给定包含4 300 000 000个32位整数的顺序文件,如何找出一个至少出现两次的整数。
- 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数
- 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数。
- 在一个包含40亿个随机排列的32位整数的顺序文件中(注意随机排序),找出一个不再文件中的32位整数
- 面试题:正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,给定a和b,需要计算出Q中的前几项
- 9.10扩展性与存储限制(二)——给定一个输入文件,包含40亿个非负整数。产生一个不在该文件中的整数。内存限制:1GB
- 给定一个输入文件,包含40亿个非负整数。产生一个不在该文件中的整数。内存限制:1GB
- 编写一个程序,统计给定文件中包含的每个单词出现的频率,并按单词表的顺序显示统计结果
- 整数顺序文件查找至少出现两次的整数
- 【腾讯面试题】求出这个文件里的整数里不包含的一个整数
- 扩展性与存储限制(二)——给定一个输入文件,包含40亿个非负整数。产生一个不在该文件中的整数。内存限制:1GB
- 给定一个正整数n,找到小于或等于n的非负整数,其二进制表示不包含连续的整数。
- 给定一个正整数N,统计从1到N的整数中,出现“1”的个数(11这个数算出现两次)
- 最大堆---实现一个简化的搜索提示系统。给定一个包含了用户query的日志文件,对于输入的任意一个字符串s,输出以s为前缀的在日志中出现频率最高的前10条query。
- 请实现一个反转32位有符号整数的函数,例如123—>321,-123->-321,120->21,如果溢出就返回0(面试题)
- C语言:【面试题】在二维数组中,每行每列都按照递增的顺序排序,判断数组中是否包含一个数。
- 记一个编译错误:命名冲突、宏定义、头文件包含顺序