チェーンアドレス方式は、ジッパー、法律となっています。
基本的な考え方は次のとおりです。単一リンクリスト内の同じアドレスに接続し、同じキーワードのハッシュと異なるデータ要素のすべて。[0..m-1]を選択したハッシュテーブル長m、ハッシュ・テーブルは、ヘッドT mにポインタへのポインタの配列として定義することができると仮定する。任意のハッシュアドレスデータ要素Iは、ノードが単一のリンクリストのヘッドポインタとして形態T [i]が挿入されています。そしてので利便性だけではなく、リストの先頭に新しい要素、。また、これは頻繁に発生するという事実によるもの:新しく挿入された要素は、すぐに最適なアクセスすることがあります。
チェーンアドレス法の特徴
シンプルなジッパー紛争の(1)治療。無蓄積現象、すなわち、非同義決して衝突、平均検索長さより短いので、
(2)ファスナー方法のでは、リスト上の各ノードは、空間的動的アプリケーションです。だから、長いテーブルのテーブルを作成する前に決定することができない状況に適しています。
(3)競合を低減する方法をアドレッシング開きます。それは小さいα充填率が必要です。したがって、より大きなノードは、多くのスペースを無駄にすることができます。好ましくは、ファスナー方法α≥1、大きな接合、ファスナー法・ポインタ・フィールドは、このようにスペースを節約し、無視できる添加し;
(4)ファスナー構成のハッシュ法のリストで、動作は、ノードを除去することが容易です達成。単にノード缶に対応するリストにのみ省略します。ハッシュテーブルの構築の開口アドレス方式は、削除ノードは、単にそれが同義語・ノードのリストを散乱人々を埋めた後、それ以外の場合は、切り捨てパスを見ていきます、空きスペースにノードポイントを削除することはできません。これは、空のアドレス位置(すなわち開口アドレス)検索失敗である、種々の条件および開口アドレス方式によるものです。
そのため、オープンアドレス法と矛盾ハッシュテーブルに対処する上で削除操作を実行します。削除のためにフラグ付きのノードだけで削除することができますが、実際にノードを削除することはできません。
ハッシュテーブルデータストア実装される機能を簡単には、ハッシュテーブル内のアレイの記憶要素が含まれている以下の
記録素子と目標キー値の配列要素を有する2つのノードは、それぞれ、データ構造として定義されています
// 配列ターゲットのノードの記憶素子 のtypedef 構造体ArcNode { int型データ; // 要素値 構造体 ArcNode * 次に。 } ArcNode、 * pArcNode。 // ノードハッシュチェーンキー値配列格納されている のtypedef 構造体RouNode { int型のキー; // キー値 ArcNode * リンク。 } RouNode、 * pRouNode。
次のように特定のコードの実行結果であります
ノードのキーがある 0:ハッシュ番号、55 11 ノードのキーがある 1、ハッシュ番号:1つの 23 ノードのキーがある 2、ハッシュ番号:68 ノードのキーがある 3、ハッシュ番号:14 ノードのキーがある 4、ハッシュ番号:37 ノードのキーがある 5 、ハッシュ番号: ノードのキーがある 6 、ハッシュ番号: ノードのキーがある 7 、ハッシュ番号: ノードのキーがある 8、ハッシュ番号:19 ノードのキーがある 9、ハッシュ番号:86 ノードのキーがある 10、ハッシュ番号:
コードの実行結果は以下の通り
完全なコード
// ハッシュリンク+アレイ // 実行される方法のリンクアドレス 位に<stdio.h>含める #含める <STDLIB.H> #NUMを定義する。11 //は、ハッシュチェーンの長示し #がMAXSIZEを定義する。9 //はハッシュ処理にアレイ必要の長さを表します。 // 配列ターゲットのノードの記憶素子 のtypedef 構造体ArcNode { int型データ; // 要素値 構造体 ArcNode * 次に。 } ArcNode、 * pArcNode。 // ノードハッシュチェーンキー値配列格納されている のtypedef 構造体RouNode { int型のキー; // キー値 ArcNode * リンク。 } RouNode、 * pRouNode。 creat_Array pRouNode(INT NUM); //は、アレイ内のハッシュテーブルのキー値を作成し、ポインタフィールドが空白で初期化する (pArcNodeのcreat_node INTヴァル); // 新しいフリーノードを作成して接続され、ノードに格納された配列要素 ボイド traverse_node(pRouNode配列); // トラバース全体ハッシュリスト int型 get_key(INTのVal); //は、配列要素のキー値計算 pRouNodeのlink_node(pRouNodeアレイ、INTヴァルを); // ハッシュ処理のための単一の値に対して pRouNode link_array(pRouNodeアレイ、INT A []); // 配列全体を順次ハッシュ int型メイン(無効) { INT A [MAXSIZE] = { 1、55、14、19、23、37、11、68、86 }。 pRouNodeアレイ = creat_Array(NUM)。 link_array(アレイ、A)。 traverse_node(アレイ)。 リターン 0 ; } pRouNode creat_Array(int型NUM) { int型私は、 pRouNodeアレイ =(pRouNode)はmalloc(はsizeof(RouNode)* NUM)。 以下のための式(I = 0、I <NUMと、I ++ ) { 配列[i]は.KEY = I。 配列[i]は.link = NULL; } 戻り値の配列。 } pArcNodeのcreat_node(int型のval) { pArcNode NODE =(pArcNode)はmalloc(はsizeof (ArcNode))。 NODE - >データ= ヴァル; NODE - >次= NULL; リターンNODE; } 空traverse_node(pRouNodeアレイ) { int型私は、 以下のための式(I = 0、I <NUMと、I ++ ) { printf(" ノードのキーは、%D、ハッシュ番号:" 、配列[i]の.KEY)。 pArcNode PNEW = 配列[i]の.link。 しばらく(NULL!= PNEW) { printf(" %d個"、pNew-> データ)。 PNEW = pNew-> 次に、 } printf(" \ n個" ); } リターン; } INT get_key(INTヴァル)// 配列要素のキー値を計算する { 戻りヴァル%のNUMと、 } pRouNodeのlink_node(pRouNodeアレイ、int型のval) { もし(NULL!= アレイ[get_key(ヴァル)]。リンク) { pArcNode PNEW = 。配列[get_key(ヴァル)]リンク。 しばらく(NULL!= pNew-> 次) { PNEW = pNew-> 次に、 } PNEW - >次に= creat_node(ヴァル)。 } そうしないと { pArcNode PNEW = creat_node(ヴァル)。 配列[get_key(ヴァル)]リンク。 = PNEW。 } 戻り値の配列。 } pRouNode link_array(pRouNodeアレイ、int型A []) { int型私は= 0を。 以下のための(私は、私<MAXSIZE; I ++ ) { link_node(アレイ、A [I])。 } 戻り値の配列。 }
RRR