• 検索結果がありません。

外部ハッシュ法

N/A
N/A
Protected

Academic year: 2021

シェア "外部ハッシュ法"

Copied!
54
0
0

読み込み中.... (全文を見る)

全文

(1)

アルゴリズムとデータ構造 補足資料 14-2

「ダイレクトチェイニング法」

(2)

外部ハッシュ法

サンプルプログラム: directchaining.c

• ダイレクトチェイニング法/外部ハッシュ法

• 指定された ID に対してハッシュ値を作成

• アイテムは要素リストに格納される

• ハッシュ表はリスト先頭を保持

• 格納できる長さに制限がない

• 挿入:ハッシュ値衝突の際は要素リストの先頭にアイテムを追加する

削除:ハッシュ値からハッシュ表を特定し、要素リストから削除する

(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);

hashtable[ 0]

hashtable[ 1]

hashtable[ 2]

hashtable[ 3]

hashtable[ 4]

hashtable[ 5]

hashtable[ 6]

hashtable[ 7]

hashtable[ 8]

hashtable[ 9]

hashtable[10]

hashtable[11]

jname:

ename:

addr :

struct record x

jname: 横浜邦博

ename: Yokohama Kunihiro addr : 横浜市中区日本大通

struct record dummy

struct item *hashtable[B]

←x: ファイルから取り出したレコード 1 件を保持

←dummy: ダミーのデータ(重複キーを持つ)

(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);

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 jname:

ename:

addr :

struct record x

jname: 横浜邦博

ename: Yokohama Kunihiro addr : 横浜市中区日本大通

struct record dummy

struct item *hashtable[B]

(5)

ダイレクトチェイニング法 レコード 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);

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 jname: 横浜国大

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

struct record x

jname: 横浜邦博

ename: Yokohama Kunihiro addr : 横浜市中区日本大通

struct record dummy

struct item *hashtable[B]

(6)

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

レコード 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);

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 jname: 横浜国大

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

struct record x

jname: 横浜邦博

ename: Yokohama Kunihiro addr : 横浜市中区日本大通

struct record dummy

struct item *hashtable[B]

hash(“Yokohama Kunihiro”) = 8

(7)

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

レコード 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);

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 jname: 横浜国大

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

struct record x

jname: 横浜邦博

ename: Yokohama Kunihiro addr : 横浜市中区日本大通

struct record dummy

struct item *hashtable[B]

hash(“Yokohama Kunihiro”) = 8

data:

jname: 横浜国大

ename: Yokohama Kunihiro addr : 横浜市保土ヶ谷区常盤台 id: Yokohama Kunihiro hash: 8

next: NULL

(8)

ダイレクトチェイニング法 レコード 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);

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 jname: 神奈川花子

ename: Kanagawa Hanako addr : 横浜市神奈川区三ッ沢上

struct record x

jname: 横浜邦博

ename: Yokohama Kunihiro addr : 横浜市中区日本大通

struct record dummy

struct item *hashtable[B]

data:

jname: 横浜国大

ename: Yokohama Kunihiro addr : 横浜市保土ヶ谷区常盤台 id: Yokohama Kunihiro hash: 8

next: NULL

(9)

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

レコード 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);

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

struct record x

jname: 横浜邦博

ename: Yokohama Kunihiro addr : 横浜市中区日本大通

struct record dummy

struct item *hashtable[B]

hash(“Kanagawa Hanako”) = 4

jname: 神奈川花子 ename: Kanagawa Hanako addr : 横浜市神奈川区三ッ沢上

data:

jname: 横浜国大

ename: Yokohama Kunihiro addr : 横浜市保土ヶ谷区常盤台 id: Yokohama Kunihiro hash: 8

next: NULL

(10)

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

レコード 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);

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

struct record x

jname: 横浜邦博

ename: Yokohama Kunihiro addr : 横浜市中区日本大通

struct record dummy

struct item *hashtable[B]

data:

jname: 横浜国大

ename: Yokohama Kunihiro addr : 横浜市保土ヶ谷区常盤台 id: Yokohama Kunihiro hash: 8

next: NULL

hash(“Kanagawa Hanako”) = 4

jname: 神奈川花子 ename: Kanagawa Hanako addr : 横浜市神奈川区三ッ沢上

data:

jname: 神奈川花子 ename: Kanagawa Hanako addr : 横浜市神奈川区三ッ沢上

id: Kanagawa Hanako hash:

4

next: NULL

(11)

ダイレクトチェイニング法 レコード 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);

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 jname: 鳩三郎

ename: Hato Saburo addr : 鎌倉市小町

struct record x

jname: 横浜邦博

ename: Yokohama Kunihiro addr : 横浜市中区日本大通

struct record dummy

struct 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

(12)

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

レコード 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);

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

struct record x

jname: 横浜邦博

ename: Yokohama Kunihiro addr : 横浜市中区日本大通

struct record dummy

struct 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 : 鎌倉市小町

(13)

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

レコード 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);

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

struct record x

jname: 横浜邦博

ename: Yokohama Kunihiro addr : 横浜市中区日本大通

struct record dummy

struct item *hashtable[B]

data:

jname: 神奈川花子 ename: Kanagawa Hanako addr : 横浜市神奈川区三ッ沢上

id: Kanagawa Hanako hash:

4

next: NULL

hash(“Hato Saburo”) = 8

jname: 鳩三郎 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:

(14)

ダイレクトチェイニング法 レコード 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);

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 jname: 北条梅子

ename: Hojo Umeko addr : 小田原市城山

struct record x

jname: 横浜邦博

ename: Yokohama Kunihiro addr : 横浜市中区日本大通

struct record dummy

struct 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:

(15)

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

レコード 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);

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

struct record x

jname: 横浜邦博

ename: Yokohama Kunihiro addr : 横浜市中区日本大通

struct record dummy

struct 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 : 小田原市城山

(16)

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

レコード 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);

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

struct record x

jname: 横浜邦博

ename: Yokohama Kunihiro addr : 横浜市中区日本大通

struct record dummy

struct 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”) = 9

jname: 北条梅子 ename: Hojo Umeko addr : 小田原市城山

(17)

ダイレクトチェイニング法 レコード 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);

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 jname: 足柄金太郎

ename: Ashigara Kintaro addr : 南足柄市金時山

struct record x

jname: 横浜邦博

ename: Yokohama Kunihiro addr : 横浜市中区日本大通

struct record dummy

struct 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

(18)

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

レコード 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);

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

struct record x

jname: 横浜邦博

ename: Yokohama Kunihiro addr : 横浜市中区日本大通

struct record dummy

struct 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 : 南足柄市金時山

(19)

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

レコード 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);

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

struct record x

jname: 横浜邦博

ename: Yokohama Kunihiro addr : 横浜市中区日本大通

struct record dummy

struct 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”) = 0

jname: 足柄金太郎

ename: Ashigara Kintaro addr : 南足柄市金時山

data:

jname: 足柄金太郎

ename: Ashigara Kintaro addr : 南足柄市金時山 id: Ashigara Kintaro hash: 0

next: NULL

(20)

ダイレクトチェイニング法 レコード 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);

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 jname: 上野蘭々

ename: Ueno Ranran addr : 台東区上野公園

struct record x

jname: 横浜邦博

ename: Yokohama Kunihiro addr : 横浜市中区日本大通

struct record dummy

struct 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

(21)

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

レコード 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);

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

struct record x

jname: 横浜邦博

ename: Yokohama Kunihiro addr : 横浜市中区日本大通

struct record dummy

struct 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 : 台東区上野公園

(22)

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

レコード 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);

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

struct record x

jname: 横浜邦博

ename: Yokohama Kunihiro addr : 横浜市中区日本大通

struct record dummy

struct 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”) = 9

jname: 上野蘭々 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:

(23)

ダイレクトチェイニング法 レコード 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);

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 jname: 三月磨臼

ename: Mitsuki Mausu addr : 浦安市舞浜

struct record x

jname: 横浜邦博

ename: Yokohama Kunihiro addr : 横浜市中区日本大通

struct record dummy

struct 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:

(24)

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

レコード 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);

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

struct record x

jname: 横浜邦博

ename: Yokohama Kunihiro addr : 横浜市中区日本大通

struct record dummy

struct 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 : 浦安市舞浜

(25)

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

レコード 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);

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

struct record x

jname: 横浜邦博

ename: Yokohama Kunihiro addr : 横浜市中区日本大通

struct record dummy

struct 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”) = 10

jname: 三月磨臼 ename: Mitsuki Mausu addr : 浦安市舞浜

参照

関連したドキュメント

図-6 LL補強土工法の構造図 の塩害地帯でも,非常に長期間の耐久性が期待できることになる. 4

アルゴリズムと アルゴリズムと データ構造 データ構造

アルゴリズムと データ構造 整列のアルゴリズム 塩浦昭義 情報科学研究科 准教授

表1NSコース, ITCコースの必修科目の比較 NS2001 NS2005 ITC2006 ネットワークシステム総合演習

線形リストが長くなった場合,探索やデータの削除の処理が重くなり,データ数はハッシュ表の数倍程

 アルゴリズムとデータ構造 I,II で学んだ事柄の 復習.

 アルゴリズムとデータ構造 I,II で学んだ事柄の 発展的な内容を扱う.. 

 アルゴリズムとデータ構造 I,II で学んだ事柄の 発展的な内容を扱う.. 