アルゴリズムとデータ構造 第3章 ヒープ 5月31日分の復習

Slides:



Advertisements
Similar presentations
A Simple Constant Time Enumeration Algorithm for Free Trees 中野 眞一 宇野 毅明 群馬大学 情報学研究所 2003 年 9 月 19 日 アルゴリズム研究会.
Advertisements

データ構造とプログラミング技 法 (第3回) ー木構造ー. 木構造 (1) 根( root )と呼ばれる節 R が、 1 つだけ含まれ る。 R … TmTm T1T1 木構造: 1 個以上の節の有限集合 T であり、 次の二つの条件を満足するもの (2) 根以外の節は、 m (≧ 0 )個の互いに素な部.
4.3 マージソート.
基本情報技術概論 I 演習(第5回) 埼玉大学 理工学研究科 堀山 貴史
離散システム特論 整列(sorting)アルゴリズム 2.
ヒープソートの演習 第13回.
2分探索.
第11回 整列 ~ シェルソート,クイックソート ~
アルゴリズムとデータ構造 2013年6月18日
アルゴリズムとデータ構造1 2005年7月8日
アルゴリズムとデータ構造 2010年7月5日
第8講: 平成19年11月9日 (金) 4限 E252教室 探索アルゴリズム(1).
On the Enumeration of Colored Trees
アルゴリズムとデータ構造 第2章 リスト構造 5月17日分
Problem G : Entangled Tree
情報知能学科「アルゴリズムとデータ構造」
アルゴリズムとデータ構造 2012年6月14日
データ構造とアルゴリズム 第7回 木 ~ データ構造(3)~.
データ構造とアルゴリズム 第6回の2 木 ~ データ構造(3)~.
ヒープソートの復習.
アルゴリズムとデータ構造 2011年6月14日
アルゴリズムとデータ構造 第7回探索のためのデータ構造(1) 2015/11/18 アルゴリズムとデータ構造 2015.
二分探索木によるサーチ.
2009/10/16 いろいろなデータ構造 第3講: 平成21年10月16日 (金) 4限 E252教室 コンピュータアルゴリズム.
Cプログラミング演習 中間まとめ2.
アルゴリズムとデータ構造 2012年6月28日
アルゴリズムとデータ構造 2011年6月27日
決定木とランダムフォレスト 和田 俊和.
アルゴリズムとデータ構造1 2005年7月26日
アルゴリズムとデータ構造1 2006年7月4日
二分木のメソッド(続き).
2011/06/21 情報知能学科「アルゴリズムとデータ構造」 担当:白井英俊
木の走査.
データ構造とアルゴリズム (第3回) ー木構造ー.
アルゴリズムとデータ構造 第3章 ヒープ 6月10日分
第9回 優先度つき待ち行列,ヒープ,二分探索木
データ構造と アルゴリズム 第七回 知能情報学部 新田直也.
データ構造と アルゴリズム 第六回 知能情報学部 新田直也.
A Simple Algorithm for Generating Unordered Rooted Trees
離散数学 07. 木 五島.
基本情報技術概論(第6回) 埼玉大学 理工学研究科 堀山 貴史
Cプログラミング演習 第10回 二分探索木.
復習+α JBuilderの使い方を思い出す。 配列とGUI 再帰とマージソート 木と二分木の探索
アルゴリズムとデータ構造 2010年7月26日
プログラミング 4 木構造とヒープ.
アルゴリズムとデータ構造 2011年7月8日課題の復習
15.cons と種々のデータ構造.
アルゴリズムとデータ構造 第2章 リスト構造 5月20日分
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分
情報知能学科「アルゴリズムとデータ構造」
情報数理Ⅱ 第11章 データ構造 平成29年1月18日.
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
AVL木.
第9回 優先度つき待ち行列,ヒープ,二分探索木
アルゴリズムとデータ構造 2012年7月2日
アルゴリズムとデータ構造1 2008年7月24日
アルゴリズムとデータ構造 2011年6月28日
アルゴリズムとデータ構造 2011年6月16日
アルゴリズムとデータ構造 2013年7月1日
基本情報技術概論(第6回) 埼玉大学 理工学研究科 堀山 貴史
ヒープソートの復習 第12回.
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造1 2009年7月2日
アルゴリズムとデータ構造 2013年7月2日
アルゴリズムとデータ構造 第2章 リスト構造 5月24日分
ヒープソート.
ヒープソート.
アルゴリズムとデータ構造 2013年6月20日
参考:大きい要素の処理.
7.木構造 7-1.データ構造としての木 7-2.2分探索木 7-3.高度な木.
Presentation transcript:

アルゴリズムとデータ構造 第3章 ヒープ 5月31日分の復習 アルゴリズムとデータ構造 第3章 ヒープ 5月31日分の復習 情報知能学科 白井英俊

二進木(二分木)とは 高々2個 Binary tree の訳語 定義: どの頂点も2個以下の子をもつ木 2個の子は左の子と右の子のどちらか 定義: どの頂点も2個以下の子をもつ木 2個の子は左の子と右の子のどちらか 0個の子 1個の子 2個の子 左 右 左 右

頂点の深さと木の高さ この木の高さ= 4 根と頂点の間の枝の数が「頂点の深さ」 最も深い頂点の「深さ」が「木の高さ」 根=深さ 0 深さ 1 深さ 2 深さ 3 深さ 4

練習問題 この木の高さは? 8 10 12 5 9 3 1 7 左部分木の高さ と 右部分木の高さ の大きい方+1

二進木を用いたソート(sort) 二進木を利用して、n個の実数を小さいものから大きいものへと昇順に並べる(ソート, sort)ことを考えよう このために用いる二進木を「二分探索木」(binary search tree)と呼ぶ 与えられた実数を1個ずつ読み込み、それぞれを頂点に格納しながら、二分探索木を作っていく すべての実数に対応する頂点をもつ二分探索木の完成後、すべての頂点を中間順で読みだす。これによりソートが完成される

二進木のデータ構造 二進木の場合、子は左か右しかない だから、「一般の木」よりも特殊なデータ構造を考えるのが便利 class Vertex  だから、「一般の木」よりも特殊なデータ構造を考えるのが便利 class Vertex def initialize(data=“ “, left=nil, right=nil) @data = data @left = left @right = right end # initialize attr_attribute :data, :left, :right end # class 「引数=値」とは、引数が省略できること、省略された場合に「値」となることを意味する

木に要素xを加えるインスタンスメソッドinsert(x) class Vertex def initialize(data=“ “, left=nil, right=nil) @data = data @left = left @right = right end # initialize に続けて… def insert(x) # xは付け加える要素 1)xがdata より小さいなら if x < @data  a) 左の子がなければ if (@left == nil) xの値をもつ新たな頂点 @left = Vertex.new(x) を作成し左の子とする  else  b) さもなくば        @left.insert(x)      end 2) 1)でなければ else  右の子に対して同様にする    …

インスタンスメソッドinsert(x) 続き def insert(x)   if (x < @data) # x がtの値より小さい場合 if (@left = = nil) # t の左の子がないなら @left = Vertex.new(x) # xを値とする頂点を else # 作って t の左の子に @left.insert(x) # 左の子に対し再帰 end #if # xがtの値以上の場合 elsif (@right = = nil)     # t の右の子がないなら @right = Vertex.new(x) # xを値とする頂点を else # 作って t の右の子に @right.insert(x) # 右の子に対し再帰 end # if end # def 左 left 右 right

二分探索木を作る…(続き) 4 { 4 5 8 3 6 3 5 } 10 2 9 1 2 8 6 1 10 9 入力データ: 2<4だから左 4<10から右 3<4だから左 4 4<5だから右 4<8だから右 入力データ: 4<6だから右 { 4 5 8 3 6 3 5 2<3だから左 5<8だから右 5<10から右 5<6だから右 } 10 2 9 1 2 6<8だから左 8 8<10から右 6 1 10 どこにノードができるか予想しよう 9

頂点の値が真ん中の位置で読み出されるので「中間」順 「木のなぞり」、または値の読出し 頂点の値が真ん中の位置で読み出されるので「中間」順 中間順の読出し   左の子、根頂点の値、右の子  という順に、値を読み出す ・参考:先行順、後行順、もある 例 スタートはいつも根が基準 根頂点(2) 8 左(1) 5 10 右(3) だから、 5, 8, 10

中間順の「木のなぞり」 根頂点(2) 8 左(1) 5 10 右(3) 3 7 20 スタートはいつも根が基準 根の「右部分木」は (部分)木なので、中間 順が適用され: 3 7 20 「左部分木」は(部分)木なので、 中間順が適用され:

他の「木のなぞり」 先行順: 「根頂点の値」、左の子、右の子 後行順: 左の子、右の子、 「根頂点の値」 先行順: 「根頂点の値」、左の子、右の子 後行順: 左の子、右の子、 「根頂点の値」 先の演習問題の木に対し、先行順と後行順のそれぞれで「木をなぞる」と、どのようになるか?

先行順の「木のなぞり」 根頂点(1) 8 左(2) 5 10 右(3) 3 7 20 スタートはいつも根が基準 根の「右部分木」は (部分)木なので、 先行順が適用され: 3 7 20 「左部分木」は(部分)木なので、 先行順が適用され:

後行順の「木のなぞり」 根頂点(3) 8 左(1) 5 10 右(2) 3 7 20 スタートはいつも根が基準 根の「右部分木」は (部分)木なので、 後行順が適用され: 3 7 20 「左部分木」は(部分)木なので、 後行順が適用され:

応用問題:数式の木 例: (a+b)*(c-d*e) は次の二進木で表現される(葉には変数が、葉以外の頂点は演算子が書かれる) * + ー a b c * d e

数式の木の問題 先の木をそれぞれ次でなぞった時 1) 中間順(inorder) a + b * c – d * e   2) 先行順(preorder) ポーランド記法 * + a b – c * d e   3) 後行順(postorder) 逆ポーランド記法 a b + c d e * – * 逆ポーランド記法は「日本語的」