使用O(n)时间和O(1)空间查找最常出现的元素

时间:2015-08-13 19:09:55

标签: python algorithm

我希望在O(n)时间和O(1)空间中找到列表中最常出现的元素。

第一个解决方案

from collections import Counter
def max_repetitions(elements):
    return max([v for k, v in Counter(elements).items() if v > 1])

空间复杂度为O(n)。我不确定时间的复杂性。是O(nlogn)还是O(n)

第二个解决方案

def max_repetitions(elements):
counter = 0
for k, v in Counter(elements).items():
    if v > 1 and counter < v:
        counter = k
return counter

此解决方案的时间复杂度是多少?是O(nlogn)还是O(n)

还有其他办法吗?

3 个答案:

答案 0 :(得分:1)

在这样的简单情况下:为了获得时间复杂度,请尝试回答迭代序列中元素的次数。

由于您在Counter模块中使用的collections类也会影响复杂性,但我们假设它是O(n)。

你做的唯一其他工作是再次迭代列表,也是O(n)。这使得O(n)成为时间复杂度,因为它随着元素数n线性增长。

答案 1 :(得分:1)

如果你想要一个多数元素,这是一个在数组中出现超过n/2次的元素,你可以使用(非常简单的)MJRTY算法,因为Boyer-Moore:http://www.cs.utexas.edu/~moore/best-ideas/mjrty/ 这将在O(n)时间内以O(1)空格运行。

答案 2 :(得分:0)

如果您的列表已经排序

function maxItem(list) {
var maxCount = 0;
var maxElement = null;
for(var i = 0, count = 1, elm = null; i < list.length; i++) {
  if(elm != list[i]) {
    count = 1;
    elm = list[i];
  } else { 
    count++;
  }
  if(count > maxCount) {
    maxCount = count;
    maxElement = elm;
  }
}
return maxElement;
}

console.log(maxItem([1,1,1, 2,2,2,2, 4,4, 8,8,8,8,8])); // 8
console.log(maxItem([1,1,1, 2,2,2,2, 4,4, 8,8,8,8,8, 9])); // 8
console.log(maxItem([8])); // 8

编辑抱歉,这不是JavaScript而不是python