【问题标题】:Find an element that occurs at least k times in a sorted array in log(n) time在 log(n) 时间内找到一个排序数组中至少出现 k 次的元素
【发布时间】:2015-06-23 10:24:51
【问题描述】:

给定一个由 n 个元素和一个数字 k 组成的排序数组,是否有可能在 log(n) 时间内找到出现超过 k 次的元素?如果有不止一个数字出现超过 k 次,那么其中任何一个都是可以接受的。

如果是,怎么做?

编辑: 我能够在线性时间内解决问题,我很高兴在此处发布该解决方案 - 但在 n 中解决它相当简单。不过,当谈到让它在 log(n) 中工作时,我完全被难住了,这就是我的问题所在。

【问题讨论】:

  • 好问题。到目前为止你得到了什么?
  • 这不是 SO 的工作方式。您至少需要提供您尝试过的内容。
  • 顺便说一下,如果k 很大,线性解也可以很快,因为它只需要检查n/k 元素。

标签: algorithm


【解决方案1】:

这里是O(n/k log(k))解决方案:

i = 0
while i+k-1 < n: //don't get out of bounds
   if arr[i] == arr[i+k-1]:
       produce arr[i] as dupe
       i = min { j | arr[j] > arr[i] } //binary search
   else:
       c = min { j | arr[j] == arr[i+k-1] } //binary search
       i = c

这个想法是,您检查索引i+k-1 处的元素,如果它与索引i 处的元素匹配 - 很好,这是一个骗局。否则,您不需要检查ii+k-1 之间的所有元素,只需检查与arr[i+k-1] 具有相同值的元素即可。

你确实需要回头寻找这个元素的最早索引,但是保证下次迭代超过索引i+k,使得这个算法的总迭代次数O(n/k),每次取@987654330 @时间。

这在渐近上优于线性时间算法,尤其是对于 k 的大值(在 k 位于 O(n) 中的情况下,算法衰减到 O(logn),例如 - 查找在最少频率为 0.1)

【讨论】:

  • 好答案@amit!
【解决方案2】:

一般不会。例如,如果 k=2,则在最坏情况下不检查数组的每个元素的算法都不能保证找到重复项。

【讨论】:

  • 但是给定一个元素x,您可以在log(n) 时间找出它在您的列表中是否至少有k 副本。但这是一个不同的问题。
  • 在特定参数上给出“最坏情况”性能存在缺陷(复杂性可能取决于它)。这就像说 BFS 是 O(V^2),因为 E 在 O(V^2) 中。这在技术上是正确的,但其复杂性的更常见表示法是 O(V+E)。同样在这里,给最坏的可能k 下限是愚蠢的,因为您可以提供一个更好的解决方案,这取决于k 的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
相关资源
最近更新 更多