腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
来源:互联网 发布:Centos安装jdk 编辑:程序博客网 时间:2024/06/03 13:09
问题描述:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
问题分析:40亿 不重复 ,没有排序。
40亿个unsigned int的整数,放到内存中的话,大约是16G,
(1)最直观的的解决办法,把所有的数据遍历一遍,找出那个数.
注意:这个方法是不可取的,因为把所有数据遍历一遍,要把所有的数据加载到内存中,16G的数据可能内存存储不下。
(2)基于第一种方法,内存加载不了16G的数据,就可以考虑到外部排序:归并排序的方法,先将一部分数据加载到内存中,然后查找。
(3)可以考虑使用位图bitmap,1个bit存储一个数字,那么40亿数据需要40亿bit 大约就是500M内存。
用一个bit位来表示这个数据是否存在,1表示存在,0表示不存在。
时间复杂度为O(n) + 查找时间O(1)。
(4)这个问题在《编程珠玑》里有很好的描述,大家可以参考下面的思路,探讨一下:
又因为2^32为40亿多,所以给定一个数可能在,也可能不在其中;
这里我们把40亿个数中的每一个用32位的二进制来表示
假设这40亿个数开始放在一个文件中。
然后将这40亿个数分成两类:
1.最高位为0
2.最高位为1
并将这两类分别写入到两个文件中,其中一个文件中数的个数<=20亿,而另一个>=20亿(这相当于折半了);
与要查找的数的最高位比较并接着进入相应的文件再查找
再然后把这个文件为又分成两类:
1.次最高位为0
2.次最高位为1
与要查找的数的次最高位比较并接着进入相应的文件再查找。
.......
以此类推,就可以找到了,而且时间复杂度为O(logn)
0 0
- 腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
- 腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
- 腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
- 给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
- 给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
- 给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
- 面试题:给40亿个不重复的无符号整数,没排过序,给一个无符号整数如何快速判断这个数是否在这40亿个数中
- 面试题--给40亿个不重复的,没有排过序,给一个无符号整数,如何判断这个数在这40亿个数中
- 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 【腾讯】
- 【面试题】给40亿个无符号不重复且没排过序的数,查找一个数是否在这40亿个数之中
- 位图:【面试题】给40亿个无符号不重复且没排过序的数,查找一个数是否在这40亿个数之中
- 给40亿个无符号不重复且没排过序的数,查找一个数是否在这40亿个数之中
- 题目:海量数据处理,40亿个不重复的unsigned int的整数,如何判断某数是否在其中?
- 如何快速判断这几个数是否在那40亿个数当中?
- leetcode 9 给一个int类型的数字,判断是否是回文数
- java面试题去除一个int整数的重复数字然后倒着输出
- 给一个int型整数,如何将这个整数的奇偶位互换
- 2.创建一个20个大小的随机数组,然后输入一个数,判断是否存在这个数
- 二维数组列最小值
- 集合相等问题
- 解决ubuntu16.04软件中心闪退问题
- C语言的变长参数 va_arg
- redis初学
- 腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
- 动态规划入门(三)
- ajax 省份地区三级联动
- 西部数据移动硬盘识别不了
- Qt之LiteIDE中漂亮的几款QSS
- E/MediaRecorder: start failed: -38
- VNC连接Linux桌面
- Pb的事务处理机制
- Tanks案例笔记(二、坦克创建与控制)