在一个包含40亿个随机排列的32位整数的顺序文件中(注意随机排序),找出一个不再文件中的32位整数
来源:互联网 发布:网络教育机构 编辑:程序博客网 时间:2024/06/09 18:58
完整的题目:
在一个包含40亿个随机排列的32位整数的顺序文件中(注意随机排序),找出一个不再文件中的32位整数(即int类型的整数),
文件中至少缺少一个这样的数
要求:
使用最少的内存,可使用外部的临时文件
思路:
将每个数转换为2进制数,然后进行0/1探测,将为0的位保存在一个文件中,将为1的位保存在另一个文件中,
一个文件中至多只有20亿个,因为40亿小于2的32次方,所以缺少的肯定很多,题目要求只要找到1个即可,
书里面翻译有误导性,我们应该以含有整数最少的文件再次作为数据源,进行0/1探测,
这次探测的是第二位(从左至右)再进行分类,依次类推 这样算法时间复杂度只有O(n);
不足:
这样的思路只能找到一个数,如果需要都找到所有缺少的数且内存充足的情况下应该考虑位图排序
可行性:
我们以0~15为范围,这些数最多只占4比特,15对应的二进制为1111,如果少8,8对应的二进制为1000,
将0~15这些书按高位0/1分为两份,这样最高位为1就会比最高位为0的数的个数少,这样就可以断定缺少的数的高位
一定是和较少数的高位是一样的,然后再对数量少的那一份进行第二位的0/1探测再次划分两份,依次类推
代码:
这里我用两个List代替了临时文件,完整代码如下:
public class FindLackNumber {private static int bit = 4;// 总共的位数,int 32位,这里为了方便举例,数字最大为15只占四位private static Integer[] temp;private static List<Integer> zero;// 存放0private static List<Integer> one;// 存放1private static int number;// 找到数组a中缺少的整数public static int find(Integer[] a) {temp = a;zero = new ArrayList<>();one = new ArrayList<>();while (bit-- > 0) {zero.clear();one.clear();for (int i = 0; i < temp.length; i++) {// 高位为1if ((temp[i] & (1 << bit)) != 0) {one.add(temp[i]);} else {zero.add(temp[i]);}}if (zero.size() < one.size()) {temp = (Integer[]) zero.toArray(new Integer[zero.size()]);//number |= 0 << bit;} else {temp = (Integer[]) one.toArray(new Integer[one.size()]);number |= 1 << bit;}}return number;}public static void main(String[] args) {Integer[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15 };System.out.println(find(a));}}
0 0
- 在一个包含40亿个随机排列的32位整数的顺序文件中(注意随机排序),找出一个不再文件中的32位整数
- 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数
- 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数。
- 给定包含4300000000个32位整数的顺序文件,如何找出一个出现至少两次的整数
- 新解:给定包含4 300 000 000个32位整数的顺序文件,如何找出一个至少出现两次的整数。
- 面试题:给定一个包含4300000000个32位证书的顺序文件,求出一个至少包含两次的整数
- 编程珠玑:给定一个包含4300000000个32位证书的顺序文件,求出一个至少包含两次的整数
- 100亿个32位整数中放到一个文件中,找出任一个重复出现的数
- 编程珠玑 第二章 习题 2 给定一个包含4300000000个32位证书的顺序文件,求出一个至少包含两次的整数
- 一个文件中有40亿个整数,求出这个文件里的整数里不包含的一个整数
- 2.2: 随机生成一个n bit位的长整数。
- 2.2 随机生成一个n bit位的整数
- 随机生成一个n bit位的长整数
- 随机生成一个n bit位的长整数
- 随机生成一个n bit位的长整数
- 2.2: 随机生成一个n bit位的长整数
- 随机生成一个n bit位的长整数
- 随机生成一个n bit位的长整数
- 【从零开始学线程】java synchronized
- Android4.4. 编译 错误 /bin/bash: xmllint: 未找到命令
- 如何构建一个最简单的electron应用
- Sping-boot spring-cloud学习地址
- 快捷使用Retrofit网络请求框架(get请求,post请求,上传文件)
- 在一个包含40亿个随机排列的32位整数的顺序文件中(注意随机排序),找出一个不再文件中的32位整数
- 讯飞语音识别SDK试用
- Java替换特定字符串中的特定子串
- POJ 3187
- Linux strace命令
- 机器学习之验证码识别
- WampServer操作手册
- simplescreenrecorder snap应用
- 使用QFileSystemWatcher监控磁盘文件状态变化