web-dev-qa-db-ja.com

std :: mapでのfind()の時間の複雑さ

Std :: mapクラスのfind()関数はどのくらい効率的ですか?それはO(n)であるようなキーを探してすべての要素を反復しますか、それともバランスの取れたツリーにありますか、それともハッシュ関数を使用していますか?

20
Avi

Log(n) これは赤黒木に基づいています。

編集:nはもちろんマップ内のメンバーの数です。

35
David D

std::mapおよびstd::setは、高度にバランスのとれたバイナリ検索ツリー(赤黒ツリー、AVLツリーなど)を使用してコンパイラベンダーによって実装されます。

Davidが正しく指摘したように、findはO(log n)時間かかります。ここで、nはコンテナー内の要素の数です。

しかし、それは、文字列ではなく、intlongchardoubleなどのプリミティブデータタイプで発生します。

std:string、たとえばサイズ 'm'がキーとして使用されている場合、バランスのとれた二分探索ツリーの高さをトラバースするには、指定されたキーのlog n comparisonsのエントリが必要です木。

std::stringstd::mapまたはstd::setのキーである場合、findおよびinsert操作にはO(m log n)がかかります。ここで、mは見つける必要のある与えられた文字列の長さ。

19
Arif Ali Saiyed

すべての要素を反復するのではなく、バイナリ検索(O(log(n)))を実行します。検索を実行するには、operator <またはコンパレータを使用します。

ハッシュマップが必要な場合は、std :: unordered_map(C++-0xで追加)を使用できます。これは、ハッシュ関数を使用し、平均して(提供するハッシュ関数とデータに応じて)find()はO(1 )。

3
fbafelipe