2011-07-27 10 views
2

ハッシュの「品質」は、ランダムなハッシュに必要な予想される数に対して、すべての要素に一度アクセスするのに必要な比較の合計数として定義されます。値は100%を超えることができます。誰でもハッシュの品質を理解していますか?

比較の合計数は、各バケット内のエントリ数の平方和に等しくなります。 「< N」「< K」>バケットに>キーのランダムなハッシュについては、期待値は次のとおりです。まさにハッシュの品質が

n + n (n - 1)/2 * k 

何?

+0

この式はどこから来ましたか? Isは、 'k'バケットですべての 'n'キーを見つけるために必要な比較回数を表します。もしそうなら、それは460まで加算されます。これは、最悪の場合、単純な配列よりも約450回の反復が悪くなり、配列の平均の場合より455回の反復が悪くなります。私はそこに何かが間違っていると思う。 – DavidO

+0

それは 'perldoc Devel :: Peek'からです。 –

+0

ああ、意味があります。ドキュメントに 'n + n(n-1)/ 2k'と書かれています。これは' n + n *(n-1)/(2 * k) 'のようなものです。 – DavidO

答えて

4

これは、ハッシュが「均等に分散されている」ための尺度です。理想的には、ハッシュ関数はすべてを独自のバケットに配置しますが、そのバケットを複数持つことはできません(ハッシュの衝突があっても、別々の値が同じバケットに残ります)。

多くの要素を含むバケットを使用すると、バケツのパフォーマンス(理想的にはバケットを上げてそこの単一の要素を調べる)が低下します。そのような場合は、すべてを線形的に処理する必要があります。

100%の品質は、ランダムなデータで埋め込まれたハッシュに期待されるものです。その場合、すべてのバケツが同じに満ちている必要があります。 100%を超えると、データが不均等にハッシュされ、ルックアップに時間がかかります。

+0

フォーミュラはどうやって来ますか? –

+0

すべてのハッシュ実装で同じバケットに衝突するわけではありません - ハッシュ値*の衝突は連鎖(通常は何らかのプローブ形式とバケットの使用可能性の保証)なしで解決できます。 –

関連する問題