给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数。
来源:互联网 发布:mysql 更新字段加一 编辑:程序博客网 时间:2024/05/22 13:47
前几天遇到的一个程序,一看到40亿,直接蒙圈了,还以为要用到B树来查找呢,好吧,看算法~
//a, b, c, 都是三个等长的数组,alen表示其长度。bit表示位数。比如32位。bit = 32.//re表示最后缺少的那个数。int get_lost(int *a, int *b, int *c, int alen, int bit){int re = 0, v = 0, biter = 0, *t, citer, i = 0;if (!a || !b || alen == (unsigned long)((1 << bit)))return -1; //哪个数与最多可能拥有个数相等的时候,直接返回了。 while (bit--){v = (1 << bit);for (biter = citer = i = 0; i < alen; ++i){if (a[i] & (1 << bit)) b[biter++] = a[i];else c[citer++] = a[i];}if (biter <= citer){re += v;t = a; a = b; b = t;alen = biter;}else{t = a; a = c; c = t;alen = citer;}}return re;}思路:32位整数的范围是0~2^32(大于40亿),则对于一个随机40亿个整数来说,有2^32-40亿=294,967,296,约3亿个数不存在,即问题要在这3亿数内找一个出来。再看0~2^32这个范围,考虑到32位太长就以十六进制代替二进制进行表示:0x0000,0000~0xffff,ffff。如果全部包括2^32个数,则可以看到0和1的个数是相等的,即各自为50%的出现概率。假设32位整数A和32位整数B在第i个二进制位处分别是0和1,则认为A和B是i位互补数(在这里仅供说明参考用)。归纳推广,根据50%的出现概率,考虑任意一个二进制位时,都可以将2^32个数划分为2个互补数的集合,即A集合和B集合。如果任意一位二进制位的互补数缺失一个,那么在该位处的0,1出现概率肯定不等,缺失数所代表的二进制值(0/1)的概率肯定小于存在数所代表的二进制值(1/0)的概率,【选择较少的数是为了补全这50%的概率,也就是较少的数等于缺失数的原因】。所以来看算法实现,程序的作者依次比较每个二进制位时选择较少数作为结果是有理论依据了。当然,作者为了更好的快速收敛提高效率,每次迭代都在缩小待搜索整数的范围,即用alen来控制二进制位数。
这个解释很到位,粘来的~
0 0
- 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数
- 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数。
- 在一个包含40亿个随机排列的32位整数的顺序文件中(注意随机排序),找出一个不再文件中的32位整数
- 给定包含4300000000个32位整数的顺序文件,如何找出一个出现至少两次的整数
- 新解:给定包含4 300 000 000个32位整数的顺序文件,如何找出一个至少出现两次的整数。
- 面试题:给定一个包含4300000000个32位证书的顺序文件,求出一个至少包含两次的整数
- 编程珠玑:给定一个包含4300000000个32位证书的顺序文件,求出一个至少包含两次的整数
- 编程珠玑 第二章 习题 2 给定一个包含4300000000个32位证书的顺序文件,求出一个至少包含两次的整数
- 编程珠机 第二章 找出一个不在文件中一32位整数。
- 100亿个32位整数中放到一个文件中,找出任一个重复出现的数
- 一个文件中有40亿个整数,求出这个文件里的整数里不包含的一个整数
- 9.10扩展性与存储限制(二)——给定一个输入文件,包含40亿个非负整数。产生一个不在该文件中的整数。内存限制:1GB
- 扩展性与存储限制(二)——给定一个输入文件,包含40亿个非负整数。产生一个不在该文件中的整数。内存限制:1GB
- 给定一个整数,如何取其各个位的数
- 反转一个整数的位
- 2.2: 随机生成一个n bit位的长整数。
- 2.2 随机生成一个n bit位的整数
- 随机生成一个n bit位的长整数
- Linux_Prgramming_Link_Library
- GridControl中的checkBox用法
- UISwitch简单用法和监听动画(类似QQ电话)实时显示
- 关于隐藏iOS9键盘上新增的快捷方式工具条Shotcuts
- 如何对 网页的加载 进行 性能优化
- 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数。
- 浅谈服务器架构之爆服页游
- 数据挖掘-基于贝叶斯算法及KNN算法的newsgroup18828文本分类器的JAVA实现(上)
- 2.JVM和DVM之间的区别
- django 注册、登录及第三方接口程序(2):扩展User表
- 风尘中的奇女子
- Linux Programing -- ch13-- 进程间通信:管道
- MyBatis(一)--查询MySQL表中信息
- Android Https相关完全解析 当OkHttp遇到Https