キーはstd::map
O(1)?もっと考えてみるまではそうだった。ツリー実装に基づいているため、ルックアップ時間はO(log N)である必要がありますか?
そして、O(1)文字列キー、std::unordered_map
たぶん?
_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
_は要件を満たさないということです。
キーを検索するには、まずそのハッシュを生成する必要があります。キーが文字列の場合、この操作自体は文字列のサイズに比例します。次に、実装はキーを同じバケット内のすべての文字列キーと比較する必要があり、これらの比較のそれぞれは、これらの文字列のサイズが順番に線形になります。
はい、確かに std::map
はO(log N)
になり、 std::unordered_map
は平均的な一定時間の複雑さとO(N)
になります最悪の場合、ハッシュの衝突が多すぎる場合。