は、アクセサ/ミューテータ Differences between HashMap and Hashtable?C++でsetとunordered_setの違いは何ですか?
を同期化したのおかげで、ハッシュテーブルの異なる実装を持つJava、話して以来、そう違いは何で似ているこの良い質問、出くわしたけど全然同じC++ではsetとunordered_setの実装ですか? この質問は、他のC++コンテナのvs unordered_mapなどへのマッピングに拡張できます。ここで
がを設定私の最初の評価である:標準のdoesntが明示的にツリーとして実装することを要求しますが、検索/挿入のためにその業務を尋ね時間複雑度の制約は、それはいつものように実装されることを意味します木。 通常、(GCC 4.8に見られるような)RBツリーとして、高さのバランスがとられています。 それらが高バランスであるため、それらは(検索のための予測可能な時間複雑度を有する)
長所:コンパクト(比較して、他のDSと比較して)
コン:アクセス時間複雑度はO(LG n)が
ありますunordered_set:標準ではツリーとして実装するよう明示的に要求していますが、検索/挿入の操作を要求する時間複雑度の制約は、常にハッシュテーブルとして実装されることを意味します。
長所:ツリー-DS
短所と比較して、スレッドセーフするための基本的なプリミティブを変換する(約束は検索のためのO(1)償却)
- の高速化:
- (1)Therotical最悪の場合はO(n)の であるOであることを保証しませ見上げて0
- 木ほどコンパクトではありません。 (実用的な負荷係数は決して1ではありません)
注:ハッシュテーブルのO(1)は、衝突がないことを前提としています。負荷係数が0.5であっても、すべての2番目の可変挿入が衝突につながります。 ハッシュテーブルの負荷係数は、ハッシュテーブル内の要素にアクセスするために必要な操作の数に反比例することが分かります。より多くは、#オペレーションを減らし、より疎なハッシュテーブルを作成します。記憶された要素がポインタに匹敵するサイズである場合、オーバヘッドはかなり重要である。
編集:ほとんどの質問には十分な答えが含まれているので、私は に質問を変更しています。「マップ/設定の違いが分からないのですか?
'std :: set 'の要素は特定の順序でトラバース可能でなければなりません。これは、挿入、検索、および削除操作が 'O(lg n)'である実際の理由です。 – pyon
@EduardoLeón:O(lg n)はDSのようなツリーの副作用だと思います。それはまた、アイテムが横断されたときに特定の順序を有することを説明する。私は確信が持てませんが、C++の 'set'の要件は '特定の順序'であることがわかりません。私は間違っている可能性がある。 –
"* LookupはO(1)であることは保証されません。Rotatory worst caseはO(n)*です。"それは "あなたがハッシュ関数を書く方法がわからない"ので、 "con" –