web-dev-qa-db-ja.com

mapとunordered_mapの選択方法は?

キーとして文字列を使用してデータをマップしたいとします。 mapまたはunordered_mapのどのコンテナを選択すべきですか? unordered_mapはより多くのメモリを使用するため、メモリは問題ではなく、懸念事項は速度です。

unordered_mapは、一般的にO(1)とO(n)の最悪の場合の平均複雑度を与える必要があります。どのような場合にO(n)になりますか?mapunordered_mapよりも時間効率がよくなりますか?nが小さい場合に発生しますか?

デフォルトのhaser VsでSTL unordered_mapを使用すると仮定します。地図。文字列がキーです。

毎回個々の要素にアクセスするのではなく、要素を反復処理する場合、mapを選択する必要がありますか?

73

実際には、メモリに問題がない場合、単一要素へのアクセスが必要な場合、unordered_mapは常に高速です。

最悪の場合は理論的であり、すべての要素を単一のハッシュアカウンティングにバインドします。これは実際的な関連性はありません。 unordered_mapは、同じハッシュに属する少なくともN個の要素をログに記録するとすぐに遅くなります。これも実際的な関連性はありません。いくつかの特別なシナリオでは、より均一な分散を保証する特定のハッシュアルゴリズムを使用できます。特定のパターンを共有しない通常の文字列の場合、unordered_mapに付属する汎用ハッシュ関数も同様に優れています。

ソートされた方法で(反復子を使用して)マップをトラバースする場合、unordered_mapは使用できません。それどころか、mapはそれを許可するだけでなく、キーの近似に基づいてマップ内の次の要素を提供することもできます(lower_boundおよびupper_boundメソッドを参照)。

56
ypnos
                       | map              | unordered_map
---------------------------------------------------------
element ordering       | strict weak      | n/a 
                       |                  |
common implementation  | balanced tree    | hash table
                       | or red-black tree|  
                       |                  |
search time            | log(n)           | O(1) if there are no hash collisions
                       |                  | Up to O(n) if there are hash collisions 
                       |                  | O(n) when hash is the same for any key
                       |                  |     
Insertion time         | log(n)+rebalance | Same as search
                       |                  | 
Deletion time          | log(n)+rebalance | Same as search
                       |                  | 
needs comparators      | only operator <  | only operator ==
                       |                  |
needs hash function    | no               | yes
                       |                  |
common use case        | when good hash is| In most other cases. 
                       | not possible or  | 
                       | too slow. Or when|
                       | order is required| 
183
user1773602

どのような場合にO(n)に到達しますか?

すべての入力攪拌に対して同じハッシュ値を生成する(つまり、衝突を生成する)badハッシュ関数がある場合...

Mapまたはunordered_mapのどのコンテナを選択する必要がありますか?

常に要件とデータの種類/量の問題です。

マップはunordered_mapよりも時間効率がよくなりますか?

それはただ異なる構造です。典型的なユースケースに応じて、そのうちの1つを使用するように選択することをお勧めします(あなたが持っているデータの種類と量を考慮してください)

Nが小さい場合はhppaenですか?

データ量が少ない場合、すべてが特定のSTL実装に依存します...したがって、プレーンなベクトル/配列でさえ、連想コンテナよりも高速になることがあります...

7
zaufi

Mapまたはunordered_mapのどのコンテナを選択する必要がありますか? unordered_mapはより多くのメモリを使用するため、メモリは問題ではなく、懸念事項は速度であるとします。

プロファイルしてから決定します。 unordered_mapは一般に高速ですが、ケースごとに異なります。

どのような場合にO(n)に到達しますか?

ハッシュが適切ではなく、要素の束が同じビンに割り当てられている場合。

マップはunordered_mapよりも時間効率がよくなりますか? nが小さい場合、それは起こりますか?

おそらくそうではありませんが、本当に気にするならプロファイルしてください。小さいサイズのコンテナを持つことは、プログラムのボトルネックになることはほとんどありません。とにかく、線形検索を使用した単純なvectorは、このような場合に高速になる可能性があります。


決定する際の最も重要なことは、順序付けの要件と反復子の無効化の欠如です。どちらかが必要な場合は、mapを使用する必要があります。そうでなければ、 unordered_map

7
Pubby