我希望在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)
?
还有其他办法吗?
答案 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