使用 4 mb 查找不在 40 亿列表中的整数。但是4 MB是不够的[重复]
Posted
技术标签:
【中文标题】使用 4 mb 查找不在 40 亿列表中的整数。但是4 MB是不够的[重复]【英文标题】:Find an integer not in list of 4 billion using 4 mb. But 4 MB is not enough [duplicate] 【发布时间】:2014-05-07 02:30:38 【问题描述】:给定一个包含 40 亿个整数的列表,找到一个不在列表中的整数 使用 4MB 内存。 (采访使用 Java)
我的解决方案是使用 BitSet。
但是根据我的计算,4 MB 内存中的位数不足! = c
4 MB = 4096 KB # 乘以 8
4096 KB =~ 4,096,000 字节 # 乘以 1000
4,096,000 字节 =~ 33,500,000 位 # 乘以 8
所以 33,500,000 位比十亿少两个数量级。别管这 40 亿人。
或者使用此限制是否是问题的一部分?
【问题讨论】:
很可能这是问题挑战的一部分,否则我怀疑问题中甚至会提到内存限制。 “给定 40 亿个整数的列表”是什么意思?它是如何给你的?在一个文件中?在数据库中?刻在石碑上? +1 表示我从未见过的表情符号:= c
。
【参考方案1】:
你想要bloom filter。
与标准哈希表不同,固定大小的布隆过滤器可以 表示具有任意大量元素的集合;添加一个 元素永远不会因为数据结构“填满”而失败。然而, 随着元素的添加,误报率稳步增加,直到 过滤器中的所有位都设置为 1,此时所有查询都会产生 一个积极的结果。
Someadditionalreading
【讨论】:
布隆过滤器可以回答集合中是否存在特定数字的问题,但它不允许您遍历集合。结合较小但非零的误报率,这意味着您将无法始终正确识别集合中不存在的数字。 为了使布隆过滤器以任何方式有用,每次插入都必须设置至少 1 位。布隆过滤器会在您阅读大部分数字之前很久就填满。【参考方案2】:问题中没有任何内容表明您只能传递一次数据。
所以,假设这不是一个错误,您仍然可以使用 bit set,但要分组进行。对于第一遍,仅检查从零到三千万(大致)的数字。第二关,检查从三到六千万。以此类推。
这仍然可以让您在问题的限制范围内找到缺失的数字。
【讨论】:
【参考方案3】:遍历列表并保持最大数量。 然后 int notInList = max + 1
【讨论】:
如果列表是 maxint?以上是关于使用 4 mb 查找不在 40 亿列表中的整数。但是4 MB是不够的[重复]的主要内容,如果未能解决你的问题,请参考以下文章