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

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

N/A
N/A
Protected

Academic year: 2021

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

Copied!
23
0
0

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

全文

(1)

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

第5週 文字列照合(BM法)、木の構造

2013年10月24日 金岡 晃

(2)

授業計画

第1週 (9/26)

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

第2週 (10/3)

アルゴリズムの効率、線形構造 第3週

(10/10)

スタックと待ち行列 第4週

(10/17)

文字列照合(KMP法、BM法)

第5週 (10/24)

木構造、木の走査

→文字列照合(BM法)、木構 造

第6週 (10/31)

二分木、決定木 第7週

(11/14)

中間試験

第8週 (11/21)

休講 第9週

(11/28)

グラフ構造と最短路問題 第10週

(12/5)

解の探索:Aアルゴリズム 第11週

(12/12)

データ整列:ヒープソート 法

第12週 (12/19)

データ整列:クイックソー ト法

第13週 (1/9)

データ探索:ハッシュ法 第14週

(1/16)

データ探索:木構造探索法 1/22-2/8 期末試験

(3)

【復習】第 4

文字列照合( KMP 法)

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

(4)

文字列照合問題

…… …… ……

1 s s+m-1 n

文字列 text

パターン pat ……

入力済みの文章(文字列、テキスト)から、変更した い単語(パターン)を探し出す処理

文字列照合(文字列パターンマッチング)

文字列中の各文字を text[1], text[2],…,text[n]

パターン中の各文字をpat[1], pat[2],…,pat[m]と表す

1 m

(5)

単純照合法

text pat

1.テキストの先頭にパターンの先頭を合わせる 2.パターンの先頭から文字を比較していく

4.パターンの先頭から文字を比較していく

3.異なる文字が現れた場合、パターンを1文 字文後ろへシフトする

計算の効率

𝑂(𝑚𝑛)

(6)

KMP 法

Knuth-Morris-Pratt法(KMP法)

先頭から照合をしていく場合、照合失敗後のシフト量と 照合開始位置をあらかじめパターンから計算をしておき、

照合を行っていく

アルゴリズムの流れ

パターンpat[1..n]より

シフト量と照合開始位置を決める量 であるfail[1..n]を計算

failの計算

単純照合法と同様にパターンの先頭 から照合していくが、シフト量と照 合開始位置はfail[1..n]に従う

照合

注意

教科書P.83 のfail[i]の定 義式は見ないこと。記載 に矛盾があり混乱を招く。

(7)

パターンの先頭 i 文字を見て ここが照合失敗した場合に

何文字シフトするべきかを数える

KMP 法: fail の導出と利用

failの導出(図解)

パターンを用いて、パターン同士の照合を行い、シフト量を求める

pat A B B C B

fail[1] A 1文字

iからシフト量を引いた数がfail[i]

fail[1]=1-1=0

fail[2] A B 1文字 fail[2]=2-1=1 fail[3] A B B 2文字 fail[3]=3-2=1 fail[4] A B B C 3文字 fail[4]=4-3=1 fail[5] A B B C B 4文字 fail[5]=5-4=1

(8)

• i番目で照合が失敗した場合、i-fail[i]だけ右にシフト

• 照合はpat[fail[i]]から開始する

KMP 法: fail の導出と利用

failの導出

(アルゴリズム)

failの利用

(9)

演習1: KMP 法における fail 導出

パターン “ACAABACABC”の場合の

failの導出を、図解とアルゴリズムを用いて示せ

(10)

5

文字列照合( BM 法)、木の構造

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

(11)

本日の到達目標と概要

• 到達目標

– 文字列照合の代表的なアルゴリズムを理解する – データ構造で代表的な木構造の概要を理解する

• 概要

– 文字列照合アルゴリズム: BM 法 – 木の構造

– ポーランド記法(後置記法)

(12)

BM 法

Boyer-Moore法(BM法)

末尾から照合をしていく場合の照合失敗後のシフト量を

あらかじめパターンから計算をしておき、照合を行っていく

アルゴリズムの流れ

パターンpat[1..m]より シフト量を決める量 shift[1..m]を計算

shiftの計算

パターンの末尾から照合して いくが、照合失敗後のシフト 量はshift[1..m]λ[1..Σ]に従う

照合

各文字がpat上で 最も右に現れる 位置λ[1..Σ]の計算

λの計算

(13)

BM 法: λ の導出

λの導出

(アルゴリズム)

Σはアルファベット全種類の集合

(14)

BM 法: shift の導出

shiftの導出(図解)

パターンを用いて、パターン同士の照合を 行い、シフト量を求める

pat B A B B A B

パターンの末尾 i 文字目を見て ここが照合失敗した場合に

何文字シフトするべきかを数える shift[6] 1文字 shift[6]=1

shift[5] 2文字 shift[5]=2 shift[4] 5文字 shift[4]=5 shift[3] 3文字 shift[3]=3 shift[2] 3文字 shift[2]=3 shift[1] 3文字 shift[1]=3

B A B B A B B A B B A B B A B B A B B A B B A B B A B B A B B A B B A B

(15)

BM 法: shift の導出

shiftの導出

(アルゴリズム)

(16)

BM 法: λ と shift の利用

アルゴリズムの流れ

パターンpat[1..m]より シフト量を決める量 shift[1..m]を計算

shiftの計算

パターンの末尾から照合していくが 照合失敗後のシフト量は

照合を失敗したテキスト場所kの文字text[k]

パターンの場所をiとした場合、

shift[i](i- λ[text[k]) の大きい方の分だけシフトする

照合

各文字がpat上で 最も右に現れる 位置λ[1..Σ]の計算

λの計算

(17)

演習 1 : BM 法における λ と Shift 導出

パターン “BACBABA”の場合の λとshiftの導出を行え。

λはアルゴリズムを用い、

shiftは図解とアルゴリズムを用いて示せ

ただし、

アルファベットは A,B,Cの3文字とする

(18)

2 項演算子と、算術式の木構造

d=a*(b+c)

=

d *

a +

b c

z=y+1/(x-1)

=

z +

y /

1 -

x 1

2項演算子 2つの項を用いて演算を行う演算子

木構造

(19)

算術式の基本構造

演算子

第 1 被演算子 第 2 被演算子

(20)

中置記法と後置記法

• 中置記法

– 演算子が中央に置かれている

A+B

• 前置記法

– 演算子が前に置かれている

+AB

• 後置記法(ポーランド記法)

– 演算子が後ろに置かれている

AB+

人が通常使う記法

コンパイラが通常使う記法

(21)

後置記法の表記例

• 中置記法

A+B*C-D

• 後置記法

ABC*+D-

• 中置記法

E*F+G/H

• 後置記法

EF*GH/+

(22)

演習 2 :木構造とポーランド記法

以下の中置記法で記述された算術式を、木構造と後 置記法(ポーランド記法)でそれぞれ示せ

2-1 : x+y-z

2-2 :

A*B+C*D

(23)

本日の到達目標と概要

• 到達目標

– 文字列照合の代表的なアルゴリズムを理解する – データ構造で代表的な木構造の概要を理解する

• 概要

– 文字列照合アルゴリズム: BM 法 – 木の構造

– ポーランド記法(後置記法)

参照

関連したドキュメント

リングバッファ (46ページ) ¾配列の最初と最後を接続して環にしたもの ¾2つのポインタでデータの出し入れを管理 ¾データの先頭を指すポインタ

授業の計画・内容

単純照合法と同様にパターンの先頭 から照合していくが、シフト量と照 合開始位置は fail[1..n]

挿入:すでに整列している複数のデータの 並びの適切な位置に、あらたな 1 枚を追加

挿入:すでに整列している複数のデータの 並びの適切な位置に、あらたな 1 枚を追加

挿入:すでに整列している複数のデータの 並びの適切な位置に、あらたな 1 枚を追加

クイックソート (quick sort)

クイックソート (quick sort)