使用4 mb查找不在40亿列表中的整数。但4 MB是不够的

时间:2014-03-27 21:01:26

标签: java bit-manipulation bit

  

给定一个包含40亿个整数的列表,找到一个不在列表中的整数   使用4MB内存。 (采访是在Java中)

我的解决方案是使用BitSet。

然而根据我的计算,4 MB内存中没有足够的位! = c

4兆字节= 4096 KB#乘以8

4096 KB = ~4,096,000字节#乘以1000

4,096,000字节= ~33,500,000位#乘以8

所以33,500,000位是两个数量级,低于10亿。让一个孤独的40亿。


或者是否可以解决此限制的问题?

3 个答案:

答案 0 :(得分:4)

问题中没有任何内容表明您只能传递一次数据。

所以,假设它不是一个错误,你仍然可以使用一组位,但是在组中进行。对于第一遍,只检查从零到三千万(大致)的数字。第二关,检查三十到六千万。等等。

这仍然允许您在问题的约束内找到缺失的数字。

答案 1 :(得分:0)

你想要一个bloom filter

  

与标准哈希表不同,固定大小的Bloom过滤器可以   表示具有任意大量元素的集合;添加一个   由于数据结构“填满”,元素永远不会失败。然而,   随着元素的增加,误报率稳步上升   过滤器中的所有位都设置为1,此时所有查询都会产生   一个积极的结果。

Some additional reading

答案 2 :(得分:-1)

遍历列表并保留最大数量。 然后 int notInList = max + 1