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


问题内容

这是我到目前为止所拥有的:

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)?


问题答案:

您可以使用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对象进行的各种操作的时间复杂度