使用 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是不够的[重复]的主要内容,如果未能解决你的问题,请参考以下文章

《Programming Pearls》二分查找帮助

如何从40亿整数中找到不存在的一个

查找不在列表 A 但列表 B 中的人员的更快方法 [重复]

在 O(lg n) 中查找 Python 列表的唯一数字对中的单个数字

用C++编程思想解决一道题

位图的应用