《编程珠玑》第二章2.1 二分查找不存在的数
来源:互联网 发布:广西都市频道网络电视 编辑:程序博客网 时间:2024/05/16 10:23
给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数(在文件中至少缺失一个这样的数——为什么?)。
1、如果有足够的内存,如何处理?
2、如果内存不足,仅可以用几个外部的临时文件来进行处理,如何处理?
解:设x是不存的数。
可以从最低位开始进行探测,根据0或者1进行分组,分成两组之后,比较哪组的数目较少,比如位上是0的较少的话,那么x的第一位就是0.
,如果两组数量相当,那么对应的位数是0还是1都无所谓,你随便取值,可以暂且取成0。
这样依次类推到最高位,就可以得到一个 x的值,这个x就是我们要求的值。
比如:对3位的整数进行查找为例。
有如下8个3位的整数:0、1、2、3、4、4、6、7, 我们此时故意去掉7,
以二进制表示是:
x :1 1 1
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
可以看出来 最后一列也就是最低位上 有4个0,3个1,此时x的最低位取 1
此时序列里还剩下
001
011
101
第二位上有2个0,1个1,则x第二位取1,
之后序列里只剩下
011
第三位上1个0,0个1,x第三位取1, 得到x = 111(二进制) 得到 x=7。
这次我们再去掉一个2,这样的话一共少了2个数 2跟7
以二进制表示是:
x : ? ? ?
0 0 0
0 0 1
0 1 1
1 0 0
1 0 1
1 1 0
此时最低位 0跟1的数目一样,我们暂时取0的那边,之后剩下的序列为:
000
100
110
此时第二位上的0比1多,我们取1,序列还剩下
110
第三位上有个1米有0,则此时取第三位为0
则 x= (010)(二进制) 即x=2,
此时回过头去,再把最后一位设置为1的话,球出来的是x=7.
OK了,我的思路就是这样的,只是把书上的概念实例化了一下!!! 若有43亿个数的话,求重复的数,取位数上出现较多的就可以了。
- 《编程珠玑》第二章2.1 二分查找不存在的数
- 【编程珠玑】第二章 二分查找的巧妙应用
- 【编程珠玑】第二章 二分查找的巧妙应用
- [编程珠玑]-第二章:二分及标识
- 二分查找另类--【编程珠玑第四章】
- 编程珠玑第9章二分搜索(有重复数字)中查找某数出现的第一个位置
- 编程珠玑中关于二分查找的使用
- 编程珠玑第二章
- 编程珠玑第二章
- 编程珠玑第二章
- 编程珠玑第二章
- 编程珠玑 第二章
- 编程珠玑第二章的算法实现
- c++二分查找—来自编程珠玑
- 二分查找递归实现--【编程珠玑】
- 二分查找非递归实现--【编程珠玑】
- 关于《编程珠玑》中一个找出一个不存在的数的问题的探讨
- 编程珠玑 第二章 算法
- Java Socket多线程——服务器端
- Activity的taskAffinity属性
- HDU 1671 静态trie(字典树)
- vs2010中C++调用python脚本并制作安装包
- RAC之负载均衡
- 《编程珠玑》第二章2.1 二分查找不存在的数
- C# HMACSHA1 加密
- ibatis的iterate使用 方便or的使用
- Servlet源码深入学习
- RAC之FAILOVER
- 我在学习编程中犯的两个最大错误
- 在线编程协作平台FriendCode获15万美元种子期融资,并开放注册
- Activity设置singleInstance后不能启用startActivityForResult()进行数据回调
- linux 标准目录结构