alg2015-6r3.ppt

Similar documents
memo

memo

離散数学

Taro-2分探索木Ⅰ(公開版).jtd

Microsoft PowerPoint - kougi10.ppt

PowerPoint Presentation

グラフの探索 JAVA での実装

Taro-2分探索木Ⅱ(公開版).jtd

Microsoft Word - 13

Microsoft PowerPoint - 05.pptx

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

Microsoft Word - 12

LIFO(last in first out, ) 1 FIFO(first in first out, ) 2 2 PUSH POP : 1

Microsoft PowerPoint - algo ppt [互換モード]

人工知能入門

Microsoft PowerPoint - kougi11.ppt

Microsoft PowerPoint - DA2_2018.pptx

Microsoft PowerPoint - 06graph3.ppt [互換モード]

第2回

Microsoft PowerPoint - 06.pptx

プログラミング入門1

始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル

データ構造

オートマトンと言語

プログラム言語及び演習Ⅲ

Microsoft Word - no206.docx

二分木の実装

Taro-リストⅠ(公開版).jtd

Microsoft PowerPoint - algo ppt [互換モード]

CプログラミングI

Microsoft Word - 中間試験 その1_解答例.doc

PowerPoint Presentation

Taro-リストⅢ(公開版).jtd

memo

離散数学

Taro-スタック(公開版).jtd

Microsoft PowerPoint - uninformed.ppt

第12回:木構造

Taro-再帰関数Ⅲ(公開版).jtd

Microsoft PowerPoint - 7.pptx

第2回

i

1. はじめに 二分木ヒープ 様々なアルゴリズムにおいて ある要素の集合またはリストから 最小 な要素を取り 出す必要がある そのような場合に使われる標準的データ構造が二分木ヒープ (binary heap) である あるオブジェクトO を考える そのオブジェクトは ラベル O. label と値

離散数学

Microsoft PowerPoint - 10.ppt [互換モード]

PowerPoint プレゼンテーション

Taro-最大値探索法の開発(公開版

Microsoft PowerPoint - DA2_2019.pptx

2. データ構造ヒープに保存するデータは 番号付けられて保存される 従って リスト L として保存することとする 3. アルゴリズム 3.1. 要素の追加新しい要素の追加は リストの終端に置くことで開始する つまり 最下層の一番右 または新たに最下層を生成してその一番左となる この後 この要素を正し

( ) ( ) 30 ( ) 27 [1] p LIFO(last in first out, ) (push) (pup) 1

PowerPoint Presentation

2. 幅優先探索のアルゴリズムの考え方ふつう考えるように順次経路をたどっていくということから 発想を転換する それにはまず 区間経路を列挙することから始める AB, AC, BC, CB, BD, DE, CE, EC, DE, ED, DF, EG そして経路探索とは このような区間を記したカード

計算機ソフトウエア

Microsoft PowerPoint - 6.pptx

Microsoft PowerPoint - ca ppt [互換モード]

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

Microsoft PowerPoint - mp11-06.pptx

データ構造

(search: ) [1] ( ) 2 (linear search) (sequential search) 1

人工知能論 第1回

プログラミング入門1

Microsoft PowerPoint - ca ppt [互換モード]

Microsoft Word - NonGenTree.doc

PowerPoint プレゼンテーション

Microsoft PowerPoint - kougi9.ppt

Microsoft PowerPoint - DA2_2017.pptx

[Problem F] 古い記憶 良さそうな方法は思いつかなかった アイディア募集中!!! かなり強引に解いている 各判定データに対して 30 秒程度かかる 元の文章と改ざん文章の関係を考える ウィルス感染の可能性は高々 2 回であり 各々の感染では 1 文字削除 1 文字追加 1 文字変更が行われ

Microsoft Word - no12.doc

Microsoft PowerPoint - lecture02.pptx

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

Microsoft PowerPoint - mp13-07.pptx

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

Microsoft PowerPoint - prog03.ppt

自然言語は曖昧性だらけ! I saw a girl with a telescope 構文解析 ( パージング ) は構造的な曖昧性を解消 2

Microsoft PowerPoint - 計算機言語 第7回.ppt

情報処理Ⅰ

alg2015-3r3.ppt

C のコード例 (Z80 と同機能 ) int main(void) { int i,sum=0; for (i=1; i<=10; i++) sum=sum + i; printf ("sum=%d n",sum); 2

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

Taro-cshプログラミングの応用.jt

プログラミングI第10回

DA02

Taro-再帰関数Ⅱ(公開版).jtd

プログラミングA

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

gengo1-11

メソッドのまとめ

memo

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

プログラミングA

Microsoft PowerPoint - å®�æ−•è©¦é¨fi3ㆮ対ç�Œ.pptx

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

2018年度「プログラミング言語」配布資料 (12)

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数

PowerPoint プレゼンテーション

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

# let st1 = {name = "Taro Yamada"; id = };; val st1 : student = {name="taro Yamada"; id=123456} { 1 = 1 ;...; n = n } # let string_of_student {n

INTRODUCTION TO ALGORITHMS

Transcription:

1 アルゴリズムとデータ 構造 第 6 回探索のためのデータ構造 (1) 補稿 : 木の巡回 ( なぞり )

2 木の巡回 ( 第 5 回探索 (1) のスライド ) 木の巡回 * (traverse) とは 木のすべての節点を組織だった方法で訪問すること 深さ優先探索 (depth-first search) による木の巡回 *) 木の なぞり ともいう 2 3 1 3 4 1 4 5 7 10 11 9 5 6 12 8 8 6 7 14 10 13 2 分探索木を中順出力すると整列された要素のリストがえられる! すべての節点の要素を次の 3 種類の順番で出力できる 前順 ( 行きがけ順 preorder) 最初の訪問時に出力 7, 3, 1, 4, 6, 5, 10, 8 中順 ( 通りがけ順 inorder) 左の部分木のなぞりが終わった後に出力 1, 3, 4, 5, 6, 7, 8, 10 後順 ( 帰りがけ順, postorder) 最後の訪問時に出力 1, 5, 6, 4, 3, 8, 10, 7

2017 /04/2 7 木の巡回 (traversal) 重要 n 与えられた根付き木 T の全頂点をちょうど一度ずつ訪問すること 各頂点がちょうど一度ずつ現れるような T の頂点のリストのこと ( 今後はこの意味 ) n 次の用途に用いられる 木構造として表現されたデータの処理 人工知能分野における探索 数式処理と言語処理 グラフアルゴリズムの解法 3

4 クイズ : 迷路の通り方 n 問 : 今 あなたが巨大迷路の中 ( 一番奥の宝の部屋 ) にいる どうやったら 出口まで出られるか? n こたえ? でたらめに歩き回る 分かれ道に来たら かならず決めた方を選ぶ???

5 クイズ : 迷路の通り方 n 問 : 今 あなたが巨大迷路の中 ( 一番奥の宝の部屋 ) にいる どうやったら 出口まで出られるか? n こたえ? 方法 : 右手を壁につけたまま 手を壁から離さないようにして歩く 結果 : すると 必ず出られる * なぜ? *) 迷路の大きさに限りがあるなら

6 木の巡回の種類 重要 n 巡回の方法 : 基本は 根から出発して 全ての頂点を訪問する n 木の探索には大きく分けて 2 種類ある 深さ優先探索 (DFS, Depth-First Search) n 今いる場所からできるだけ深い方へいく n DFS で得られる巡回は 前順 中順 後順の 3 つ 幅優先探索 (BFS, Breadth-First Search) n 深さ ( レベル ) d = 0, 1, 2,... を大きくしていく

7 木の探索 質問 : 二つの探索の違いは何か? 考えてみよう 深さ優先探索 (DFS) 幅優先探索 (BFS) A A level = 1 B C B C level = 2 D E F D E F level = 3 G G level = 4 H 注意 :DFSだけでは 頂点の出力の順番は決まらない 前順 中順 後順 H level = 5

8 木の巡回の種類 n 深さ優先探索で 木の巡回 (traversa = 全頂点リスト ) を出力するには 次の 3 つの方法がある n 前順 ( 行きがけ順 前置順 preorder) n 中順 ( 通りがけ順 中置順 inorder) n 後順 ( 帰りがけ順, postorder)

9 重要 前順 (preorder) n 行きがけ順 前置順ともいう D B E A F C n 各頂点 v を最初に訪問する時に 頂点番号を出力する 内部頂点は 上から来たときに出力される 葉は訪問したときに出力される n 結果として 木の頂点は上から下向きに出力される H G PREORDER の巡回 1 2 3 4 5 6 7 8 A, B, D, E, H, G, C, H

10 前順 : 難しい人はこう考えよう! 3 D 2 B 4 1 E A 8 7 F C n ルール : 各頂点 v を最初に訪問する時に 頂点番号を出力する n 考え方 : 1) まず 根から全部の頂点を一筆書きで回る道を書く 2) この道で頂点の左側 ( 最初 5 に頂点に来た時 ) に赤丸を 6 H G 書く ( 中順は下 後順は右 ) PREORDERの巡回 3) 赤丸で頂点番号を出力する A, B, D, E, H, G, C, H

11 再 : 前順 (preorder) n 行きがけ順 前置順ともいう 1 A n 各頂点 v を最初に訪問する時に 頂点番号を出力する 3 D 2 5 B H 4 E 6 8 G 7 F C 内部頂点は 上から来たときに出力される 葉は訪問したときに出力される n 結果として 木の頂点は上から下向きに出力される PREORDER の巡回 1 2 3 4 5 6 7 8 A, B, D, E, H, G, C, H

12 中順 (inorder) n 通りがけ順 中置順ともいう D 1 B 2 H 3 E 4 A 6 G 5 F 7 C 8 n 各頂点 v を ( 左から右へ ) 途中で訪問する時に 頂点番号を出力する n 結果として 木の頂点は 左から右へ並んだ順で出力される INORDER の巡回 1 2 3 4 5 6 7 8 D, B, H, E, G, A, F, C

13 重要 後順 (postorder) n 帰りがけ順 後置順ともいう D 1 B H 2 5 E A 4 8 G F 3 C 6 7 n 各頂点 v を ( 下から上に ) 最後に訪問する時に 頂点番号を出力する n 結果として 木の頂点は 下から上向きに出力される POSTORDER の巡回 1 2 3 4 5 6 7 8 D, H, G, E, B, F, C, A

14 演習問題 : 次の問に答えよ. 問 1. 右の木 T の前順と, 中順, 後順の巡回を書け. 問 2. 前順と 中順 後順の巡回を出力する再帰プログラム preorder と inorder postorder を書け. 問 3. 再帰を使わないでループでプログラムを書くにはどうするか? * + 2 3 8 2 // 前順巡回を出力するプログラム void preorder(node *v) { v を出力する ; preorder(v->left); preorder(v->right); void main() { preorder(root) // 木の根 /

15 前順巡回のプログラム ( 再帰 ) void preorder(node *v) { if (v == null) return; v を出力する ; preorder(v->left); preorder(v->right); void main() { preorder(root) n 次の再帰手続きで実現できる n 方法 根からスタート 頂点 v に来たら まず出力して 次に左と右の部分木を巡回する

16 中順巡回のプログラム ( 再帰 ) // 中順巡回の出力 void preorder(node *v) { if (v == null) return; preorder(v->left); v を出力する ; preorder(v->right); void main() { preorder(root) n 次の再帰手続きで実現できる n 前順と似ているが 出力するタイミングが違う n 子供への再帰呼び出しと 再帰呼び出しの間で出力している

17 後順巡回のプログラム ( 再帰 ) // 後順巡回の出力 void preorder(node *v) { if (v == null) return; preorder(v->left); preorder(v->right); v を出力する ; void main() { preorder(root) n 次の再帰手続きで実現できる n 前順と中順と似ているが 出力するタイミングが違う 子供への再帰呼び出しのあとで出力している

18 再帰を使わずにループで探索する やや難しい 深さ優先探索 (DFS) 幅優先探索 (BFS) A A level = 1 B C B C level = 2 D E F D E F level = 3 G G level = 4 H 注意 :DFSだけでは 頂点の出力の順番は決まらない 前順 中順 後順 H level = 5

19 再帰を使わない巡回のプログラム void main() { //preorder in DFS Stack S; // 空のスタックS S.push(root); while (!S.isEmpty()) { node v = S.pop(); if (v!= null) { vを出力する ; S.push(v.right); S.push(v.left); 深さ優先探索は スタックとループを用いて実現できる これは前順 中順 後順のどれか 考えてみよう! 考えてみよう

20 再帰を使わない巡回のプログラム void main() { //BFS Queue S; // 空のキュー S S.enqueue(root); while (!S.isEmpty()) { 現できる node v = S.dequeue(); // 要素 vをとりだす if (v!= null) { v を出力する ; S.enqueue(v.left); S.enqueue(v.right); ( 前のページの問の答え : 前順巡回 ) 幅優先探索による巡回は スタックとループを用いて実 なぜこれで正しいか考えてみよう! 考えてみよう

21 まとめ : 木の巡回 ( 第 5 回探索 (1) のスライド ) 木の巡回 (traverse) とは 木のすべての節点を組織だった方法で訪問すること 深さ優先探索 (depth-first search) による木の巡回 2 3 1 3 4 1 4 5 7 10 11 9 5 6 12 8 8 6 7 14 10 13 2 分探索木を中順出力すると整列された要素のリストがえられる! すべての節点の要素を次の 3 種類の順番で出力できる 前順 ( 行きがけ順 preorder) 最初の訪問時に出力 7, 3, 1, 4, 6, 5, 10, 8 中順 ( 通りがけ順 inorder) 左の部分木のなぞりが終わった後に出力 1, 3, 4, 5, 6, 7, 8, 10 後順 ( 帰りがけ順, postorder) 最後の訪問時に出力 1, 5, 6, 4, 3, 8, 10, 7