web-dev-qa-db-ja.com

C ++ STLマップ:アクセス時間はO(1)ですか?

キーはstd::map O(1)?もっと考えてみるまではそうだった。ツリー実装に基づいているため、ルックアップ時間はO(log N)である必要がありますか?

そして、O(1)文字列キー、std::unordered_mapたぶん?

29
stewart99

_std::map_ のルックアップの複雑さはO(log N)(コンテナのサイズの対数)です。

_std::map::operator []_のC++ 11標準の段落23.4.4.3/4に従って:

複雑さ:対数。

_std::unordered_map_ のルックアップの複雑さは、平均的な場合O(1)(定数)、およびO(N)(線形)最悪の場合。

_std::unordered_map::operator []_のC++ 11標準のパラグラフ23.5.4.3/4に従って

複雑さ:平均ケースO(1)、最悪ケースO(size())。

注:

質問が計算の複雑さのみに関係している場合は、上記で書かれたものが答えるはずです。実際、操作の計算の複雑さは、コンテナのサイズ(含まれる要素の数)で測定されます。

ただし、文字列キーを使用するコンテナでO(1)ルックアップを実行する方法を探している場合、ルックアップの複雑さは一定withコンテナのサイズではなく、stringの長さに関して、答えは_std::unordered_map_は要件を満たさないということです。

キーを検索するには、まずそのハッシュを生成する必要があります。キーが文字列の場合、この操作自体は文字列のサイズに比例します。次に、実装はキーを同じバケット内のすべての文字列キーと比較する必要があり、これらの比較のそれぞれは、これらの文字列のサイズが順番に線形になります。

43
Andy Prowl

はい、確かに std::mapO(log N)になり、 std::unordered_map は平均的な一定時間の複雑さとO(N)になります最悪の場合、ハッシュの衝突が多すぎる場合。

5
Shafik Yaghmour