关于《编程珠玑》中一个找出一个不存在的数的问题的探讨
来源:互联网 发布:软件著作权作品说明书 编辑:程序博客网 时间:2024/06/05 16:35
《编程珠玑》第二章2.1的三个问题中,有个问题是这样的:
给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数(在文件中至少缺失一个这样的数——为什么?)。
1、如果有足够的内存,如何处理?
2、如果内存不足,仅可以用几个外部的临时文件来进行处理,如何处理?
主要关注第二个问题,在仅有几百个字节的内存下,如何借助外部的“临时”文件解决该问题?
第二章主要对于二分法进行研究,故使用二分法,给了我们一个很好的答案。
写的很清楚了,从第一位开始探测,根据是0或1进行分组,对包含的整数个数不大于N/2的序列继续进行探测,只要搜索到某个位数时,有个分组为的整数个数为0,那么便成功找到缺少的数。
考虑一个极端情况,以对3位的整数进行查找为例。
有如下8个3位的整数:0、1、2、3、4、4、6、7。
以二进制表示是:
000
001
010
011
100
100
110
111
要探测该序列,在探测第一位时,发现分组个数一样,故无法进行舍弃;在探测第二位时仍需探测全部的8个数,而探测第二位时,0与1的个数仍相同,也无法舍弃;最终只能通过末位进行判定,而对末位,即使知道了有3个是0,5个是1,缺少的是以0结尾的数,也无法确切的知道整个整数是什么,因为第1、2位都无法确定应是1或0.
之所以会有这种情况,是因为在处理倒数第N位时,
1、 有大于等于2的N次方个数
2、 根据0或1进行分组时,分组包含的数字个数一样,且有个分组包含了所有的01序列组合。(如上面的倒数第三位为0的序列)。
于是,导致无法进行缩减,若运用作者提供的方法,则很有可能会出现错误。
回到原题,若判定的后N位数,恰好是这样的情况,该当如何?
解决:若有这种情况,压根不会进入这个一类中探测。可以模拟一个4位数的数列尝试。
如果一个序列的后N位至少含2的N次方个不相同的数,那么倒数第n+1位(不论是0或1)的这一类至少有2的n次方个整数,则定不会选择该类继续(若选择该类,说明另一类含有的整数数量不小于他,那么总数一定大于2*2的n次方个,不合题意),故选择到的一类,定是缺了某个数的一类。
- 关于《编程珠玑》中一个找出一个不存在的数的问题的探讨
- 《编程珠玑》第二章2.1 二分查找不存在的数
- 从40亿个32位数中找出1个不存在这其中的32位数(问题来自于编程珠玑)
- 线性时间内从一个数组中找出第K个最小的元素——编程珠玑
- 编程珠玑中关于一个单词的所有变位词的解决
- 一个关于乘法溢出问题的探讨
- 探讨一个关于“继承”的问题
- 找出较大的一个数
- 编程珠玑 第十一章 第9题 从数组中找出第K小的数
- 找出一个数组中只出现一个的数
- 关于连续的几个数中有一个数缺失并一次遍历找出的问题
- 找出一个数组中没重复出现过的数
- 找出一个bst中第二大的数
- 一个数组中找出2个不同的数
- 找出一个字符串中最长的数字串输出
- 找出一个数组中超过一半相同的数
- 找出一个数组中只出现一次的数
- 找出一个整数数组中,第二大的数
- c_str()函数
- WAD的条件清单
- [测试]关于一维数组和二维数组与指针的某些关系
- Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(一)
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等
- 关于《编程珠玑》中一个找出一个不存在的数的问题的探讨
- 北大ACM poj1426
- sql复习
- STL组件1
- 多线程下载文件雏形_Android学习笔记
- static_cast、dynamic_cast reinterpret_cast和const_
- 计算机视觉学术界大牛
- ORA-00257: archiver error. Connect internal only, until freed 错误 解决办法
- Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(二)