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

D.X*_*X.D 7 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))
Run Code Online (Sandbox Code Playgroud)

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

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

the*_*eye 11

你可以Counter像这样使用

from collections import Counter
alist=[1,1,1,2,2,3,4,2,2,3,2,2,1]
print Counter(alist)
Run Code Online (Sandbox Code Playgroud)

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

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

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

from collections import defaultdict
adic = defaultdict(int)
for i in alist:
    adic[i] += 1
return adic
Run Code Online (Sandbox Code Playgroud)

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


Asw*_*esh 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
Run Code Online (Sandbox Code Playgroud)

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