【问题标题】:Finding a missing integer, given 4 billion unsorted integers [duplicate]给定 40 亿个未排序的整数,找到一个缺失的整数 [重复]
【发布时间】:2014-05-11 13:52:57
【问题描述】:

我遇到了这个面试问题,我试图了解如何解决这个问题。我在 SO 上阅读了this 问题。我理解帖子作者的方法,但是我不理解接受的答案中建议的方法。所以我搬到了这个blog。根据这个博客,我们可以计算每个位位置的 0 和 1 的数量,从中我们可以找出丢失的数字。但是为此,该文件应该有 2^32-1 个大于 40 亿的数字。那么这种方法应该行不通吗?我确信我的理解有问题,但我就是想不通缺少的链接。

【问题讨论】:

  • 只要找到最大值并添加一个。或最小值并减一。
  • @Blorgbeard OP 明确引用了该帖子,称他无法理解那里的最佳答案。与其说是重复,不如说是跟进
  • 链接问题的底部有一个解释。如果您不理解解释,请对该问题发表评论。
  • 以防万一链接不会永远存在,总结问题的轮廓可能会很好。

标签: java algorithm types


【解决方案1】:

如果您有一个从 0 到 2^N-1 的“完整”数字序列,那么在每个位位置设置的位数将相等(并且等于 (2^N)/2)。

如果只缺少一个数字,那么它的 1 位对应于短一位计数的位位置。

请注意,这仅适用于 2 的幂,但可能可以计算出更复杂的“奇数”计数公式。

【讨论】:

  • 但是文件有 40 亿个整数和从 0 到 2^32-1 的完整数字序列,我们需要文件有 4294967295 个数字,对吗?所以我们有很多缺失的数字来支持这种方法。
  • @newbie - 正确(在一定程度上)。首先考虑没有丢失数字的情况,然后考虑缺少一个数字的情况。如果没有丢失的数字,所有的位计数都将相等,但是如果缺少一个数字,一些(但不是全部)将是一个短的计数。
  • 事实上,对于 2^N-1 的情况,您甚至不需要计算位,而是可以简单地计算整个集合的“奇偶校验”。生成的奇偶校验值将是缺失的。
  • @HotLicks:这并不总是能解决上述问题。它表示该文件包含多达 40 亿个数字。如果它只包含 4 个,则有许多“缺失”的数字可能无法使用奇偶校验方法检测到。
  • 我认为计数应该适用于不等于 2 的幂(减 1)的某个范围,只要该范围内只有一个数字缺失。实际上,可以通过人为地将数字从范围末尾循环到 2 的下一个幂(或找出正确的捏造因子)来使奇偶校验方案起作用。
【解决方案2】:
  • 使用 long 将整数相加
  • 从 (N+1)*(N+2)/2 中减去结果,其中 N 是文件中的整数数。结果是您丢失的号码

例子:

  • 文件包含 1,3
  • 总和 = 4
  • N=2,所以 (N+1)(N+2)/2 = (2+1)(2+2)/2 = 6
  • 6-sum=6-4=2
  • 2 是您丢失的号码

【讨论】:

  • 当然,这个方案在 4G 32 位数字上有点难看。
  • 为什么?内存使用量为 2 个长(64 位)变量。
  • 当 N = 2^32 - 1 = 4294967295 时,总和最多为 9223372039002259456 而多头可以持有 18446744073709551615
  • 是的,你是对的,但链接中的问题并不是说这些整数的范围是从 1 到 2^32 - 1,它只是表明它是 40 亿个整数。
猜你喜欢
  • 2015-03-12
  • 2011-11-01
  • 2013-10-24
  • 2011-07-15
  • 2012-04-27
  • 2019-11-23
  • 2019-06-26
  • 1970-01-01
相关资源
最近更新 更多