0

ハッシュをよりよく理解するために、このStackOverflow の回答を調べていたところ、次のことがわかりました (一定時間でバケット サイズを取得する必要があるという事実に関して)。

線形プローブや二重ハッシュなどを使用する場合、同じ値にハッシュされたすべてのアイテムを見つけることは、値をハッシュする必要があることを意味し、テーブル内の空でないアイテムの「チェーン」を調べて、それらの数を見つけます同じ値にハッシュされます。ただし、同じ値にハッシュされたアイテムの数には線形ではありません。同じ値または衝突する値にハッシュされたアイテムの数には線形です。

これは、「同じ値または衝突する値にハッシュされたアイテムの数に比例する」とはどういう意味ですか? 線形プローブ中にすべての値を調べる必要がある可能性があるため、ハッシュテーブル内のアイテムの総数に線形ではありませんか? 衝突したものを通り抜けなければならない理由がわかりません。

たとえば、ハッシュテーブルで線形プローブ (ステップ サイズ 1) を使用していて、奇数インデックス スロットにマッピングするさまざまなキー (衝突していない、すべてのハッシュが一意の値) を持っている場合、すべてがハッシュされる1,3,5,7,9.....多くのキーを挿入したい2 までなので、すべての偶数インデックス スポットをそれらのキーで埋めます。2 にハッシュされるキーの数を知りたい場合、ハッシュ テーブル全体を調べる必要はありませんか? しかし、奇数のインデックス スロットは衝突していないため、同じ値または衝突する値にハッシュされたアイテムを反復処理しているだけではありません。

4

1 に答える 1

1

ハッシュ テーブルは、リンクされたリスト (テーブル内のバケット) の配列 (テーブル) に概念的に似ています。違いは、その配列を管理およびアクセスする方法にあります。関数を使用して、配列インデックスの計算に使用される数値を生成します。

2 つの要素を同じバケット (同じ計算値、つまり衝突) に配置すると、問題はリスト内の検索であることが判明します。リスト内の要素の数は、ハッシュ テーブル内の要素の総数よりも少ないことが望ましいです (つまり、他のバケットに他の要素が存在することを意味します)。

ただし、その段落の重要な紹介をスキップしています。

線形プローブや二重ハッシュなどを使用する場合、同じ値にハッシュされたすべてのアイテムを見つけることは、値をハッシュする必要があることを意味し、テーブル内の空でないアイテムの「チェーン」を調べて、それらの数を見つけます同じ値にハッシュされます。ただし、同じ値にハッシュされたアイテムの数には線形ではありません。同じ値または衝突する値にハッシュされたアイテムの数には線形です

線形プローブは、衝突にリスト (チェーン) を使用しないハッシュ テーブルの別の実装です。代わりに、予想される位置から開始して、配列内の最も近い利用可能なスポットを見つけるだけです。配列のデータが多いほど、次の位置も使用されていることがわかる可能性が高くなるため、検索を続ける必要があります。位置は、同じまたは衝突する valueにハッシュされたアイテムによって使用されますが、そこに既存の要素のハッシュが明示的に表示されない限り、これら 2 つのケースのどちらであるかはわかりません (実際には気にしません)。

この CppCon プレゼンテーション ビデオは、ハ​​ッシュ テーブルの優れた紹介と詳細な分析を行います。

于 2018-04-16T08:34:17.540 に答える