ハッシュとは、レコードの保存場所とそのキーワードの間に一定の対応関係 f を確立し、各キーワードのキーが保存場所 f (キー) に対応し、キーワードと保存場所の相互関係を確立するものです。 . 対応関係、この関係fをハッシュ関数(ハッシュ関数)といいます。この記事の編集者は主にハッシュ関数の競合処理の問題について話します。
検索プロセス中、キー コードの比較の数は競合の数によって異なります。競合が少ないほど、検索の精度は高くなります。効率が低下すると、競合が多くなり、検索効率が低くなります。したがって、競合の数に影響を与える要因は、検索効率に影響を与える要因となります。競合の数に影響を与える要素は次の 3 つです:
1. ハッシュ関数が一様であるかどうか;
2. 競合の処理方法;
3.ハッシュ テーブルの充填係数。
ハッシュ テーブルの充填率は次のように定義されます: α = テーブルに充填された要素の数 / ハッシュ テーブルの長さ
α は充填度の符号率です。ハッシュテーブルの。テーブルの長さは固定値であるため、αは「テーブルに埋められる要素の数」に比例するため、αが大きいほどテーブルに埋められる要素が多くなり、競合する可能性が高くなります。 α、テーブルに入力される要素が少ないほど、競合が発生する可能性は低くなります。
実際、ハッシュ テーブルの平均検索長は充填係数 α の関数ですが、競合を処理する方法が異なれば機能も異なります。
ハッシュの競合を解決する方法には、一般に次のようなものがあります。
NO.1 オープン アドレス指定方法
いわゆるオープン アドレス指定方法とは、競合が発生すると、ハッシュの競合を解決する方法を意味します。次の空のアドレス: ハッシュ テーブルが十分に大きい限り、空のハッシュ アドレスは常に見つかり、レコードが保存されます。
式: f(key)=(f(key) di)%m(di=1,2,3….m-1)
たとえば、キーワードセットは { 12, 67, 56, 16, 25, 37, 22, 29, 15, 47, 48, 34}、テーブルの長さは 12 です。ハッシュ関数 f(key) = key mod 12.
最初の 5 つの数値 {12, 67, 56, 16, 25} を計算すると、それらはすべて競合のないハッシュ アドレスであり、直接保存されます。キー = 37 を計算すると、f(37) であることがわかります。 = 1. この時点では、25 の場所と競合します。したがって、上記の式 f(37) = (f(37) 1) mod 12 =2, を適用します。したがって、37 はインデックス 2 の場所に格納されます。次の 22、29、15、および 47 には競合はなく、正常にデポジットされます。 48 で f(48) = 0 を計算しますが、これは 12 の 0 の位置と競合します。それは問題ではありません。f(48) = (f(48) 1) mod 12 = 1 となりますが、これは位置と競合します。 25の。したがって、 f(48) = (f(48) 2) mod 12 = 2 ですが、まだ競合が存在します... f(48) = (f(48) 6) mod 12 = 6 になるまで空きはありません。以下の表にあります。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | |
12 | 25 |
# #16 |
##67 | 56 |
以上がデータ構造内のハッシュ テーブル (ハッシュ テーブル) の従来の競合処理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。