web-dev-qa-db-ja.com

C ++ stdライブラリに、多くの点でよりシンプルなハッシュマップの前にバイナリ検索ツリーがあるのはなぜですか

2つのデータ構造とそれらを処理するアルゴリズムを見ると、ハッシュマップは実際にはバイナリ検索ツリーほど複雑ではなく、おそらくそれほど複雑ではありません。ハッシュマップには、キーに一定時間アクセスできるという利点があります。では、標準ライブラリの歴史の早い段階でstd :: mapを取得したのはなぜですか。C++ 11を待たなければならないハッシュマップであるstd :: unordered_mapの場合はどうしてでしょうか。

2
user619818

ハッシュマップの実装は、実際の実装ではなく、より複雑であり、次のような選択肢から選択する必要があります。

  • オープンアドレッシングと個別のチェーン、
    • 個別のチェーン内のノードが1つ以上のアイテムを保持しているかどうか
  • ハッシュ関数
  • 成長因子、
  • キーと値を一緒に保つかどうか

これらはすべて、どちらが優れているかを言うのが容易ではない方法でパフォーマンスに影響します一般的に

それに比べて、赤黒木は、人々が無限に自転車に乗ることのないプロトタイプを作成する方がはるかに簡単です。

4
ratchet freak

http://marknelson.us/2011/09/03/hash-functions-for-c-unordered-containers/ から、

2005年にTR1が公開されるまで標準ライブラリにハッシュテーブルがなかったことは、C++コミュニティにとって少し恥ずかしいことです。完全な世界では、元の標準にはハッシュマップとハッシュセットコンテナーが含まれているはずでした。しかし、アレクサンダーステパノフは、これらのコンテナーを元の標準テンプレートライブラリに含めなかったため、標準化委員会は、現実世界でそれほど走行距離のないコンテナーを祝福することに消極的でした。

標準委員会は、一般に積極的というよりむしろ積極的です。 Cは1969年に作成されましたが、1989年まで標準化されませんでした。C++は1979年に作成されましたが、1998年まで標準化されていませんでした。間違い。 (基本的に、標準の元のバージョンに完全に準拠したコンパイラはありませんでした。)2003年の更新は、主にバグ修正でした。複数のコンパイラベンダーによってフィールドでテストされていなかった機能に対して、委員会は2003年に積極的な行動をとろうとしていませんでした。

とはいえ、正式には規格の一部ではないが将来的には規格の一部となることが祝福された機能を使用する場合は、2011年より前に順序付けられていないマップにアクセスできました。

4
David Hammen

仕様と標準化の観点から見ると、ハッシュテーブルはツリーよりもかなり複雑です。

ツリーベースの(順序付けされた)コンテナの場合、標準は、オブジェクトを格納するためにのみ指定する必要があり、オブジェクトを割り当て、コピー、および比較できる必要があります。1。これらはすべてかなり明確に定義された概念であり、ほとんどの組み込み型はそれらを満たします(唯一の明らかな例外は、厳密な弱い順序付けを満たさない浮動小数点NaNです)。

ハッシュの場合、(少なくとも)ハッシュの方法のいくつかの方法を指定する必要があります。そのため、std::hashのように、すべての組み込み型に特化した、より多くのインフラストラクチャが必要でした。 std::unordered_*の場合、それはまた、イテレータに関するかなりの追加仕様を意味し、バケットにローカルなイテレータを、他のものすべてに使用される通常のイテレータに追加します。


1.はい、それはlittleより詳細になります。たとえば、比較が厳密な弱い順序付けを満たすことを要求するなどですが、それも非常に簡単です。

1
Jerry Coffin