海量数据一,从2.5亿个正整数中找到不重复的整数
2016-09-19 00:11
281 查看
题目:从2.5亿个正整数中找到不重复的整数。
解答:
int有4个字节,32位bit,最多可表示232个正整数,即4G个正整数(1G=230,1K=210)
用2Bitmap法,每个正整数用两个bit的标志位,00表示没有出现,01表示出现1次,10表示出现多次。
开辟一个用2Bitmap法标志4G个正整数的桶数组,则总共需要4G*2bit=1G内存。
扫描整数,如果标志位为00(=0),则将对应位置的标志置为01(=1)。如果为01,则置为10(=2)。
数组用byte数组 来表示,byte[] flag;
一个byte 8bit,
换算的时候,
行数int i=number/4;
列数int j=number%4;
则number对应的标志位为int numberFlag=(flag[i]&(0x03<<(2*j)))>>(2*j);
扫描整数时可能需要设置新的标志值,设置时
(flag[i]&(~(0x03<<(2*j))&0xff))|(((newFlag%4)<<(2*j))&0xff)
标志位所在那俩bit更新,其他保持不变。
解答:
int有4个字节,32位bit,最多可表示232个正整数,即4G个正整数(1G=230,1K=210)
用2Bitmap法,每个正整数用两个bit的标志位,00表示没有出现,01表示出现1次,10表示出现多次。
开辟一个用2Bitmap法标志4G个正整数的桶数组,则总共需要4G*2bit=1G内存。
扫描整数,如果标志位为00(=0),则将对应位置的标志置为01(=1)。如果为01,则置为10(=2)。
数组用byte数组 来表示,byte[] flag;
一个byte 8bit,
i/j | 3 | 2 | 1 | 0 |
---|---|---|---|---|
0 | 00 | 00 | 00 | 00 |
1 | 00 | 00 | 00 | 00 |
行数int i=number/4;
列数int j=number%4;
则number对应的标志位为int numberFlag=(flag[i]&(0x03<<(2*j)))>>(2*j);
扫描整数时可能需要设置新的标志值,设置时
(flag[i]&(~(0x03<<(2*j))&0xff))|(((newFlag%4)<<(2*j))&0xff)
标志位所在那俩bit更新,其他保持不变。
相关文章推荐
- 运用bitmap解决一道海量数据处理面试题:在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数。
- 运用bitmap解决一道海量数据处理面试题:在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数。
- LeetCode试题之““给定一个正整数A,找到最小的正整数B,它的每一个数字的乘法等于A。””
- 题目:海量数据处理,40亿个不重复的unsigned int的整数,如何判断某数是否在其中?
- 问题描述如下: 有2.5亿个整数(这2.5亿个整数存储在一个数组里面,至于数组是放在外存还是内存,没有进一步具体说明); 要求找出这2.5亿个数字里面,不重复的数字的个数; 另外,可用的内存限定为600M; 要求算法尽量高效,最优;
- 给定一个正整数x,找到一个最小的正整数y,使得y的每一位相乘,最后值等于x
- 输入正整数t,n,然后是n个正整数(单调非递增),若n个数中某几个数的和是t,输出这些加法表达式(表达式不重复输出),无解输出NONE
- 2.5亿个整数中找出不重复的整数
- 在2.5亿个整数中找出不重复的整数
- 【海量数据处理】100亿个整数,内存足够,如何找到中位数?内存不足,如何找到中位数?
- 一个整数列,除了一个数字重复2次,所有其他数字都重复4次。O(n)时间O(1)空间找到那个只出现2次的。
- 2.5亿个整数中找出不重复的数代码实现
- 2.5亿个整数中找出不重复的整数 bitmap
- [海量数据处理]用2-Bitmap找出数组中不重复的整数
- 给定一个正整数n,找到小于或等于n的非负整数,其二进制表示不包含连续的整数。
- 问题描述 已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。 输入格式 输入一个正整数N。 输出格式 输出一个整数,表示你找到的最小公倍数。 样例输入 9 样例输出 5
- 将一个正整数分解为一系列不重复的整数的和
- 在2.5亿个整数中找出不重复的整数的C++实现源代码
- 输入正整数k,找到所有的正整数x>=y,使得1/k=1/x + 1/y; 样例输入: 2 12 样例输出: 2 1/2 = 1/6 + 1/3 1/
- 挑战能力——数字中不带9的正整数占所有正整数的比例是多少?