算法数理工学 第9回 定兼 邦彦.

Slides:



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

算法数理工学 第 7 回 定兼 邦彦 1. グラフ グラフ G = (V, E) –V: 頂点 ( 節点 ) 集合 {1,2,…,n} –E: 枝集合, E  V  V = {(u,v) | u, v  V} 無向グラフ – 枝は両方向にたどれる 有向グラフ – 枝 (u,v) は u から.
A Simple Constant Time Enumeration Algorithm for Free Trees 中野 眞一 宇野 毅明 群馬大学 情報学研究所 2003 年 9 月 19 日 アルゴリズム研究会.
区間グラフにおける区間表現からMPQ-treeを効率よく構成するアルゴリズム
アルゴリズムとデータ構造 2011年7月7日
2009/12/4 グラフ (2) 第10講: 平成21年12月4日 (金) 4限 E252教室 コンピュータアルゴリズム.
簡潔データ構造 国立情報学研究所 定兼 邦彦.
データ構造と アルゴリズム 第十二回 知能情報学部 知能情報学科 新田直也.
ヒープソートの演習 第13回.
2 分探索木 Binary Search Tree 実行可能な操作 計算量 木の高さは,最悪 O(n) n = |A| : 要素の個数
    有限幾何学        第8回.
On the Enumeration of Colored Trees
Problem G : Entangled Tree
簡潔データ構造 国立情報学研究所 定兼 邦彦.
An Algorithm for Enumerating Maximal Matchings of a Graph
    有限幾何学        第5回.
JAG Regional Practice Contest 2012 問題C: Median Tree
情報工学概論 (アルゴリズムとデータ構造)
情報工学概論 (アルゴリズムとデータ構造)
C11: 大量データ処理のための領域効率の良いアルゴリズム
東京大学大学院情報理工学系研究科 数理情報学専攻 定兼 邦彦 2016年4月7日
宇野 毅明 国立情報学研究所 2002年3月 東北大大学院 情報科学研究科ワークショップ
データ構造とアルゴリズム 第6回の2 木 ~ データ構造(3)~.
第11講: 平成18年12月 8日 (金) 4限 E352教室 グラフ (1).
第4章 空間解析 2.ネットワーク分析 (3) ネットワーク構造分析
s a b f c e d 2016年度 有限幾何学 期末試験 問1:15点
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教室 コンピュータアルゴリズム.
アルゴリズムとデータ構造 2011年7月4日
第25章 単一始点最短路 3節 Bellman-Fordのアルゴリズム
算法数理工学 第8回 定兼 邦彦.
離散数学 08. グラフの探索 五島.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
7.4 Two General Settings D3 杉原堅也.
数理情報工学演習第二B 数理2研 定兼 邦彦 2016/9/30.
アルゴリズムとデータ構造 第3章 ヒープ 6月10日分
第9回 優先度つき待ち行列,ヒープ,二分探索木
25. Randomized Algorithms
b f c a d e g h a b c d e f g 図1 図2 2012年度 有限幾何学 期末試験
データ構造と アルゴリズム 第七回 知能情報学部 新田直也.
データ構造と アルゴリズム 第六回 知能情報学部 新田直也.
First Course in Combinatorial Optimization
A Simple Algorithm for Generating Unordered Rooted Trees
離散数学 07. 木 五島.
Cプログラミング演習 第10回 二分探索木.
情報生命科学特別講義III (13) 固定パラメータアルゴリズムと 部分k木
算法数理工学 第8回 定兼 邦彦.
15.cons と種々のデータ構造.
算法数理工学 第7回 定兼 邦彦.
情報知能学科「アルゴリズムとデータ構造」
第9回 優先度つき待ち行列,ヒープ,二分探索木
    有限幾何学        第5回.
離散数学 06. グラフ 序論 五島.
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造 2013年7月8日
2009/11/27 グラフ (1) 第9講: 平成21年11月27日 (金) 4限 E252教室 コンピュータアルゴリズム.
アルゴリズムとデータ構造 第2章 リスト構造 5月24日分
4.プッシュダウンオートマトンと 文脈自由文法の等価性
2017年度 有限幾何学 期末試験 注意:ループと多重辺がないグラフのみを扱う. 問1 次の定理と,その証明の概略を読み,各問に答えよ.
ヒープソート.
生命情報学特論 (6) 固定パラメータアルゴリズムと 部分k木
コストのついたグラフの探索 分枝限定法 A*アルゴリズム.
図2 x11 図1 x6 x10 x12 x3 x5 x7 x9 x13 x2 x4 x8 x14 (0,0) (1,0) x1 x15
グラフの列挙 中野 眞一    (群馬大学) 2019/9/14 列挙学校.
7.木構造 7-1.データ構造としての木 7-2.2分探索木 7-3.高度な木.
グラフの帯域幅連続多重彩色 を求めるアルゴリズム (Bandwidth Consective Multicolorings of Graphs) 西関研究室 西川和秀.
アルゴリズムとデータ構造 2012年7月9日
Presentation transcript:

算法数理工学 第9回 定兼 邦彦

深さ優先探索,幅優先探索 木やグラフの探索法 深さ優先探索 (depth-first search, DFS) 行き止まりになるまで先に進む 幅優先探索 (breadth-first search, BFS) 全体を同時に探索する DFSはスタック(再帰),BFSはキューで実現できる 1 3 4 2 5 6 1 4 5 2 3 6 DFS BFS

DFS(G) for each u  V[G] color[u]  白 [u]  NIL time  0 if color[u] = 白 DFS-Visit(u) DFS-Visit(u) color[u]  灰 time  time + 1 d[u]  time for each v  Adj[u] if color[v] = 白 [v]  u DFS-Visit(v) color[u]  黒 f[u]  time

白:未訪問 灰:探索中 黒:探索終了 u v w 1/ x y z

u v w 1/ 2/ x y z

u v w 1/ 2/ 3/ x y z

u v w 1/ 2/ 4/ 3/ x y z

辺 (x, v) をたどる v は既に訪問しているので行かない u v w 1/ 2/ 4/ 3/ x y z

白:未訪問 灰:探索中 黒:探索終了 u v w 1/ 2/ 4/5 3/ x y z

u v w 1/ 2/ 4/5 3/6 x y z

u v w 1/ 2/7 4/5 3/6 x y z

辺 (u, x) をたどる x は既に訪問しているので行かない u v w 1/ 2/7 4/5 3/6 x y z

u v w 1/8 2/7 4/5 3/6 x y z

u v w 1/8 2/7 9/ 4/5 3/6 x y z

u v w 1/8 2/7 9/ 4/5 3/6 x y z

u v w 1/8 2/7 9/ 4/5 3/6 10/ x y z

u v w 1/8 2/7 9/ 4/5 3/6 10/ x y z

u v w 1/8 2/7 9/ 4/5 3/6 10/11 x y z

u v w 1/8 2/7 9/12 4/5 3/6 10/11 x y z

辺 (u, v) をたどったら,v の親を u にする ([v] = u) グラフ G = (V, E) を次のように定義する E = {([v], v)  E | v  V かつ [v]  NIL} G は深さ優先探索森 (depth-first forest) 連結ならば深さ優先探索木 (depth-first tree) 各点は探索前は白,探索中は灰,探索終了後は黒 各点 v は2つのタイムスタンプを持つ d[v] は v を最初に発見した (灰色にした) 時刻 f[v] は v の隣接リストを調べ終わった (黒にした) 時刻 タイムスタンプは 1 から 2n の整数 全ての u に対し d[u] < f[u] DFSの実行時間は (n+m)

定理 (括弧付け定理): グラフ G に対する任意の深さ優先探索を考える.任意の2つの頂点 u, v に対し,以下の3つの条件の中の1つだけが成立する. 区間 [d[u], f[u]] と区間 [d[v], f[v]] には共通部分が無く,深さ優先森において u と v はどちらも他方の子孫ではない. 区間 [d[u], f[u]] は区間 [d[v], f[v]] に完全に含まれ, u が v の子孫となる深さ優先探索木が存在する 区間 [d[v], f[v]] は区間 [d[u], f[u]] に完全に含まれ, v が u の子孫となる深さ優先探索木が存在する 注:2つの区間が部分的に重なることは無い

証明: まず d[u] < d[v] の場合を考える d[v] < f[u] のとき u がまだ灰色のときに v が発見されている.つまり v は u の子孫. v は u よりも後に発見されたので,u の探索が終わる前に v の探索は終わる.つまり f[v] < f[u]. このとき区間 [d[v], f[v]] は区間 [d[u], f[u]]に含まれる. f[u] < d[v] のとき d[u] < f[u] < d[v] < f[v] なので区間に共通部分は無い. つまり一方が探索中に他方が発見されない. よってどちらも他方の子孫では無い d[v] < d[u] の場合も同様に証明できる.

系:有向または無向グラフに対する深さ優先探索森において頂点 v が 頂点 u ( v) の子孫であるための必要十分条件は d[u] < d[v] < f[v] < f[u] 定理 (白頂点経路定理): グラフ G の深さ優先探 索森において,頂点 v が 頂点 u の子孫であるため の必要十分条件は,探索が u を発見する時刻 d[u] に u から v に至る白頂点だけからなるパスが 存在することである. 証明:⇒) v が u の子孫であると仮定する.uv間のパス上の任意の頂点を w とする.w は u の子孫なので,d[u] < d[w].つまり時刻 d[u] では w は白.

←) 時刻 d[u] に u から v に至る白頂点だけからなるパスが存在するが,深さ優先探索木において v が u の子孫にならないと仮定する.一般性を失うことなく,このパス上の v 以外の全ての頂点は u の子孫になると仮定できる. このパス上で v の直前の点を w とする. w は u の子孫 (uを含む) なので f[w]  f[u]. v の発見は u の後で,w の終了の前なので, d[u] < d[v] < f[w]  f[u]. 区間は部分的には重ならないので f[v] < f[u]. つまり v は u の子孫.

y z s t 3/6 2/9 1/10 11/16 4/5 7/8 12/13 14/15 x w v u s y z v u y w x 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 (s (z (y (x x) y) (w w) z) s) (t (v v) (u u) t)

辺の分類 グラフ G の深さ優先探索森 G を1つ固定する. G の辺を4種類に分類する tree edge (木辺) back edge (後退辺) 辺 (u, v) で,u と v がある深さ優先探索木の頂点とその先祖の場合.セルフループも後退辺とみなす. forward edge (前進辺) 辺 (u, v) で,木辺でなく,u と v がある深さ優先探索木の頂点とその子孫の場合. cross edge (横断辺) 上の3つ以外

定理: 無向グラフ G を深さ優先探索するとき,G の任 意の辺は木辺または後退辺である. 証明: (u, v) を G の任意の辺とし,一般性を失うこと なく d[u] < d[v] と仮定する. v は u の隣接リストに含まれるので,u に対する処理 が終わる前に v に対する処理が終わる. 辺 (u, v) が最初に u から v に向かって探索されたな ら,v はその時点では白である.すると (u, v) は木辺. 辺 (u, v) が最初に v から u に向かって探索されたな ら,u はその時点では灰である.すると (u, v) は 後退辺.

定理: ・辺 (u,v) が木辺または前進辺 ⇔ d[u] < d[v] < f[v] < f[u] ・辺 (u,v) が後退辺 ⇔ d[v] < d[u] < f[u] < f[v] ・辺 (u,v) が横断辺 ⇔ d[v] < f[v] < d[u] < f[u]

トポロジカルソート 入力:閉路のない有向グラフ G = (V, E) 出力: Gの全頂点の線形順序で, G が辺 (u, v) を含む ⇔ この線形順序で u が v より先に現れる 注:グラフに閉路があればそのような線形順序は存在しない 半順序しか定義されていない集合に,それと矛盾しない全順序を1つ与えることに相当する. (n+m) 時間で求まる. 閉路を持たない有向グラフは DAG (directed acyclic graph) と呼ばれる

全ての有向辺が左から右の向きになっている 注:トポロジカルソートは1通りでは無い socks 17/18 11/16 undershorts shoes 13/14 12/15 pants shirt 1/8 watch 9/10 6/7 belt tie 2/5 jacket 3/4 socks undershorts pants shoes watch shirt belt tie jacket 17/18 11/16 12/15 13/14 9/10 1/8 6/7 2/5 3/4 全ての有向辺が左から右の向きになっている 注:トポロジカルソートは1通りでは無い

TOPOLOGICAL-SORT(G) L   (空リスト) for each u  V[G] color[u]  白 if color[u] = 白 Visit(u) Visit(u) if color[u] = 灰 stop (DAGでは無い) if color[u] = 黒 return color[u]  灰 for each v  Adj[u] Visit(v) color[u]  黒 L の先頭に u を入れる 時間計算量: (n+m)

補題1: 有向グラフ G に閉路が存在しない ⇔ G を深さ優先探索した時に後退辺を生成しない 証明: →) 後退辺 (u, v) が存在すると仮定する. つまり深さ優先探索木において v は u の祖先. v から u のパスに後退辺(u, v)を加えると閉路になる. ←) G が閉路 c を含むと仮定する.c の中で最初に 訪れられる点を v とし,c において v に入る辺を(u, v) とする.時刻 d[v] では,c 内の頂点は全て白である. よって v から u まで白頂点のみからなるパスが存在 するため,vは uの先祖であり,(u, v)は後退辺となる.

補題: トポロジカルソートのアルゴリズム実行時に 辺 (u, v) が探索されたとする.グラフに閉路が無い ⇔ v は灰色ではない. (つまり,v が灰色なら解は存在しない) 証明: v が灰色なら,v は u の先祖であり, (u, v) が 後退辺となる.前の補題からグラフは閉路を持つ. グラフに閉路があるなら,後退辺 (u, v) が存在し, v は灰色である.

定理: TOPOLOGICAL-SORT(G)は有向グラフGが 閉路を持たないなら G をトポロジカルソートし,閉路 を持つならその1つを発見する. 証明: グラフが閉路を持つなら後退辺 (u, v) が存在 し,v の色は灰となる.アルゴリズムは全ての辺を 調べるので,閉路があるなら必ず発見する. 以下ではグラフが閉路を持たない場合を考える. 頂点はその探索の終了時にLの先頭に挿入される. つまり L には頂点は終了時刻 f[] の降順に入って いる.よって,G の中に辺 (u, v) があるときに f[v] < f[u] となっていることを示せばいい.

アルゴリズムが辺 (u, v) を探索する時点を考える. v の色は白か黒である.v が白なら v は u の子孫に なり, f[v] < f[u] が成立する. v が黒なら v の処理 は既に終了しているので,f[v] は既に決定されてい る.u は探索中なので f[u] は未決定である. よって f[v] < f[u] となる.

強連結成分分解 定義: 有向グラフ G = (V, E) の強連結成分 (strongly connected component) とは,次の条件を満たす 頂点の集合 C  V で極大なものと定義する. C の全ての頂点対に対して u v かつ v u (u v はuからvへ有向パスが存在することを表す.) Cが極大とは,C  C’, C  C’ となる強連結成分 C’ は無いという意味 つまり,u と v は互いに到達可能である.

13/14 11/16 1/10 12/15 3/4 4つの強連結成分 (SCC) を持つ 注: 各SCCは1つの閉路とは限らない a b c d 13/14 11/16 1/10 8/9 12/15 3/4 2/7 5/6 e f g h 4つの強連結成分 (SCC) を持つ 注: 各SCCは1つの閉路とは限らない 1点でもSCCになる

各強連結成分を1点に縮約すると,DAGになる b c d 13/14 11/16 1/10 8/9 12/15 3/4 2/7 5/6 e f g h abe cd h fg 各強連結成分を1点に縮約すると,DAGになる

定義: グラフ G = (V, E) の転置とは,次のように 定義されるグラフ GT = (V, ET) である. ET = {(v, u) | (u, v)  E} GT の隣接行列は,G の隣接行列の転置になる. GT は線形時間 (n+m) で求まる. G の各頂点 u に対し,その隣接点 v  Adj[u] を  列挙し,辺 (v, u) を GT の v の隣接リストに挿入

SCC(G) // Strongly-Connected-Components DFS(G) を呼び出し,各頂点 u に対して終了時刻 f[u] を計算する GT を計算する DFS(GT) を呼び出す.ただし 1. で計算した f[u] の降順で頂点を探索する 3. で生成した深さ優先探索森の各木の頂点集合を1つの強連結成分として出力する (n+m) 時間

補題: 有向グラフ G=(V, E) の異なる2つの強連結 成分を C と C’, u, v  C, u’, v’  C’ とする. G に経路 u u’ が存在するとき,G には経路 v’ v は存在しない. 証明: G に経路 v’ v が存在すると仮定すると, 経路 u u’ v’ と v’ v u が存在する. 従って u と u’ は互いに到達可能であり,C と C’ が 異なる強連結成分であることに矛盾する. v v’ C’ C u’ u

定義: d(U) = minu  U {d[u]} f(U) = maxu  U {f[u]} つまり, d(U) と f(U) は U の頂点の発見時刻と終了 時刻の中で最も早い時刻と最も遅い終了時刻. 補題: 有向グラフ G=(V, E) の異なる2つの強連結 成分を C と C’ とする. u  C, v  C’ である辺 (u, v) が存在するなら,f(C) > f(C’) である. C’ C v u

時刻 d[x] では C と C’ の点は全て白で,x から u に 至る白頂点だけからなるパスが G に存在する. 証明: d(C) < d(C’) の場合 C の中で最初に発見される点を x とする. 時刻 d[x] では C と C’ の点は全て白で,x から u に 至る白頂点だけからなるパスが G に存在する. (u, v)  E なので,時刻 d[x] では x から任意の頂点 w  C’ に至る白頂点だけからなるパスが G に存在 する.つまり x u  v w である.白頂点経路 定理より C’ の全頂点はDFS木で x の子孫となり, f[x] = f(C) > f(C’). x C’ C v u

d(C) > d(C’) の場合. C’ の中で最初に発見される 点を y とする.時刻 d[y] では C’ の全頂点は白で, DFS木において y の子孫となり,f[y] = f(C’) となる. 時刻 d[y] では C の全頂点は白である.C から C’ に 辺 (u, v) が存在するので, C’ から C にはパスは 存在しない. y C’ C v u

C の任意の頂点は y から到達不可能なので, 時刻 f[y] には C の全頂点はまだ白のままである. 従って,任意の頂点 w  C に対して f[w] > f[y], すなわち f(C) > f(C’) が成立する. 系1: C と C’ を有向グラフ G=(V, E) の異なる2つの 強連結成分とする. u  C と v’  C’ の間に 辺 (u, v)  ET があるとき,f(C) < f(C’) である. w y C’ C v u

定理: アルゴリズム SCC は有向グラフ G の強連結 成分を正しく求める. 証明: 帰納法で示す.アルゴリズムの3行目で求めた 最初の k 個の木が強連結成分のときに,k+1 個目も 強連結成分であることを示す.k=0のときは成り立つ. (k+1) 番目の木の根を u とし,u の属する強連結成分 を C とする.この後で訪問する C 以外の任意の強連 結成分 C’ に対して f[u] = f(C) > f(C’) が成立する. 帰納法の仮定(最初の k 個の木が強連結成分)から, C の一部の頂点が既に訪れられていることはない.

白頂点経路定理より,u からの深さ優先探索木に おいて C の他のすべての頂点は u の子孫になる. さらに,帰納法の仮定と系1から,GTの C から出る 任意の辺は既に訪問された強連結成分への辺で ある.従って,C 以外の任意の強連結成分に属する どの頂点も,u からの深さ優先探索によって u の 子孫になることはない.よって,u を根とする深さ優先 探索木の全頂点は1つの強連結成分に対応する.

木の括弧列表現 ((()()())(()())) 各節点を対応する括弧のペアで表現 n 節点で 2n bits サイズの下限と一致 P BP 6 8 1 7 3 5 4 P ((()()())(()())) BP

BPでの基本操作 ノードは( の位置で表す findclose(P,i): P[i] の( と対応する )の位置を返す enclose(P,i): P[i] の( を囲む括弧の位置を返す enclose findclose 1 1 2 3 4 5 6 7 8 9 10 11 2 3 11 8 P (()((()())())(()())()) 4 7 9 10 5 6

木の巡回操作 parent(v) = enclose(P,v) firstchild(v) = v + 1 sibling(v) = findclose(P,v) + 1 lastchild(v) = findopen(P, findclose(P,v)1) 1 enclose findclose 2 3 8 11 1 2 3 4 5 6 7 8 9 10 11 4 (()((()())())(()())()) 7 9 10 5 6

子孫の数 (部分木の大きさ) v を根とする部分木の大きさは subtreesize(v) = (findclose(P,v)v+1)/2 degree (子の数) は findclose の繰り返しで求まるが 子の数に比例する時間がかかる 1 2 3 11 1 2 3 4 5 6 7 8 9 10 11 8 P (()((()())())(()())()) 4 7 9 10 5 6

括弧列での操作の実現法 ( を +1, )を 1 として接頭辞和を求めた配列を E とする findclose(P, i) = min{j > i | E[j] = E[i]1} findopen(P, i) = max{j < i | E[j] = E[i]}+1 enclose(P, i) = max{j < i | E[j] = E[i]2}+1 (()((()())())(()())()) 1212343432321232321210 P E findclose enclose

区間最大最小木 超過配列 E を長さ s のブロックに分割 木の葉は1つのブロックに対応し,ブロック中の 最小値と最大値を格納 内部節点は l 個の子を持ち,子の最大/最小値を格納 1212343432321232321210 (()((()())())(()())()) E 1/2 2/4 3/4 2/3 1/3 0/0 m/M 1/4 0/2 0/4 s = l = 3

fwd_search(E,i,d)の計算 fwd_search(E,i,d) = min{j > i | E[j] = E[i] + d} 区間 E[i+1,2n1] を前述のように分割 (N: 配列長) 分割した区間を左から順に見て行き,E[i]+d を 含む区間を探す O(lh+s) 時間 1212343432321232321210 (()((()())())(()())()) E 1/2 2/4 3/4 2/3 1/3 0/0 m/M 1/4 0/2 0/4

l = 2, s = log n とすると h = O(log n) 区間最大最小木のノード数は O(n/log n) 全体で O(n) ビット,各操作は O(log n) 時間 データ構造を工夫すると,サイズ 2n+o(n) ビット, 各操作を O(1) 時間でできる