给定一个包含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亿。
或者是否可以解决此限制的问题?
答案 0 :(得分:4)
问题中没有任何内容表明您只能传递一次数据。
所以,假设它不是一个错误,你仍然可以使用一组位,但是在组中进行。对于第一遍,只检查从零到三千万(大致)的数字。第二关,检查三十到六千万。等等。
这仍然允许您在问题的约束内找到缺失的数字。
答案 1 :(得分:0)
你想要一个bloom filter。
与标准哈希表不同,固定大小的Bloom过滤器可以 表示具有任意大量元素的集合;添加一个 由于数据结构“填满”,元素永远不会失败。然而, 随着元素的增加,误报率稳步上升 过滤器中的所有位都设置为1,此时所有查询都会产生 一个积极的结果。
答案 2 :(得分:-1)
遍历列表并保留最大数量。 然后 int notInList = max + 1