从2.5亿个数字里面找出不重复的数字的个数
2016-12-08 10:54
120 查看
问题描述如下:
有2.5亿个整数(这2.5亿个整数存储在一个数组里面,至于数组是放在外存还是内存,没有进一步具体说明);
要求找出这2.5亿个数字里面,不重复的数字的个数;
另外,可用的内存限定为600M;
要求算法尽量高效,最优;
用一个bit表示一个数是否存在,32bit中无符号整数有4G个,共需4G bits,每个字节8 bits,需要4G/8 = 512M字节
1,申请512M内存,作为一个数是否存在的标记flag,全清0
2,设置记数器 count,清0
3,读入一个数,查看相应flag是否为0,如果为0,flag置1,count加1,如果为1,不做处理
4,重复3,直到所有整数处理完毕
题目:从2.5亿个正整数中找到不重复的整数。
解答:
int有4个字节,32位bit,最多可表示2^32个正整数,即4G个正整数(1G=2^30,1K=2^10)
用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更新,其他保持不变。
有2.5亿个整数(这2.5亿个整数存储在一个数组里面,至于数组是放在外存还是内存,没有进一步具体说明);
要求找出这2.5亿个数字里面,不重复的数字的个数;
另外,可用的内存限定为600M;
要求算法尽量高效,最优;
用一个bit表示一个数是否存在,32bit中无符号整数有4G个,共需4G bits,每个字节8 bits,需要4G/8 = 512M字节
1,申请512M内存,作为一个数是否存在的标记flag,全清0
2,设置记数器 count,清0
3,读入一个数,查看相应flag是否为0,如果为0,flag置1,count加1,如果为1,不做处理
4,重复3,直到所有整数处理完毕
题目:从2.5亿个正整数中找到不重复的整数。
解答:
int有4个字节,32位bit,最多可表示2^32个正整数,即4G个正整数(1G=2^30,1K=2^10)
用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更新,其他保持不变。
相关文章推荐
- 从2.5亿个数字里面找出不重复的数字的个数
- 问题描述如下: 有2.5亿个整数(这2.5亿个整数存储在一个数组里面,至于数组是放在外存还是内存,没有进一步具体说明); 要求找出这2.5亿个数字里面,不重复的数字的个数; 另外,可用的内存限定为600M; 要求算法尽量高效,最优;
- 面试题:如何从三亿个整数里面找出不重复的数字的个数
- 计数排序——有一个数组,里面是从1到1,000,000的整数,其中有一个数字出现了两次,你怎么找出那个重复的数字?
- 软件开发者面试百问-----有一个数组,里面是从1到1,000,000的整数,其中有一个数字出现了两次,你怎么找出那个重复的数字?
- 运用bitmap解决一道海量数据处理面试题:在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数。
- 在一个长度为n的数组里的所有数字都在1到n-1的范围内。 有一个数字重复若干次,找出这个数字。
- 如何比对EXCEL里面同一列的数字是否有重复
- 有一个长度是101的数组,存在1~100的数字,有一个是重复的,找出重复出来
- Java如何找出数组中重复的数字
- 产生10个长度为10的不能重复的字符串(里面只能出现大写字母、小写字母、0-9的数字),并遍历打印输出
- 找出重复数字
- 1-10000这10000个数乱序的写出来,但是其中有个数字写错了(可能重复,或者不是1-10000中的数字),如何快速找出?
- 找出一堆数里面出现次数最多或最多的前N个数字
- 在高并发的情况下,Node.js怎么生成像陌陌里面每个用户都有的 数字账号 呢,如何才会不重复呢?
- 算法-在1001个整数中找出一个重复出现的数字
- 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{
- 将自然数1--9这九个数分成三组,将每组的三个数字拼成三位数,每个数字不能重复,且每个三位数都是完全平方数。请找出这样的三个三位数。
- 在2.5亿个整数中找出不重复的整数的C++实现源代码
- 找出第一个重复的数字