2017-06-21 3 views
1

要素を、例えば順序付けられていない集合に入れるには、そのハッシュを計算し、それを対応するバケットに入れます。しかし、私たちは通常、ハッシュ関数の値の範囲より多くのバケットを持っています。バケットとハッシュ値の対応はどのように計算されますか?いくつかの関数が(0 ... size_t) - >(0 ... size_of_buckets - 1)を反映して使用されているようです。しかし、このような関数を使用すると、良いハッシュ関数であっても、多数の衝突が発生する可能性があります。順序付けられていないコンテナのバケットのサイズを計算するハッシュ関数?

+0

独自のハッシュコンテナを作成する理由は何ですか?それは学校かそれに類する仕事ですか?それ以外の場合は、['std :: unordered_map'](http://en.cppreference.com/w/cpp/container/unordered_map)を使用する必要があります。 –

+0

私は自分自身を作成し​​たくありません。私はstd :: unordered_mapがどのように動作するかを知りたい。私が疑問に書いたように、これは理論的にはパフォーマンスに大きな影響を与える可能性があります。 –

答えて

2

より多くを学ぶために、以下の機能で遊んでなければならない私はstd::unordered_map正確な動作が定義されているかどうかわからないんだけど標準ではしかし、基本的な原則は、常にバケツの数をコンテナのサイズよりも小さい数(この小さな数は1.0/load_factor)より大きく保ちます。この方法では、衝突は稀です。ハッシュテーブルについて

、通常bucket_indexを計算する2つの方法がある:バケットの

  1. 数が2のべき乗であるように選択される:ハッシュが計算され、その後で抽出し、その下位/上位ビットのいくつかをビット操作。このメソッドは、すべてのビットがランダムである「良い」ハッシュ関数を必要とします。
  2. バケット数を素数として選択します。ハッシュが計算され、次にモジュロ演算でbucket_indexが計算されます。このメソッドは、ハッシュ関数の品質が悪い場合、あなたは衝突の多くを得ることができ、方法1について「あまりにも良い」ハッシュ関数

を必要としません。方法2の場合、あまりにも良い品質のハッシュ関数を使用しても、通常は衝突はまれです。しかし、ビット操作がmodよりはるかに速いので(通常はfasterになるテクニックがあります)、通常、メソッド1は高速です。十分な品質のハッシュ関数は通常安いです。

0

多くのハッシュテーブルは、ハッシュ関数の範囲とバケット数の対応を「計算」しないため、多くの異なるハッシュ関数をサポートするのに十分一般的に構築されています。

しかし、バケットの数は、ハッシュテーブル(衝突解決技術など)の内部、特にload factorと呼ばれる値に依存します。ロード・ファクタの制限に達すると、通常、バケットの数が増えます予め定められた一定の係数だけ減少させる。

あなたはstd::unordered_mapインターフェースに多くを見て、

http://en.cppreference.com/w/cpp/container/unordered_map/max_bucket_count http://en.cppreference.com/w/cpp/container/unordered_map/bucket_count http://en.cppreference.com/w/cpp/container/unordered_map/bucket_size ​​ http://en.cppreference.com/w/cpp/container/unordered_map/load_factor

+0

@downvoterなぜdownvote?あなたのdownvoteを説明するコメントを残すことを検討してください – Curious

+0

私は質問に答えが与えられなかったと思います。どのような応答も計算されていないことを意味します。コレスポンスがない場合、指定されたハッシュで要素を配置するバケットはわかりません。 –

関連する問題