離散数学 07. 木 五島.

Slides:



Advertisements
Similar presentations
組合せ最適化輪講 2.3 連結性 川原 純. 2.3 連結性 内容 – グラフ上の節点をすべてたどるアルゴリズム 計算機上でのグラフの表現 – 強連結成分を求めるアルゴリズム トポロジカル順序を求める方法も – k- 連結、 k- 辺連結について – 2- 連結グラフの耳分解について.
Advertisements

2015 年度 有限幾何学 期末試験 次の各問に答えよ.( (1), (2), (3), (4), (5), (7), (8), (10) は答えだけでよい) (1) 有向閉路が存在しない位数 4 のトーナメントを描け. (2) 内点の個数が 10 個の正則 2 分木の葉の個数を求めよ. (3) グラフ.
A Simple Constant Time Enumeration Algorithm for Free Trees 中野 眞一 宇野 毅明 群馬大学 情報学研究所 2003 年 9 月 19 日 アルゴリズム研究会.
データ構造とプログラミング技 法 (第3回) ー木構造ー. 木構造 (1) 根( root )と呼ばれる節 R が、 1 つだけ含まれ る。 R … TmTm T1T1 木構造: 1 個以上の節の有限集合 T であり、 次の二つの条件を満足するもの (2) 根以外の節は、 m (≧ 0 )個の互いに素な部.
アルゴリズムとデータ構造 2011年7月7日
4.3 マージソート.
基本情報技術概論 I 演習(第5回) 埼玉大学 理工学研究科 堀山 貴史
2009/12/4 グラフ (2) 第10講: 平成21年12月4日 (金) 4限 E252教室 コンピュータアルゴリズム.
2 分探索木 Binary Search Tree 実行可能な操作 計算量 木の高さは,最悪 O(n) n = |A| : 要素の個数
アルゴリズムとデータ構造 2013年6月18日
アルゴリズムとデータ構造1 2005年7月8日
アルゴリズムとデータ構造 2010年7月5日
算法数理工学 第9回 定兼 邦彦.
On the Enumeration of Colored Trees
Problem G : Entangled Tree
An Algorithm for Enumerating Maximal Matchings of a Graph
アルゴリズムとデータ構造 2012年6月14日
情報工学概論 (アルゴリズムとデータ構造)
データ構造とアルゴリズム 第7回 木 ~ データ構造(3)~.
データ構造とアルゴリズム 第6回の2 木 ~ データ構造(3)~.
第11講: 平成18年12月 8日 (金) 4限 E352教室 グラフ (1).
第4章 空間解析 2.ネットワーク分析 (3) ネットワーク構造分析
s a b f c e d 2016年度 有限幾何学 期末試験 問1:15点
大岩 元 慶応大学環境情報学部 二分木 データ構造とプログラミング(10) 大岩 元 慶応大学環境情報学部
アルゴリズムとデータ構造 2011年6月14日
5.5 The Linear Arboricity of Graphs (グラフの線形樹化数)
アルゴリズムとデータ構造 第7回探索のためのデータ構造(1) 2015/11/18 アルゴリズムとデータ構造 2015.
アルゴリズムとデータ構造 2012年7月12日
二分探索木によるサーチ.
2009/10/16 いろいろなデータ構造 第3講: 平成21年10月16日 (金) 4限 E252教室 コンピュータアルゴリズム.
Cプログラミング演習 中間まとめ2.
茨城大学 工学部 知能システム工学科 井上 康介 E2棟801号室
アルゴリズムとデータ構造 2011年7月4日
アルゴリズムとデータ構造 2012年6月28日
アルゴリズムとデータ構造 2011年6月27日
アルゴリズムとデータ構造1 2006年7月4日
離散数学 08. グラフの探索 五島.
1 T 行きがけ順: A B D F I J C G H 通りがけ順: D B I F J A G C H
アルゴリズムとデータ構造1 2006年6月16日
二分木のメソッド(続き).
第9回 優先度つき待ち行列,ヒープ,二分探索木
b f c a d e g h a b c d e f g 図1 図2 2012年度 有限幾何学 期末試験
データ構造と アルゴリズム 第七回 知能情報学部 新田直也.
データ構造と アルゴリズム 第六回 知能情報学部 新田直也.
A Simple Algorithm for Generating Unordered Rooted Trees
Cプログラミング演習 第10回 二分探索木.
アルゴリズムとデータ構造 2010年7月26日
プログラミング 4 木構造とヒープ.
九州大学大学院 情報学専攻特別講義 (6) 固定パラメータアルゴリズムと 部分k木
コンパイラ 2011年10月20日
15.cons と種々のデータ構造.
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分の復習
情報数理Ⅱ 第11章 データ構造 平成29年1月18日.
第9回 優先度つき待ち行列,ヒープ,二分探索木
離散数学 06. グラフ 序論 五島.
アルゴリズムとデータ構造 2012年7月2日
アルゴリズムとデータ構造1 2008年7月24日
アルゴリズムとデータ構造 2011年6月28日
アルゴリズムとデータ構造 2013年7月1日
基本情報技術概論(第6回) 埼玉大学 理工学研究科 堀山 貴史
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造1 2009年7月2日
アルゴリズムとデータ構造 2013年7月2日
アルゴリズムとデータ構造 2013年7月8日
2009/11/27 グラフ (1) 第9講: 平成21年11月27日 (金) 4限 E252教室 コンピュータアルゴリズム.
生命情報学特論 (6) 固定パラメータアルゴリズムと 部分k木
グラフの列挙 中野 眞一    (群馬大学) 2019/9/14 列挙学校.
7.木構造 7-1.データ構造としての木 7-2.2分探索木 7-3.高度な木.
アルゴリズムとデータ構造 2012年7月9日
Presentation transcript:

離散数学 07. 木 五島

離散数学 木 とは

循環 / 非循環グラフ 木 (tree): 連結な森,森の連結成分 {木} ⊂ {森} 森は木の集合 無向 Undirected 有向 離散数学 循環 / 非循環グラフ 無向 Undirected 有向 Directed 閉路なし 非循環グラフ Acyclic 森 forest DAG 閉路あり 循環グラフ Cyclic 無向循環 グラフ 有向循環 木 (tree): 連結な森,森の連結成分 {木} ⊂ {森} 森は木の集合 森

離散数学 循環 / 非循環グラフの例 非循環グラフ 循環グラフ 木 木 無向循環グラフ DAG DAG DAG 有向循環グラフ

根 (root) (連結非循環グラフの)根 (root): 頂点を1つ選んで, それが一番「上」にあると考える 木(無向): 離散数学 根 (root) (連結非循環グラフの)根 (root): 頂点を1つ選んで, それが一番「上」にあると考える 木(無向): どの頂点も根になり得る 根付き木 (rooted tree) DAG(有向): 根がない場合もある どれが根? 根のない DAG

離散数学 木の性質

「木」 と 木(無向非循環グラフ) 「木」のイメージ: 「根があって,枝分かれして,葉に至る」 「木」=木(無向非循環グラフ)? 離散数学 「木」 と 木(無向非循環グラフ) 「木」のイメージ: 「根があって,枝分かれして,葉に至る」 「木」=木(無向非循環グラフ)? 「木」 ⇒ 木(無向非循環グラフ) 「木」なら,枝分かれした先で合流しない ⇒ 非循環 木(無向非循環グラフ) ⇒ 「木」 任意の頂点を根とみなすことができる 木なので,循環はない 連結なので,根からすべての頂点に到達可能 どれが根?

木 の 性質 任意の2頂点 x,y を結ぶ道はただ 1つ (辺の個数) = (頂点の個数) − 1 離散数学 木 の 性質 任意の2頂点 x,y を結ぶ道はただ 1つ (辺の個数) = (頂点の個数) − 1 (頂点数が2以上なら)少なくとも 2個の端末点がある 端末点: 次数 1 の頂点 頂点 −−,++ −−: 頂点数 n の木から端末点を1つ除去すると,頂点数 n − 1 の木になる. ++:頂点数 n の木に,頂点1つ(とこれらを接続する辺を1つ)を加えると, 頂点数 n + 1 の木になる.

離散数学 木 の 性質(証明 1/5) 任意の2頂点 x,y を結ぶ道はただ 1つ 2つあれば,閉路

木 の 性質(証明 2/5) −−: 頂点数 n の木から端末点を1つ除去すると,頂点数 n − 1 の木になる. 離散数学 木 の 性質(証明 2/5) −−: 頂点数 n の木から端末点を1つ除去すると,頂点数 n − 1 の木になる. 頂点を除去して閉路ができることはない. 端末点なので,除去しても非連結にはならない.

木 の 性質(証明 3/5) ++:頂点数 n の木に,頂点を1つと,これらを接続する辺を1つ加えると, 頂点数 n + 1 の木になる. 離散数学 木 の 性質(証明 3/5) ++:頂点数 n の木に,頂点を1つと,これらを接続する辺を1つ加えると, 頂点数 n + 1 の木になる. 頂点 1つと辺 1つを加えて閉路を作ることはできない.

木 の 性質(証明 4/5) 頂点数 ++ の繰り返しによって,任意の木を構築することができる. 離散数学 木 の 性質(証明 4/5) 頂点数 ++ の繰り返しによって,任意の木を構築することができる. 任意の木から,頂点数 −− を繰り返して頂点数 1 のグラフを得る. 頂点数 ++ を −− とは逆に繰り得返して元(任意の木)に戻せる. 4 3 1 2 2 1 3 4

木 の 性質(証明 5/5) (頂点数が2以上なら)少なくとも2個の端末点がある 頂点数2 の木には,2個の端末点がある. 離散数学 木 の 性質(証明 5/5) (頂点数が2以上なら)少なくとも2個の端末点がある 頂点数2 の木には,2個の端末点がある. 頂点 ++ すると… 端末点につなぐと,1つ減って 1つ増える. 非端末点につなぐと,1つ増える. (辺の数) = (頂点の数) − 1 頂点数2の木では,辺の数は 1,頂点の数は 2. 頂点 ++ すると,1ずつ増える. 1 2 3 4

離散数学 木の巡回

離散数学 visit() class Graph { private: /* … */ int left(int u); int right(int u); public: void visit(int u); }; void Graph::visit (int u) { if (left(u)) visit(left(u)); if (right(u)) visit(right(u)); } u の左の子の頂点の番号 u の右の子の頂点の番号 visit() の宣言 u: 頂点の番号 (> 0) u に左の子があれば,訪れる u に右の子があれば,訪れる

再帰呼び出しによる二分木の巡回 call call visit (int u) { if (left(u)) visit(left(u)); 離散数学 再帰呼び出しによる二分木の巡回 call call visit (int u) { if (left(u)) visit(left(u)); if (right(u)) visit(right(u)); } visit (int u) { if (left(u)) visit(left(u)); if (right(u)) visit(right(u)); } visit (int u) { if (left(u)) visit(left(u)); if (right(u)) visit(right(u)); } return visit (int u) { if (left(u)) visit(left(u)); if (right(u)) visit(right(u)); } visit (int u) { if (left(u)) visit(left(u)); if (right(u)) visit(right(u)); } c b a d e

再帰呼び出しによる二分木の巡回 行きがけ: call 直後 call visit (int u) { if (left(u)) 離散数学 再帰呼び出しによる二分木の巡回 行きがけ: call 直後 call visit (int u) { if (left(u)) visit(left(u)); if (right(u)) visit(right(u)); } visit (int u) { if (left(u)) visit(left(u)); if (right(u)) visit(right(u)); } visit (int u) { if (left(u)) visit(left(u)); if (right(u)) visit(right(u)); } return 帰りがけ: return 直前 visit (int u) { if (left(u)) visit(left(u)); if (right(u)) visit(right(u)); } visit (int u) { if (left(u)) visit(left(u)); if (right(u)) visit(right(u)); } 行きがけ c left b a d 帰りがけ e right

巡回の順序 木の巡回順序: 頂点の処理順序 行きがけ順 (pre-order) 通りがけ順 (in-order) (二分木のみ) 離散数学 巡回の順序 木の巡回順序: 頂点の処理順序 行きがけ順 (pre-order) 通りがけ順 (in-order) (二分木のみ) 帰りがけ順 (post-order) 頂点を訪れる (visit) 順番は変わらない が, 頂点を処理する順番が変わる 処理: コードでは頂点番号の表示 (print).

二分木の巡回 (binary tree traversal) 離散数学 二分木の巡回 (binary tree traversal) 行きがけ順 (pre-order) 通りがけ順 (in-order) 帰りがけ順 (post-order) visit (int u) { print u; if (left(u)) visit(left(u)); if (right(u)) visit(right(u)); } visit (int u) { if (left(u)) visit(left(u)); print u; if (right(u)) visit(right(u)); } visit (int u) { if (left(u)) visit(left(u)); if (right(u)) visit(right(u)); print u; } c c c left b b b d d d a a a f f f e e e right g g g > abcdefg > cbdafeg > cdbfgea

木の巡回 (tree traversal) 行きがけ順 (pre-order) 帰りがけ順 (post-order) 離散数学 木の巡回 (tree traversal) 行きがけ順 (pre-order) 帰りがけ順 (post-order) visit (int u) { print u; foreach (v in adjacent(u)) visit(v); } visit (int u) { foreach (v in adjacent(u)) visit(v); print u; } 3 1 2 4 4 2 5 3 1 9 7 5 6 8 8 6 9 7

離散数学 次回の内容 グラフの探索 木の巡回の先 pre-order と post-order の理解が必要