Pythonの_most_common
_オブジェクトによって提供される関数_collections.Counter
_の複雑さは何ですか?
より具体的には、Counter
は、カウント中に何らかのソートされたリストを保持し、n
が数値である場合にO(n)
より高速に_most_common
_操作を実行できるようにしますカウンターに追加された(一意の)アイテムの数参考までに、n番目に頻度の高いトークンを見つけようとする大量のテキストデータを処理しています。
CPythonウィキで 公式ドキュメント と TimeComplexityの記事 を確認しましたが、答えが見つかりませんでした。
collections.py のソースコードから、返される要素の数を指定しない場合、_most_common
_はカウントのソートされたリストを返すことがわかります。これはO(n log n)
アルゴリズムです。
_most_common
_要素を使用して_k > 1
_要素を返す場合、 _heapq.nlargest
_ を使用します。これはO(k) + O((n - k) log k) + O(k log k)
アルゴリズムであり、本質的に線形であるため、小さな定数k
に非常に適しています。 O(k)
部分は、最初のk
カウントをヒープ化することから得られ、2番目の部分は_n - k
_呼び出しからheappushpop
メソッドを呼び出し、3番目の部分は最終ヒープのソートから得られますk
要素。 _k <= n
_なので、複雑さは次のようになります。
O(n log k)
_k = 1
_の場合、複雑さが次のようであることを示すのは簡単です。
O(n)
ソース は、何が起こるかを正確に示します。
def most_common(self, n=None):
'''List the n most common elements and their counts from the most
common to the least. If n is None, then list all element counts.
>>> Counter('abracadabra').most_common(3)
[('a', 5), ('r', 2), ('b', 2)]
'''
# Emulate Bag.sortedByCount from Smalltalk
if n is None:
return sorted(self.iteritems(), key=_itemgetter(1), reverse=True)
return _heapq.nlargest(n, self.iteritems(), key=_itemgetter(1))
heapq.nlargest
は heapq.py で定義されています