40亿个非负整数中找到没有出现过的数

2019-04-16  本文已影响0人  chengcongyue

32位无符号数的范围是0---4294967295,现在有一个包括40亿个无符号整数的文件,所以在整个范围中肯定有没有出现过的数.可以最多使用1GB的内存,怎么找到所有没有出现过的数?
进阶:内存限制为10MB,只用找到一个没有出现过的数就可以.

原问题

32的范围是大搞42亿,现在有40亿个32位无符号整数,所以在0----42亿多,肯定有这个文件中不存在的.
如果使用hashMap来保存40亿个无符号整数的文件,极端情况下有40亿个数,记录有40亿条,32位整数有4B,最差情况是4B40亿=160亿个字节,16GB的空间,这个肯定是不符合规则的.
我们可以通过bit map来解决这个问题.申请一个长度为4294967295的bit数组,即每一位是0或者1,其所占空间的大小为42亿bit,5亿B,5
10^8N,500MB,500MB满足空间大小的需求.
然后遍历40亿个数,如果这个数出现过,就在bit map下标对应位置置1,如果在40亿中遇到了7000,那么在bit map中bitArr[7000]置为1.
然后就是遍历bit map,其中为0的,对应的下标就是没出现过的.然后没出现的数就找出来了.

进阶问题

只有10MB,这个时候只要找出一个没出现过的数就可以了.先说解法,最后在说每一步的含义.

上一篇下一篇

猜你喜欢

热点阅读