On the Enumeration of Colored Trees 中野 眞一 群馬大学 宇野 毅明 情報学研究所 (総合研究大学院大学) 2004年5月21日 アルゴリズム研究会 モチベーション ・あるグラフクラスに属するグラフを全部見つけたい (全部、は大変なので、ある程度以内の大きさのものに制限) ・ テスト問題用のカタログを作りたい ・ データマイニングや最適化問題の解候補を作りたい ・ 単純かつ高速な列挙方法を見つけたい 結果 頂点数が k+1 ~ n、 直径が k である色付き根無し木を 1つあたり 定数時間 で出力するアルゴリズムを構築した - 根無し木は、根が与えられていない木 - 色付き木は、各頂点に色(整数)が与えられた木 ・ 同型かつ頂点の色が等しい木を2回出力しない (重複を(効率良く)なくすのが難しい) 関連研究 家系図法 根付き順序木 有機化合物 三角形分割 マトロイド 色付き根付き 順序木 根付き 無順序木 色付き根付き 無順序木 根無し木 色付き根無し木 フロアプラン グラフ 2分木 基本アルゴリズム ・ 頂点数 1 の木から出発 ・ 頂点数 n の木に頂点を加え、頂点数が1つ大きな木を作る ・ この操作を用いて、バックトラック的に、重複なく木を生成する -根付き順序木ならば、 「最右パスの右に葉をつける」ことで、 重複なく列挙できる 無順序木の列挙 ・ 順序木と同じ方法だと、同型な木が大量に出てくる ←複数の異なる順序木が、同一な無順序木に対応するから ・深さ列を用いて、それらの代表を定義 ・ 代表になっているの順序木のみを列挙 深さ列 (順序木の)深さ列: 左を優先して深さ優先探索し、訪れた頂点の 深さをpre-orderで並べたもの ・2つの順序木が順番も含めて同型 ⇔ 深さ列が等しい ・子供の順序を入れ替えていろいろな木が作れる。その中で最大 の深さ列を持つものを left heavy embedding と呼ぶ (これが代表) (各頂点の子供を子孫の深さ列の大きさでソート) ・2つの無順序木が同型 ⇔ left heavy embedding が等しい 0,1,2,3,3,2,2,1,2,3 0,1,2,2,3,3,2,1,2,3 0,1,2,3,1,2,3,3,2,2 left heavy embedding の親 left-heavy embedding T の親 : T の最も右の葉を取った木 ⇒ 親も left-heavy embedding T 0,1,2,3,3,2,1,2,3,2,1 親 0,1,2,3,3,2,1,2,3,2 親の親 0,1,2,3,3,2,1,2,3 ・Left heavy embedding の子は、最右パスの右に、 コピー深さ以浅に葉を付けたものになる ⇒ 各頂点の子の深さ列の重みが逆転しない ⇒ コピー深さは O(1) で更新できる Family tree Left-heavy embedding の親子関係のグラフ 根無し木の列挙 ・ 根がないので、深さ列で代表を決められない ⇒ センターを根と定義する(2つある場合は1つとして扱う) センター: 最も遠い頂点までの距離が最も短い頂点 ・ 直径が偶数だと1つ、奇数だと2つ存在 left heavy embedding の親 直径 k のleft-heavy embedding T の親 : T の最も右の葉を取った木。ただし、直径が変化する場合 は、右から2番目を取る ⇒ 親も 直径 k のleft-heavy embedding T 0,1,2,3,3,2,1,2,3,2,1 親 0,1,2,3,3,2,1,2,3,2 親の親 0,1,2,3,3,2,1,2,3 Family tree ・Tの右端パスの右に、コピー深さより 浅い位置に葉をつけると子供ができる ・根の子供が2人で、2番目の 子供の子孫がパスであるなら、 1番目の子供の木の 最右パスの右につけても良い 直径 4 の場合 色深さ列 (順序木の)色深さ列: 左を優先して深さ優先探索し、訪れた 頂点の色と深さをpre-orderで並べたもの left heavy embedding も同様に定義 ・2つの色付き根無し木が同型 ⇔ センターを根とした left heavy embedding が等しい a b c 0,b,1,b,2,c,2,c,1,a,1,a,2, left heavy embedding の親 T の最も右の葉を取った木。ただし、直径が変わる葉はのぞく ⇒ left-heavy embedding になる とは限らない しかたがないので、その木のleft-heavy embedding で T の親 を定める a b c 0,b,1,b,2,c,3,a,2,c,1,a,2,c,1,a,2,b,3,c left heavy embedding でない場合 ・ 取り除く葉が、直径を達成するパスの直左にあるパスの葉で あるときのみ (そうでないときは、それより左側で、深さ列の大小が決まって いる) a b c 0,b,1,b,2,c,3,a,2,c,1,a,2,c,1,a,2,b,3,c 左右の子供の深さ列の大小の変化 ・ 大小が変化する場所は、高々一箇所 子供の一覧 ・ 追加後に、「取り除いても直径が変わらない最も右の葉」に なるように頂点を追加 ・ コピー深さよりも浅い位置に追加 ・ 直径を達成するパスの左側につける かつ、そのパスから始まるパスの末尾に追加する かつ 追加するパスの深さ列が 直径を達成するパスの prefix になっている 場合に、左右の子の逆転を考慮 ・ 全ての子供は、1つあたり 定数時間で生成できる ⇒全ての木を1つあたり定数時間で列挙できる まとめと今後の展開 ・頂点数 1~n 、直径 k の色付き根無し木を列挙する、1つ あたり定数時間のアルゴリズムを提案した ・ 順序木の列挙 ⇒ 無順序木 ⇒ 根無し木 ⇒ 色付き 根無し木、と拡張した 今後は: ・ 木より大きなクラスのグラフの列挙がしたい
© Copyright 2024 ExpyDoc