An Algorithm for Enumerating Maximal Matchings of a Graph 宇野 毅明 国立情報学研究所・総合研究大学院大学 2002年 9月19日 アルゴリズム研究会 問題の定義 ・ 与えられたグラフ G = (V,E ) に対して、 「 G の全ての極大マッチングを、ちょうど一度ずつ出力せよ (列挙せよ)」 という問題を考える ・ G の辺グラフを G' とすると、上記の問題は G' の極大安定集 合を列挙する問題と等価 ・ G の極大安定集合: 築山らのアルゴリズムで、ひとつあたり O(|V||E| ) 時間で列挙できる G' だと O(|E|×|V||E| ) 時間になる 極大安定集合列挙 ・ 極大安定集合列挙アルゴリズムは、斬新なアイディアで作られ ている。 ※ それまでのアルゴリズムは、分割法とバックトラッキング 極大安定集合は列挙できない(出力多項式時間では) ・ 95年にAvis・福田が提案した逆探索と同じ探索をしている ・ 00-01年中野により、いくつかのグラフオブジェクトに対し、この アルゴリズムと同じ方法の、効率良い列挙アルゴリズムが提 案されている しかし、 問題が基礎的な割には、 出力多項式アルゴリズムの中でも計算量が大きい 問題の特殊化 もともとの動機は、 ・ 極大安定集合列挙を速くしたい でも、それは難しい (データ構造を使っても、ならし解析をしても難しい) ・ せめて、特殊ケースだけでも速く解けないか? (2部グラフでは O(1 ) で列挙できている) ・ では、極大マッチング、という特殊ケースはどうか O(|E|×|V||E|) でますます遅くなる 極大マッチングの列挙だけでも速くしよう 極大マッチングの逆探索 ・ 築山らの列挙法を、極大マッチングに適用 E = { e1,…,em }, Ei = { e1,…,ei } とする グラフ Gi =(V, Ei ) の極大マッチング M を i-極大マッチング と呼び、 ( i, M ) と表記する 全ての i-極大マッチングを列挙する、という問題を考える (そして、普通の極大マッチングだけ出力する) ( 極大安定集合の場合は、 i-極大安定集合を考える) 極大マッチングの親 i-極大マッチング ( i, M ) に対してその親を (i-1)-極大マッチング ( i-1, M' ) で定める。ただし、 1. ei が M に含まれなければ M' = M 2. そうでなければ M' = M \ { ei } に極大になるまで、添え 字の昇順で枝を加えたもの ( 極大安定集合では頂点を加える) ・ だれも、自分の真の先祖にならない ・ 1-極大マッチング ( 1, {e1} ) だけ親を持たない 親子関係は、 ( 1, {e1} ) を根とする木になる (列挙木) 親の作り方(図解) 1. ei が M に含まれなければ M' = M 2. そうでなければ M' = M \ { ei } に極大になるまで添え 字の昇順で枝を加えたもの 14 13 12 列挙木の例 列挙木 列挙木を探索 列挙木を(深さ優先)探索し、全ての頂点を訪れれば、すべ ての i-極大マッチングが列挙できる ( 逆探索) 木自体をメモリに持つ 極大マッチングを 列挙しなければならない 指数メモリが必要 ・ 深さ優先探索をするには、 今訪れている頂点の子供が得られれば十分 与えられた親の子供を見つけるアルゴリズムを考える 子供を求める ・ ( i, M ) に対して 1. ei+1 が M の辺に隣接する: M' = M 、隣接しない: M' = M ∪{ei+1} ( i+1, M' ) は ( i, M ) の子供になる ( type1 ) ( type 1 の子供は必ず存在する ) 2. M' = M ∪{ ei+1 } から ei+1 に隣接する枝を取り除いたもの ( i+1, M' ) は ( i, M ) の子供になりうる ( type2 ) ・ ( i+1, M' ) が ( i, M ) の子供であれば、必ずどちらかの方法で得 られる (極大安定集合の場合も同じ) 子供の求め方(図解) 1. ei+1 が M の辺に接するなら M' = M 、 そうでなければ M' = M ∪{ ei+1 } 2. M' = M ∪{ ei+1 } から ei+1 に隣接する枝を取り除いたもの 子供を求める計算時間 ・ ( i, M ) に対して type 1 M' = M か M' = M ∪{ ei+1 } type 2 M' = M ∪{ ei+1 } から ei+1 に隣接する枝を取り除く O(1) 時間で得られる ( i+1, M' ) が ( i, M ) の子供であるかどうかのチェック O(Δ) ※ Δはグラフの最大次数 (極大安定集合の場合は、 O(|V|),O(|E|) ) 計算量を算定 任意の i-極大マッチングは ( i<|E| なら ) 子供を1人は持つ 1~ |E| 極大マッチングの数は、 高々 (極大マッチングの数) × |E| 1つあたりの計算時間は O(Δ|E|) ※ Δはグラフの最大次数 (極大安定集合の場合は、 O(|V| |E| ) ) O(|V||E|2) よりは速くなった 改良 ・ type 2 の子供を短時間で見つける (データ構造による改良) ・ 列挙木の頂点が多くならないよう、工夫する (枝の添え字付けの工夫による) O(Δ) まで速くする Type 2 子供を短時間で発見 2. M' = M ∪{ ei+1 } から ei+1 に接する枝を取り除く ej v Type 2 の子供であるためには、 (1) ei+1 に隣接する枝があること O(1) 時間 (2) M' が極大マッチングであること (3) M'\ { ei+1 } に追加するべき枝が M の枝であること 各頂点 v ( と v に接続する M の枝 ej )に対して、 A(v):(2) のため:v に接続する枝で、M\ { ej } の枝に隣接しないもの l(v): (3) のため: A(v) の枝で、添え字が j より小さいものの数 を、アルゴリズムの実行中保持 Type 2 子供を短時間で発見2 * M' = M ∪{ ei+1 } から ei+1 に隣接する枝を取り除く (2) M' が極大マッチングであること ei+1 に隣接する M の枝 e の端点 u が、 u に接続する枝で、M\ { e } の枝に隣接しないもの を持つと、極大にならない (+α) A(u) = φ u u Type 2 子供を短時間で発見3 2. M' = M ∪{ ei+1 } から ei+1 に接する枝を取り除く (3) M'\ { ei+1 } に追加するべき枝が M の枝であること ei+1 の端点 u に隣接する M の枝 ej が、 M'\ { ei+1 } の枝に隣接しない枝の中で、最小添え字 (+α) v に接続する M\ {ej } の枝に隣接しない枝で、 添え字が j より小さいものの数 = 0 l(u) = 0 u u データ構造の更新 A(v)、l(v) のデータは、 M' △ M の枝に隣接する枝についての み、変更がある。 M' △ M の枝に接続する頂点の次数和の時間 ・ type2子供に関する再起呼び出し: O(Δ) 時間 ・ 連続する type1子供に関する再起呼び出し: ※ 最初のマッチングに、枝が単調に追加されるだけ ( 最後のマッチング )\(最初のマッチング ) の枝に接続する頂 点の次数和 = O(|E|) 両者とも、高々(出力数)回 : 1つあたり O(|E|) 時間 列挙木の頂点数を減少 ・ 枝集合をブロックに分割 ・ ブロックごとに添え字を付ける ※ ブロックは、(隣接する2本の枝bi,b'i) に隣接する枝全部からなる ※ ブロックを逐次的に枝集合から取り除く ※ 後に取り除いたブロックの枝から昇順に添え字を付ける 枝集合 ・・・ ブロック1 ブロック 1,2,…,k :取り除いた順番 ※ ブロックは(隣接する枝bi,b'i ) に隣接する枝全部 ブロック j+1,…,k の極大マッチングに枝を追加してブロック j,…,k の極大マッチングを作ると、高々3本しか追加されない 1つのブロック内の、連続する type1子供の再帰呼び 出しにかかる時間は O(Δ) 枝集合 ・・・ ・・・ ブロック2 ブロック 1,2,…,k :取り除いた順番 ※ ブロックを逐次的に枝集合から取り除く (bi,b'i) は、後に取り除いたブロック j>i の枝に隣接しない ブロック j,…,k の極大マッチングに、 ( bi か b'i ) を加えて、 2つ以上極大マッチングができる 各ブロック内で、必ず1つ以上、type2子供ができる 枝集合 ・・・ ・・・ 列挙木をパスに分解 データの更新は、列挙木の各枝に対応 各枝での更新時間の総和を求める ・ 列挙木を、「type2子供の再帰呼び出し」の枝の端点で分割する ※ 分割されてできるパス・枝の 総数は、葉の数の2倍以下 出力数の2倍以下 ・・・ 各枝・パスの計算時間 ・ 「type2子供の再帰呼び出し」の枝の計算時間は O(Δ) ・ パスは、連続するtype1子供の再帰呼び出しに対応 長さは高々2ブロック (枝数6Δ以下) パスでの計算時間は、O(Δ) 出力ひとつあたり O(Δ) 時間となる ・・・ まとめ ・ 築山らによる極大安定集合列挙アルゴリズムを極大マッチ ング列挙問題に焼きなおした O(Δ|E|) ・ データ構造の導入をして高速化した O(|E|) ・ 添え字の付け方を工夫して高速化した O(Δ) ・ 極大安定集合列挙が速くならないかなあ
© Copyright 2024 ExpyDoc