アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

54
アアアアアアアアアアアア アアアア 14-2 アアアアアアアアアアアアア 「」 アアアアアア アアアア アア アアアアアアア アアアア

Upload: denna

Post on 22-Feb-2016

97 views

Category:

Documents


0 download

DESCRIPTION

アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」. 横浜国立大学 理工 学部 数物・電子情報系学科 富井尚志. 外部 ハッシュ法. サンプルプログラム: directchaining.c ダイレクトチェイニング法 /外部ハッシュ法 指定された ID に対してハッシュ値を作成 アイテムは要素リストに格納される ハッシュ表はリスト先頭を保持 格納できる長さに制限がない 挿入:ハッシュ値衝突の際は 要素リスト の先頭にアイテムを追加する 削除:ハッシュ値からハッシュ表を特定し、要素リストから削除する - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

アルゴリズムとデータ構造補足資料 14-2「ダイレクトチェイニング法」

横浜国立大学理工学部 数物・電子情報系学科富井尚志

Page 2: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

外部ハッシュ法サンプルプログラム: directchaining.c

• ダイレクトチェイニング法/外部ハッシュ法• 指定された ID に対してハッシュ値を作成• アイテムは要素リストに格納される• ハッシュ表はリスト先頭を保持• 格納できる長さに制限がない• 挿入:ハッシュ値衝突の際は要素リストの先頭にアイテムを追加する• 削除:ハッシュ値からハッシュ表を特定し、要素リストから削除する• 探索:ハッシュ表の特定は O(1) だが、リストの探索に O(N/B) を要する

– 表の埋まり具合にゆとりを持たせる (N << B) と、 O(1) に近くなる

Page 3: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法開始前

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0]

hashtable[ 1]

hashtable[ 2]

hashtable[ 3]

hashtable[ 4]

hashtable[ 5]

hashtable[ 6]

hashtable[ 7]

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11]

hashtable[12]

jname:ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

↑ ハッシュ表: 同じハッシュ値をもつアイテムへのポインタ配列

←x: ファイルから取り出したレコード 1 件を保持←dummy: ダミーのデータ(重複キーを持つ)

Page 4: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法ハッシュ表初期化

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0] NULL

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4] NULL

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8] NULL

hashtable[ 9] NULL

hashtable[10] NULL

hashtable[11] NULL

hashtable[12] NULL

jname:ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

Page 5: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法レコード 1 件目取り出し

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0] NULL

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4] NULL

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8] NULL

hashtable[ 9] NULL

hashtable[10] NULL

hashtable[11] NULL

hashtable[12] NULL

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

Page 6: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法レコード 1 件目ハッシュ関数計算

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0] NULL

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4] NULL

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8] NULL

hashtable[ 9] NULL

hashtable[10] NULL

hashtable[11] NULL

hashtable[12] NULL

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

hash(“Yokohama Kunihiro”) = 8

Page 7: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法レコード 1 件目ハッシュ表へ登録

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0] NULL

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4] NULL

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9] NULL

hashtable[10] NULL

hashtable[11] NULL

hashtable[12] NULL

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

hash(“Yokohama Kunihiro”) = 8

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

Page 8: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法レコード 2 件目取り出し

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0] NULL

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4] NULL

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9] NULL

hashtable[10] NULL

hashtable[11] NULL

hashtable[12] NULL

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

Page 9: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法レコード 2 件目ハッシュ関数計算

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0] NULL

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4] NULL

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9] NULL

hashtable[10] NULL

hashtable[11] NULL

hashtable[12] NULL

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

hash(“Kanagawa Hanako”) = 4jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

Page 10: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法レコード 2 件目ハッシュ表へ登録

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0] NULL

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9] NULL

hashtable[10] NULL

hashtable[11] NULL

hashtable[12] NULL

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

hash(“Kanagawa Hanako”) = 4jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

Page 11: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法レコード 3 件目取り出し

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0] NULL

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9] NULL

hashtable[10] NULL

hashtable[11] NULL

hashtable[12] NULL

jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

Page 12: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法レコード 3 件目ハッシュ関数計算

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0] NULL

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9] NULL

hashtable[10] NULL

hashtable[11] NULL

hashtable[12] NULL

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

hash(“Hato Saburo”) = 8

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

Page 13: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法レコード 3 件目ハッシュ表へ登録

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0] NULL

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9] NULL

hashtable[10] NULL

hashtable[11] NULL

hashtable[12] NULL

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

hash(“Hato Saburo”) = 8jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

id: Hato Saburo hash: 8

next:

Page 14: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法レコード 4 件目取り出し

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0] NULL

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9] NULL

hashtable[10] NULL

hashtable[11] NULL

hashtable[12] NULL

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

id: Hato Saburo hash: 8

next:

Page 15: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法レコード 4 件目ハッシュ関数計算

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0] NULL

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9] NULL

hashtable[10] NULL

hashtable[11] NULL

hashtable[12] NULL

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

hash(“Hojo Umeko”) = 9

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

id: Hato Saburo hash: 8

next:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

Page 16: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法レコード 4 件目ハッシュ表へ登録

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0] NULL

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10] NULL

hashtable[11] NULL

hashtable[12] NULL

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

id: Hato Saburo hash: 8

next:

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

hash(“Hojo Umeko”) = 9jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

Page 17: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法レコード 5 件目取り出し

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0] NULL

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10] NULL

hashtable[11] NULL

hashtable[12] NULL

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

id: Hato Saburo hash: 8

next:

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

Page 18: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法レコード 5 件目ハッシュ関数計算

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0] NULL

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10] NULL

hashtable[11] NULL

hashtable[12] NULL

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

hash(“Ashigara Kintaro”) = 0

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

id: Hato Saburo hash: 8

next:

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

Page 19: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法レコード 5 件目ハッシュ表へ登録

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10] NULL

hashtable[11] NULL

hashtable[12] NULL

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

id: Hato Saburo hash: 8

next:

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

hash(“Ashigara Kintaro”) = 0jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

Page 20: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法レコード 6 件目取り出し

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10] NULL

hashtable[11] NULL

hashtable[12] NULL

jname: 上野蘭々ename: Ueno Ranran

addr : 台東区上野公園

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

id: Hato Saburo hash: 8

next:

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

Page 21: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法レコード 6 件目ハッシュ関数計算

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10] NULL

hashtable[11] NULL

hashtable[12] NULL

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

hash(“Ueno Ranran”) = 9

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

id: Hato Saburo hash: 8

next:

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

jname: 上野蘭々ename: Ueno Ranran

addr : 台東区上野公園

Page 22: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法レコード 6 件目ハッシュ表へ登録

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10] NULL

hashtable[11] NULL

hashtable[12] NULL

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

id: Hato Saburo hash: 8

next:

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

hash(“Ueno Ranran”) = 9jname: 上野蘭々ename: Ueno Ranran

addr : 台東区上野公園

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 上野蘭々ename: Ueno Ranran

addr : 台東区上野公園

id: Ueno Ranran hash: 9

next:

Page 23: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法レコード 7 件目取り出し

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10] NULL

hashtable[11] NULL

hashtable[12] NULL

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

id: Hato Saburo hash: 8

next:

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 上野蘭々ename: Ueno Ranran

addr : 台東区上野公園

id: Ueno Ranran hash: 9

next:

Page 24: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法レコード 7 件目ハッシュ関数計算

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10] NULL

hashtable[11] NULL

hashtable[12] NULL

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

hash(“Mitsuki Mausu”) = 10

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

id: Hato Saburo hash: 8

next:

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 上野蘭々ename: Ueno Ranran

addr : 台東区上野公園

id: Ueno Ranran hash: 9

next:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

Page 25: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法レコード 7 件目ハッシュ表へ登録

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

id: Hato Saburo hash: 8

next:

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 上野蘭々ename: Ueno Ranran

addr : 台東区上野公園

id: Ueno Ranran hash: 9

next:

hash(“Mitsuki Mausu”) = 10jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

Page 26: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法レコード 8 件目取り出し

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: 野比寅右衛門ename: Nobi Toraemon

addr : 横須賀市野比

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

id: Hato Saburo hash: 8

next:

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 上野蘭々ename: Ueno Ranran

addr : 台東区上野公園

id: Ueno Ranran hash: 9

next:

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

Page 27: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法レコード 8 件目ハッシュ関数計算

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

hash(“Nobi Toraemon”) = 0

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

id: Hato Saburo hash: 8

next:

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 上野蘭々ename: Ueno Ranran

addr : 台東区上野公園

id: Ueno Ranran hash: 9

next:

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

jname: 野比寅右衛門ename: Nobi Toraemon

addr : 横須賀市野比

Page 28: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法レコード 8 件目ハッシュ表へ登録

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

id: Hato Saburo hash: 8

next:

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 上野蘭々ename: Ueno Ranran

addr : 台東区上野公園

id: Ueno Ranran hash: 9

next:

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

hash(“Nobi Toraemon”) = 0jname: 野比寅右衛門ename: Nobi Toraemon

addr : 横須賀市野比data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 野比寅右衛門ename: Nobi Toraemon

addr : 横須賀市野比

id: Nobi Toraemon hash: 0

next:

Page 29: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法登録後

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

id: Hato Saburo hash: 8

next:

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 上野蘭々ename: Ueno Ranran

addr : 台東区上野公園

id: Ueno Ranran hash: 9

next:

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

data:

jname: 野比寅右衛門ename: Nobi Toraemon

addr : 横須賀市野比

id: Nobi Toraemon hash: 0

next:hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

↑ ハッシュ表の状態が印刷される

Page 30: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法重複データ登録の試み

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

id: Hato Saburo hash: 8

next:

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 上野蘭々ename: Ueno Ranran

addr : 台東区上野公園

id: Ueno Ranran hash: 9

next:

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

data:

jname: 野比寅右衛門ename: Nobi Toraemon

addr : 横須賀市野比

id: Nobi Toraemon hash: 0

next:hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

Page 31: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法重複データ登録の試み

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

id: Hato Saburo hash: 8

next:

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 上野蘭々ename: Ueno Ranran

addr : 台東区上野公園

id: Ueno Ranran hash: 9

next:

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

data:

jname: 野比寅右衛門ename: Nobi Toraemon

addr : 横須賀市野比

id: Nobi Toraemon hash: 0

next:hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

“Yokohama Kunihiro” は、すでに登録されているので登録拒否

hash(“Yokohama Kunihiro”) = 8

Page 32: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法探索 1

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

id: Hato Saburo hash: 8

next:

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 上野蘭々ename: Ueno Ranran

addr : 台東区上野公園

id: Ueno Ranran hash: 9

next:

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

data:

jname: 野比寅右衛門ename: Nobi Toraemon

addr : 横須賀市野比

id: Nobi Toraemon hash: 0

next:hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

found <(8) Hato Saburo 鳩三郎 鎌倉市小町 >ハッシュ値 8 をもつリストを探索すれば見つかる

hash(“Hato Saburo”) = 8

Page 33: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法探索 2

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

id: Hato Saburo hash: 8

next:

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 上野蘭々ename: Ueno Ranran

addr : 台東区上野公園

id: Ueno Ranran hash: 9

next:

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

data:

jname: 野比寅右衛門ename: Nobi Toraemon

addr : 横須賀市野比

id: Nobi Toraemon hash: 0

next:hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

found <(8) Yokohama Kunihiro 横浜国大 横浜市保土ヶ谷区常盤台 >同じハッシュ値をもつ場合には、リスト内を順次探索する

hash(“Yokohama Kunihiro”) = 8

Page 34: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法削除 1

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

id: Hato Saburo hash: 8

next:

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 上野蘭々ename: Ueno Ranran

addr : 台東区上野公園

id: Ueno Ranran hash: 9

next:

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

data:

jname: 野比寅右衛門ename: Nobi Toraemon

addr : 横須賀市野比

id: Nobi Toraemon hash: 0

next:hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

Page 35: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法削除 1: 探索

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 鳩三郎ename: Hato Saburo

addr : 鎌倉市小町

id: Hato Saburo hash: 8

next:

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 上野蘭々ename: Ueno Ranran

addr : 台東区上野公園

id: Ueno Ranran hash: 9

next:

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

data:

jname: 野比寅右衛門ename: Nobi Toraemon

addr : 横須賀市野比

id: Nobi Toraemon hash: 0

next:hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

hash(“Hato Saburo”) = 8

Page 36: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法削除 1: リストからの削除

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 上野蘭々ename: Ueno Ranran

addr : 台東区上野公園

id: Ueno Ranran hash: 9

next:

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

data:

jname: 野比寅右衛門ename: Nobi Toraemon

addr : 横須賀市野比

id: Nobi Toraemon hash: 0

next:hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

hash(“Hato Saburo”) = 8

Page 37: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法削除 2

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 上野蘭々ename: Ueno Ranran

addr : 台東区上野公園

id: Ueno Ranran hash: 9

next:

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

data:

jname: 野比寅右衛門ename: Nobi Toraemon

addr : 横須賀市野比

id: Nobi Toraemon hash: 0

next:hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

Page 38: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法削除 2: 探索

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 上野蘭々ename: Ueno Ranran

addr : 台東区上野公園

id: Ueno Ranran hash: 9

next:

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

data:

jname: 野比寅右衛門ename: Nobi Toraemon

addr : 横須賀市野比

id: Nobi Toraemon hash: 0

next:hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

hash(“Ueno Ranran”) = 9

Page 39: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法削除 2: リストからの削除

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

data:

jname: 野比寅右衛門ename: Nobi Toraemon

addr : 横須賀市野比

id: Nobi Toraemon hash: 0

next:hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

hash(“Ueno Ranran”) = 9

Page 40: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法削除 3

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

data:

jname: 野比寅右衛門ename: Nobi Toraemon

addr : 横須賀市野比

id: Nobi Toraemon hash: 0

next:hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

Page 41: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法削除 3: 探索

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

data:

jname: 野比寅右衛門ename: Nobi Toraemon

addr : 横須賀市野比

id: Nobi Toraemon hash: 0

next:hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

hash(“Nobi Toraemon”) = 0

Page 42: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法削除 3: リストからの削除

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

hash(“Nobi Toraemon”) = 0

Page 43: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法削除 4

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

Page 44: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法削除 4: 探索

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

hash(“Nanashi Gonbei”) = 8

特定されたハッシュ値からリストを探索したが、発見できなかった

Page 45: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法削除 5

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

Page 46: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法削除 5: 探索

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 横浜国大ename: Yokohama Kunihiro

addr : 横浜市保土ヶ谷区常盤台

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

hash(“Yokohama Kunihiro”) = 8

Page 47: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法削除 5: リストからの削除

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8] NULL

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

hash(“Yokohama Kunihiro”) = 8

※ 削除されたのは、同じキーを持った要素だったことに注意

Page 48: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法削除後

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8] NULL

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

Page 49: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法探索

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8] NULL

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

hash(“Hato Saburo”) = 8hash(“Yokohama Kunihiro”) = 8

どちらもハッシュ表を参照するだけで、存在しないことが分かる

Page 50: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法挿入

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8] NULL

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

hash(“Yokohama Kunihiro”) = 8

今回挿入するレコードの内容は、 dummy に書かれている内容であることに注意

Page 51: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法挿入

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

hash(“Yokohama Kunihiro”) = 8

今回挿入するレコードの内容は、 dummy に書かれている内容であることに注意

data:

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

id: Yokohama Kunihiro hash: 8

next: NULL

Page 52: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法挿入後

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

今回挿入するレコードの内容は、 dummy に書かれている内容であることに注意

data:

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

id: Yokohama Kunihiro hash: 8

next: NULL

Page 53: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法探索 1

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULL

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

hashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

data:

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

id: Yokohama Kunihiro hash: 8

next: NULL

hash(“Yokohama Kunihiro”) = 8

found <(8) Yokohama Kunihiro 横浜邦博 横浜市中区日本大通 >今度の結果は、先ほど新たに挿入されたデータであることに注意

Page 54: アルゴリズムとデータ構造 補足資料 14-2 「ダイレクトチェイニング法」

ダイレクトチェイニング法終了直前の状態

/* ハッシュ表初期化 */ makenull(hashtable); printhashtable(hashtable);

/* 初期データ登録 */ while( getrecord(&x) ) insert(&x, x.ename, hashtable); printhashtable(hashtable); /* 重複データの登録試み */ insert(&dummy, dummy.ename, hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* ハッシュ表からのデータ削除 */ delete("Hato Saburo", hashtable); delete("Ueno Ranran", hashtable); delete("Nobi Toraemon", hashtable); delete("Nanashi Gonbei", hashtable); delete(dummy.ename, hashtable); printhashtable(hashtable);

/* ハッシュ表を対象とした探索 */ printsearch("Hato Saburo", hashtable); printsearch(dummy.ename, hashtable);

/* 再登録・再探索 */ printf("===Re-insert===\n"); insert(&dummy, dummy.ename, hashtable); printsearch(dummy.ename, hashtable); printsearch("Mitsuki Mausu", hashtable); printhashtable(hashtable);

data:

jname: 神奈川花子ename: Kanagawa Hanako

addr : 横浜市神奈川区三ッ沢上町

id: Kanagawa Hanako hash: 4

next: NULL

data:

jname: 北条梅子ename: Hojo Umeko

addr : 小田原市城山

id: Hojo Umeko hash: 9

next: NULL

data:

jname: 足柄金太郎ename: Ashigara Kintaro

addr : 南足柄市金時山

id: Ashigara Kintaro hash: 0

next: NULLhashtable[ 0]

hashtable[ 1] NULL

hashtable[ 2] NULL

hashtable[ 3] NULL

hashtable[ 4]

hashtable[ 5] NULL

hashtable[ 6] NULL

hashtable[ 7] NULL

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11] NULL

hashtable[12] NULL

jname: ename:

addr :

struct record x

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

struct record dummystruct item *hashtable[B]

data:

jname: 横浜邦博ename: Yokohama Kunihiro

addr : 横浜市中区日本大通

id: Yokohama Kunihiro hash: 8

next: NULL

data:

jname: 三月磨臼ename: Mitsuki Mausu

addr : 浦安市舞浜

id: Mitsuki Mausu hash: 10

next: NULL

まとめ •動的データ管理: 探索、挿入、削除• ハッシュ表の該当箇所を見つけるには、 O(1) : 登録済みのデータ件数には依存しない• ハッシュ表の要素リストの中からアイテムを見つけるには、リストの要素数に依存 O( N/B ) ( 平均 )