最近我一直在玩Python的collections.Counter数据结构。该法服使用这个对象是计算一个文本文件中的单词出现的次数:collections.Counter如何实现快速排序?
from collections import Counter
with open(r'filename') as f:
#create a list of all words in the file using a list comprehension
words = [word for line in f for word in line.split()]
c = Counter(words)
凉爽的部分是你可以使用此结构弄清楚哪些单词是最常见的:
for word, count in c.most_common():
print word, count
我不明白的部分是most_common()
runs in O(n) time [编辑:这是不正确的。根据Martijn的回答,它实际上运行在O(n log k)]。显然这意味着它不能与背后的字典进行比较排序,因为最快的比较排序是O(nlogn)。
那么collections.Counter如何实现快速排序?
“当询问最高N个结果时” - 用K代替N与O(NlogK)保持一致。 – user2357112
这非常有帮助,谢谢!为了确保,我知道如何理解对'most_common(k)'的调用,基于你的回答: 1)创建一个大小为K的堆。 2)算法遍历字典中的所有N个项目,并检查项目是否大于堆中的最小项目。 3)如果新项目较大,则将其添加到堆中,并删除最小项目。 由于第三步可能发生在最坏的N次,并且最坏的log(k)的成本,这给我们总的NlogK。这听起来是对的吗? – BringMyCakeBack
这听起来大致正确。 –