【问题标题】:Find the maximum repeating number in O(n) time and O(1) extra space在 O(n) 时间和 O(1) 额外空间中找到最大重复数
【发布时间】:2016-08-31 13:58:51
【问题描述】:

在 O(n) 时间和 O(1) 额外空间内找到最大重复数(出现次数最多的数)

我认为我可以使用维护计数数组的计数排序阶段,然后可以在 O(N) 中完成。我说的对吗?

但是如何处理额外的空间。还有其他有效的算法吗?

【问题讨论】:

  • “最大重复次数”是指出现次数最多的次数,还是重复次数最多的次数?
  • 出现次数最多的数
  • 我认为这是不可能的。我能想到的最好的方法是排序 (O(n*log(n))) + 扫描排序数组 (O(n))。
  • 它们是整数吗?对可能出现的最大或最小数字是否有任何限制?
  • 还有geeksforgeeks.org/find-the-maximum-repeating-number-in-ok-time。这种方法的另一个问题是原始数组被修改了,需要另一个O(n)操作才能取回原始值。

标签: arrays sorting counting-sort


【解决方案1】:

如果不进一步了解数组中可能的数字,我认为这是不可能的。出于直觉,请考虑以下几点:对于您准备使用的任何恒定数量的内存 (c = O(1)),有一个序列使得在点 n-1c+1 的正确答案的可能性,只有最后一个数字中断领带。在这种情况下,具有恒定内存c 的算法无法一次性找到答案。这对于几个(恒定数量的)通过类似地起作用。

让我们看看我们能做些什么。

  • 如果我们知道最多有k 唯一数字,我们可以在O(n)O(k) 额外空间中找到答案,方法是保持一个计数数组(或者如果@987654328 是具有恒定查找成本的无序映射) @ 数字不必是连续的)。但是,如果我们不能绑定 k 而不是 k<n,那么在最坏的情况下,这将变成 O(n) 额外空间。
  • 如果我们对O(n log(n)) 中的数组进行排序,则可以在O(n) 中找到答案。所以总复杂度是O(n log(n)) 加上O(1) 额外空间。

【讨论】:

  • 如何在 O(n) 和 O(k) 额外空间中维护计数数组。
  • @stackuser 你是对的。我在考虑一个映射(它具有O(log(k)) 的查找复杂度),但是一个无序的映射或数组(对于像0k 这样的序列号)具有恒定的查找复杂度。
猜你喜欢
  • 2011-08-09
  • 2012-08-06
  • 1970-01-01
  • 2012-01-02
  • 2015-05-25
  • 1970-01-01
  • 2017-04-06
  • 2018-03-08
  • 1970-01-01
相关资源
最近更新 更多