计算时间复杂度为O(nlogn)的列表中的出现次数

时间:2013-12-15 06:21:01

标签: python list python-3.x

这是我到目前为止所做的:

alist=[1,1,1,2,2,3,4,2,2,3,2,2,1]
def icount(alist):
    adic={}
    for i in alist:
        adic[i]=alist.count(i)
    return adic

print(icount(alist))

我做了一些研究,发现list.count()的时间复杂度是O(n),因此,这段代码将是O(n ^ 2)。

有没有办法将其减少到O(nlogn)?

2 个答案:

答案 0 :(得分:11)

您可以像这样使用Counter

from collections import Counter
alist=[1,1,1,2,2,3,4,2,2,3,2,2,1]
print Counter(alist)

如果您想使用您的解决方案,可以像这样改进它

def icount(alist):
    adic = {}
    for i in alist:
        adic[i] = adic.get(i, 0) + 1
    return adic

更好的是,你可以像这样使用defaultdict

from collections import defaultdict
adic = defaultdict(int)
for i in alist:
    adic[i] += 1
return adic

此外,您可能希望查看不同Python对象here上的各种操作的时间复杂度

答案 1 :(得分:6)

计数器是你的帮手:

>>> from collections import Counter
>>> a = [1,2,1,3,4]
>>>  Counter(a)
Counter({1: 2, 2: 1, 3: 1, 4: 1})
>>> x = Counter(a)     
>>> x[1]
2
>>> x[2]
1

通过此方法轻松获取每个元素的计数