在log(n)时间

时间:2015-06-23 10:24:51

标签: algorithm

给定n个元素的排序数组和数字k,是否可以在log(n)时间内找到一个超过k次的元素?如果有多个次数超过k次,则任何一个都可以接受。

如果是,怎么样?

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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),每个花费O(logk)次。

这比线性时间算法渐近更好,特别是对于k的大值(对于O(logn)k中的情况,算法衰减到O(n),如例如 - 找到至少以频率0.1重复的元素