アルゴリズムとデータ構造 2011年7月8日課題の復習

Slides:



Advertisements
Similar presentations
Generic programming と STL
Advertisements

プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
プログラムのパタン演習 解説.
5.データ構造入門 5-1.連結リスト(Linked List) 5-2.スタック(Stack) 5-3.キュー(Queue)
プログラミング言語としてのR 情報知能学科 白井 英俊.
アルゴリズムとデータ構造 2013年6月18日
アルゴリズムとデータ構造 2010年7月5日
データ構造とアルゴリズム論 第6章 探索のアルゴリズム
アルゴリズムとデータ構造 第2章 リスト構造 5月17日分
基本情報技術概論(第4回) 埼玉大学 理工学研究科 堀山 貴史
最適化ソルバーのための Python言語入門
アルゴリズムとデータ構造 第1章 アルゴリズムと計算量 4月26日
アルゴリズムとデータ構造 2012年6月14日
情報工学概論 (アルゴリズムとデータ構造)
配列の扱い、探索 有効範囲と記憶域期間 第12回 [7月10日、H.15(‘03)] 今日のメニュー 1 前回の課題の復習
岩井 儀雄 コンピュータ基礎演習  ー探索、整列ー 岩井 儀雄
プログラミング論 II 電卓,逆ポーランド記法電卓
第11講: 平成18年12月 8日 (金) 4限 E352教室 グラフ (1).
データ構造とアルゴリズム 第13回 スタックとキュー
Stack & Queue & List 3.
アルゴリズムと データ構造 第4回 スタック・キュー.
第4章 空間解析 2.ネットワーク分析 (3) ネットワーク構造分析
アルゴリズムとデータ構造 第4回 配列によるスタックとキュー.
アルゴリズムとデータ構造 2011年6月14日
ピカチュウによる オブジェクト指向入門 (新版)
アルゴリズムとデータ構造 2011年6月20日
アルゴリズムとデータ構造 1章の復習 第2章 リスト構造 5月10日
2009/10/16 いろいろなデータ構造 第3講: 平成21年10月16日 (金) 4限 E252教室 コンピュータアルゴリズム.
アルゴリズムとデータ構造 2011年7月4日
アルゴリズムとデータ構造 2012年6月28日
アルゴリズムとデータ構造 2011年6月27日
アルゴリズムとデータ構造 2013年7月16日
アルゴリズムとデータ構造1 2006年7月4日
データ構造とアルゴリズム 第6回 キュー ~ データ構造(2)~.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
プログラミング言語入門.
データ構造と アルゴリズム第4回 知能情報学メジャー 和田俊和.
2011/06/21-24 情報知能学科「アルゴリズムとデータ構造」 担当:白井英俊
アルゴリズムとデータ構造 第3章 ヒープ 6月10日分
アルゴリズムとデータ構造1 2005年7月1日
2009/10/23 整列アルゴリズム (1) 第4講: 平成21年10月23日 (金) 4限 E252教室 コンピュータアルゴリズム.
プログラミング 3 スタックとキュー.
算法数理工学 第8回 定兼 邦彦.
基本情報技術概論I (第4回) 埼玉大学 理工学研究科 堀山 貴史
6.データ構造入門 6-1.連結リスト(Linked List) 6-2.スタック(Stack) 6-3.キュー(Queue)
算法数理工学 第7回 定兼 邦彦.
アルゴリズムとデータ構造 第2章 リスト構造 5月20日分
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分
情報知能学科「アルゴリズムとデータ構造」
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分の復習
情報数理Ⅱ 第11章 データ構造 平成29年1月18日.
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
基本情報技術概論(第10回) 埼玉大学 理工学研究科 堀山 貴史
データ構造とアルゴリズム (第3回) 静岡大学工学部 安藤和敏
アルゴリズムからプログラムへ GRAPH-SEARCH
アルゴリズムとデータ構造 2012年7月2日
基本情報技術概論(第5回) 埼玉大学 理工学研究科 堀山 貴史
アルゴリズムとデータ構造 2011年6月28日
アルゴリズムとデータ構造1 2006年6月23日
アルゴリズムとデータ構造 2013年7月1日
アルゴリズムとデータ構造1 2009年7月2日
第11回放送授業.
アルゴリズムとデータ構造 2013年7月2日
アルゴリズムとデータ構造 2013年7月8日
アルゴリズムとデータ構造 --- 理論編 --- 山本 真基
アルゴリズムとデータ構造 第2章 リスト構造 5月24日分
アルゴリズムとデータ構造 2012年6月21日
データ構造と アルゴリズムI 第三回 知能情報学部 新田直也.
アルゴリズムとデータ構造 2012年7月9日
Presentation transcript:

アルゴリズムとデータ構造 2011年7月8日課題の復習 情報知能学科 白井英俊

グラフ探索の演習 図6.8(下図)に示すグラフに対するGraph-Searchの振る舞いをv6を始点として、(1)Aとしてキューを使った場合と、(2)スタックを使った場合のそれぞれに対して示せ。(複数の頂点をいれる場合は、番号の若い方を先にいれるものとする) v3 v0 v1 v2 v10 v11 v12 v5 v6 v4 v9 v8 v13 v7

グラフ探索(キューによるもの) Graph Search with QUEUE: v6 v5 v7 v4 v8 v12 v3 v9 v13 v2 v11 v10 v1 v0 v3 v0 v1 v2 v10 v11 v12 v5 v6 v4 v9 v8 v13 v7

グラフ探索(スタックによるもの) Graph Search with STACK: v6 v5 v7 v8 v9 v13 v3 v12 v2 v11 v1 v10 v0 v4 v3 v0 v1 v2 v10 v11 v12 v5 v6 v4 v9 v8 v13 v7

GRAPH-SEARCH (教科書、p.62) 入力: グラフGを表す隣接頂点関数Tと初期頂点v0 出力: Gのすべての頂点のリスト 手続き: 頂点を入れるための入れ物A,B(初期値は空) v0をAとBに入れる Aから一つの頂点vを取り出し「T(v)に属す頂点でBに入っていないものがあれば、AとBに入れる」 Aが空ならBを出力して終了。そうでなければ3へ。 3の実現方法はいろいろ---p.62の方式を次に示す 5

(1)入れ物A, Bを用意する(続き) 配列、ハッシュ、キュー、スタックなどの「データ構造」は、newメソッドでインスタンスを作る 例 配列: Array.new ハッシュ:  Hash.new これらはRubyの組み込み (最初からある)のデータ構造 スタック: Stack.new キュー: Queue.new 木: … これらはRubyの組み込みではない 別途Classの宣言が必要 しかし、newによってインスタンスを 作ることは同じ

キューとスタックの準備 キューのクラス queueX.rb スタックのクラス stackX.rb class Queue attr_accessor :head, :tail def enqueue(item) … end def dequeue … end def empty … end def find(item) … end end class Stack            attr_accessor :data, :top def push(item) … end def popup … end def empty … end end

GRAPH-SEARCHプログラム(queue版) def graphSearchQ(v) # キューを用いたグラフ探索 check = Hash.new(false) # 頂点が記録済みかどうかのチェック用(B) agenda = Queue.new # 調査すべき頂点の記憶用(A) agenda.enqueue(v) # 始点vをAに入れる(enqueue) result = [v]          # 始点vを訪問リストに入れる check[v] = true #始点vを記録済みとしてチェック while (! agenda.empty)       # 調査すべき頂点がある限り繰り返し v = agenda.dequeue # 次に調査すべき頂点(v)を取出す for w in v.adjacentNodes # vに隣接する頂点それぞれ(w)に対し if (! check[w]) # wが記録済みでなければ agenda.enqueue(w) # wを調査すべき頂点に登録(A)         check[w]=true # wを記録済みとして登録(B) result << w # wを訪問リストの末尾に入れる end # if end # for end # while return result # (すべての頂点を調査したので) 訪問リストを返す end # def 8

GRAPH-SEARCHプログラム(queue版) def graphSearchQ(v) # キューを用いたグラフ探索 check = Hash.new(false) # 頂点が記録済みかどうかのチェック用(B) agenda = Queue.new # 調査すべき頂点の記憶用(A) agenda.enqueue(v) # 始点vをAに入れる(enqueue) result = [v]          # 始点vを訪問リストに入れる check[v] = true #始点vを記録済みとしてチェック while (! agenda.empty)       # 調査すべき頂点がある限り繰り返し v = agenda.dequeue # 次に調査すべき頂点(v)を取出す for w in v.adjacentNodes # vに隣接する頂点それぞれ(w)に対し if (! check[w]) # wが記録済みでなければ agenda.enqueue(w) # wを調査すべき頂点に登録(A)         check[w]=true # wを記録済みとして登録(B) result << w # wを訪問リストの末尾に入れる end # if end # for end # while return result # (すべての頂点を調査したので) 訪問リストを返す end # def 9

GRAPH-SEARCHプログラム(queue版) def graphSearchQ(v) # キューを用いたグラフ探索 check = Hash.new(false) # 頂点が記録済みかどうかのチェック用(B) agenda = Queue.new # 調査すべき頂点の記憶用(A) agenda.enqueue(v) # 始点vをAに入れる(enqueue) result = [v]          # 始点vを訪問リストに入れる check[v] = true #始点vを記録済みとしてチェック while (! agenda.empty)       # 調査すべき頂点がある限り繰り返し v = agenda.dequeue # 次に調査すべき頂点(v)を取出す for w in v.adjacentNodes # vに隣接する頂点それぞれ(w)に対し if (! check[w]) # wが記録済みでなければ agenda.enqueue(w) # wを調査すべき頂点に登録(A)         check[w]=true # wを記録済みとして登録(B) result << w # wを訪問リストの末尾に入れる end # if end # for end # while return result # (すべての頂点を調査したので) 訪問リストを返す end # def 10

GRAPH-SEARCHプログラム(queue版) def graphSearchQ(v) # キューを用いたグラフ探索 check = Hash.new(false) # 頂点が記録済みかどうかのチェック用(B) agenda = Queue.new # 調査すべき頂点の記憶用(A) agenda.enqueue(v) # 始点vをAに入れる(enqueue) result = [v]          # 始点vを訪問リストに入れる check[v] = true #始点vを記録済みとしてチェック while (! agenda.empty)       # 調査すべき頂点がある限り繰り返し v = agenda.dequeue # 次に調査すべき頂点(v)を取出す for w in v.adjacentNodes # vに隣接する頂点それぞれ(w)に対し if (! check[w]) # wが記録済みでなければ agenda.enqueue(w) # wを調査すべき頂点に登録(A)         check[w]=true # wを記録済みとして登録(B) result << w # wを訪問リストの末尾に入れる end # if end # for end # while return result # (すべての頂点を調査したので) 訪問リストを返す end # def 11

課題 queue版にならってstack版を作る(graphSearch.rbのgraphSearchS関数を完成させる) Stack.new   インスタンスを作る Queue.new   データを追加(記憶) enqueue 記憶したデータの取り出し dequeue 空っぽかどうかの判定 empty Stack.new push popup empty

GRAPH-SEARCHプログラム(stack版) def graphSearchQ(v) # キューを用いたグラフ探索 check = Hash.new(false) # 頂点が記録済みかどうかのチェック用(B) agenda = Stack.new # 調査すべき頂点の記憶用(A) agenda.push(v) # 始点vをAに入れる(enqueue) result = [v]          # 始点vを訪問リストに入れる check[v] = true #始点vを記録済みとしてチェック while (! agenda.empty)       # 調査すべき頂点がある限り繰り返し v = agenda.popup # 次に調査すべき頂点(v)を取出す for w in v.adjacentNodes # vに隣接する頂点それぞれ(w)に対し if (! check[w]) # wが記録済みでなければ agenda.push(w) # wを調査すべき頂点に登録(A)         check[w]=true # wを記録済みとして登録(B) result << w # wを訪問リストの末尾に入れる end # if end # for end # while return result # (すべての頂点を調査したので) 訪問リストを返す end # def 13