【问题标题】:Find an integer not in list of 4 billion using 4 mb. But 4 MB is not enough [duplicate]使用 4 mb 查找不在 40 亿列表中的整数。但是4 MB是不够的[重复]
【发布时间】: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

标签: java bit-manipulation bit


【解决方案1】:

你想要bloom filter

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

Someadditionalreading

【讨论】:

  • 布隆过滤器可以回答集合中是否存在特定数字的问题,但它不允许您遍历集合。结合较小但非零的误报率,这意味着您将无法始终正确识别集合中不存在的数字。
  • 为了使布隆过滤器以任何方式有用,每次插入都必须设置至少 1 位。布隆过滤器会在您阅读大部分数字之前很久就填满。
【解决方案2】:

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

所以,假设这不是一个错误,您仍然可以使用 bit set,但要分组进行。对于第一遍,仅检查从零到三千万(大致)的数字。第二关,检查从三到六千万。以此类推。

这仍然可以让您在问题的限制范围内找到缺失的数字。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 如果列表是 {maxint}?
    猜你喜欢
    • 2016-01-08
    • 2015-03-12
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    相关资源
    最近更新 更多