データ構造と アルゴリズム 第十一回 理工学部 情報システム工学科 新田直也.

Slides:



Advertisements
Similar presentations
1 T HE U NIVERSITY OF T OKYO D EPARTMENT OF M ATHEMATICAL I NFORMATICS 数理情報工学演習第一C プログラミング演習 ( 第 6 回 ) 2014/05/19.
Advertisements

2分探索.
ふん Counters – 分 – minutes
データ構造とアルゴリズム論 第6章 探索のアルゴリズム
データ構造とアルゴリズム 第10回 mallocとfree
データ構造と アルゴリズム 理工学部 情報システム工学科 新田直也.
データ構造とプログラミング技法 (第8回) ーデータの探索ー.
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造 第3回基本的なデータ構造(リスト) 2015/10/28 アルゴリズムとデータ構造 2015.
データ構造と アルゴリズム 第二回 知能情報学部 新田直也.
アルゴリズムとデータ構造 補足資料7-3 「単純選択ソートselsort.c」
データ構造と アルゴリズム 知能情報学部 新田直也.
岩井 儀雄 コンピュータ基礎演習  ー探索、整列ー 岩井 儀雄
問題 1 キーボードから入力した数の合計を計算するプログラムを 作成せよ。最初に、何個の数を入力するかその数を入力 するようにする。
エージェントを管理するボスの苦悩 問題 n人のエージェントを部下に持つボスがいる. エージェントは出張・帰還を頻繁に繰り返す.
データ構造と アルゴリズム 第八回 知能情報学部 新田直也.
アルゴリズムとデータ構造 2011年6月20日
集合、辞書とハッシュ法 第8回 集合と辞書 ~ データ構造(4)~.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
第13回 ハッシュテーブルを使ったプログラム ~高速に検索するには?~.
ハッシュテーブル.
ハッシュ表 データ構造とプログラミング(12)
データ構造とアルゴリズム 第4回 リスト ~ データ構造(1)~.
アルゴリズムとデータ構造1 2006年6月16日
プログラミング 4 記憶の割り付け.
アルゴリズムとデータ構造1 2005年7月15日
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
オブジェクト指向 プログラミング 第七回 知能情報学部 新田直也.
第7回 プログラミングⅡ 第7回
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
第9回 優先度つき待ち行列,ヒープ,二分探索木
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
データ構造と アルゴリズム 第六回 知能情報学部 新田直也.
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
アルゴリズムとデータ構造1 2009年7月9日
アルゴリズムとデータ構造1 2005年7月5日
アルゴリズムとプログラミング (Algorithms and Programming)
先進的計算基盤システムシンポジウム SACSIS2007併設企画 マルチコアプログラミングコンテスト 「Cellスピードチャレンジ2007」
プログラミング 4 整列アルゴリズム.
2005年度 データ構造とアルゴリズム 第6回 「ハッシュ法を用いた探索」
プログラミング 4 探索と計算量.
簡易データベース 情報画像工学実験 I : 実験2 担当:関屋大雄(工学部1号棟515室)
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
生物情報ソフトウェア特論 (2)たたみ込みとハッシュに 基づくマッチング
データ構造とアルゴリズム 第11回 リスト構造(1)
5.サーチ 5-1.線形探索 5-2.2分探索 5-3.ハッシュ.
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
第9回 優先度つき待ち行列,ヒープ,二分探索木
アルゴリズムとデータ構造1 2006年7月4日
アルゴリズムとデータ構造1 2006年6月23日
情報工学概論 (アルゴリズムとデータ構造)
第11回放送授業.
アルゴリズムとデータ構造 補足資料11-3 「線形リストのオペレータ」
ヒープソート.
What's missing? 何が消えたかな?英語で言ってみよう!.
アルゴリズムとデータ構造 2012年6月21日
参考:大きい要素の処理.
新人研修発表 平成13年5月14日(月) 探索アルゴリズム ハッシュ法について 株式会社 エーアイネット・テクノロジ          須田 哲生.
情報生命科学特別講義III (3)たたみ込みとハッシュに 基づくマッチング
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
データ構造と アルゴリズムI 第三回 知能情報学部 新田直也.
アルゴリズムとデータ構造1 2005年7月12日
アルゴリズムとデータ構造1 2007年7月6日
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
TList リスト構造とは? 複数のデータを扱うために、 データの内容と、次のデータへのポインタを持つ構造体を使う。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング論 バイナリーサーチ 1.
Presentation transcript:

データ構造と アルゴリズム 第十一回 理工学部 情報システム工学科 新田直也

時間計算量のまとめ 登録 探索 削除 線形探索法 (最悪・平均) O(1) O(n) 二分探索法 (最悪・平均) O(log n) 二分探索木 (最悪) 二分探索木 (平均) AVL木探索 (最悪) 時間計算量のまとめ

探索 探索: 表からデータを探し出す. Key Data 1 90 5 50 6 80 8 95 10 35

ハッシュ法の考え方(1) Key値の取りうる範囲が,予めわかっている場合. Key Data 1 90 5 50 6 80 8 95 10 2 なし 3 4 5 50 6 80 7 8 95 9 10 35 Key Data 1 90 5 50 6 80 8 95 10 35 配列など →O(1)で探索できる.

ハッシュ法の考え方(2) 前頁のようなデータ構造の問題点 Key値のとりうる範囲が広いと,データサイズは膨大に. メモリ領域に収まるよう圧縮しよう.(ハッシュ関数) a ab aa : 100種類の値 1208925819614629174706176種類の値

ハッシュ関数の例 すべての文字コードを加算し,100で割った余りを求める. int hash(char s[]) { int i = 0; 文字列 ハッシュ値 one 22 two 46 three 36 four 44 five 26 six 40 seven 45 eight 29 nine ten 27 int hash(char s[]) { int i = 0; int n; for (n = 0; s[n] != 0; n++) { i = i + s[n]; } return i % 100;

ハッシュ関数を用いた登録,探索 ハッシュ値の取りうる範囲と 同じサイズの配列を用意. (前頁の例では,100個) Key のハッシュ値を求める. (”two”の場合,46) ハッシュ値が指す配列要素 にデータを登録する. (46番目の要素に登録) 文字列 ハッシュ値 one 22 two 46 three 36 four 44 five 26 six 40 seven 45 eight 29 nine ten 27

ハッシュ値の衝突 ハッシュ値の取りうる範囲と 同じサイズの配列を用意. (前頁の例では,100個) Key のハッシュ値を求める. (”two”の場合,46) ハッシュ値が指す配列要素 にデータを登録する. (46番目の要素に登録) 文字列 ハッシュ値 one 22 two 46 three 36 four 44 five 26 six 40 seven 45 eight 29 nine ten 27 → ”five” と ”nine” のデータが ぶつかる.(衝突)

チェイン法(1) ハッシュ値が衝突すると,データが上書きされる. →同じ場所にデータを任意個記憶できるようにすればよい. key ハッシュ値 ハッシュ値が衝突すると,データが上書きされる. →同じ場所にデータを任意個記憶できるようにすればよい. key ハッシュ値 Data なし 1 : 26 92?  17?  204?  39? 99 “five” 92 17 “nine” 204 “zh” 39 “yi”

チェイン法(2) 同じハッシュ値を持つデータを連結リストでつなぐ. key ハッシュ表 ハッシュ値 Data NULL 1 : 26 99 NULL 1 : 26 99 “five” 92 17 “nine” … “five” 92 “nine” 17 204 “zh” 39 “yi” バケット

チェイン法(3) チェイン法のデータ構造. #define BUCKET_SIZE 100 struct CELL { int key; int data; strucr CELL *next; }; struct CELL *table[BUCKET_SIZE];

チェイン法の計算量 データ数をN,バケット数をBとする. 平均時間計算量について 平均時間計算量: O(1 + N/B)

オープンアドレス法 ハッシュして同じ場所を指した場合,別の場所を探す. 別の場所を探す手続きを再ハッシュと呼ぶ. 再ハッシュは繰り返し実行できる. key ハッシュ値 Data 1 : 26 53 99 “five” 204 “nine” 92 “zh” 17

オープンアドレス法の登録 オープンアドレス法の登録手続き: x: キー, hk(x): 再ハッシュをk回繰り返して得られる値 k := 0 k = B ならエラー終了,そうでなければ 2. へ hk(x)番目のバケットにデータを書き込む

再ハッシュの例 最も単純な例: 適当なハッシュ関数 h に対して hk(x) = (h(x) + k) mod B とする. これは連続するバケットを順に調べていくことに対応.

オープンアドレス法の削除(1) 単純に削除を行うと問題が発生. key ハッシュ表 ハッシュ値 Data 1 : 26 92 27 17 1 : 26 92 27 17 28 204 29 39 99 “five” 92 17 “nine” 204 “zh” “nine”のデータを 「空き」にすると, 続きが探索できな くなる. 39 “yi” 孤立してしまう!!

オープンアドレス法の削除(2) 「削除済」という特別な値を用意し,続きがあることを示す. key ハッシュ表 ハッシュ値 Data 1 : 1 : 26 92 27 削除済 28 204 29 39 99 “five” 92 17 “nine” 204 “zh” “nine”のデータを 「削除済」に設定 する. 39 “yi”

良い再ハッシュ法(1) 先に示した単純な再ハッシュ法は次のような問題を持つ. ハッシュ値 Data : 26 27 28 29 30 99 : 26 27 28 29 30 99 ハッシュ値26を持つ データの系列 ハッシュ値28を持つ データの系列 一度重なると その後ずっと 重なってしまう

良い再ハッシュ法(2) 単純な再ハッシュ法では,以下の関係が成り立ってしまう. hk1(x1) = hk2(x2) ⇒ hk1+1(x1) = hk2+1(x2) hk(x) = (h(x) + k) mod B ランダム置換(並べ替え) k nk hk(x) = (h(x) + nk) mod B

オープンアドレス法の計算量 α = 登録バケット数 / 全バケット数 探索の平均時間計算量 連続領域で再ハッシュ: 成功: O((1-α/2)/(1-α)) 失敗: O(1/2+1/(2(1-α)2)) ランダムに再ハッシュ: 成功: O(1/α・loge(1/(1-α))) 失敗: O(1/(1-α))