Document

A Simple Constant Time Enumeration
Algorithm for Free Trees
中野 眞一
群馬大学
宇野 毅明
情報学研究所
2003年9月19日 アルゴリズム研究会
結果
頂点数が n、 直径が k である根無し木を
1つあたり 定数時間 で出力するアルゴリズムを構築した
・ 同型な木を2回出力することはない
・ 1つ出力してから次を出力するまで、定数時間
「free tree」 は、「根の無い木」のことです
研究背景
列挙の研究は面白い
・ キレイな結果の出る問題が残っている
(アルゴリズム的な研究がされつくしていない)
・ 近年、工学的な応用が増えた
(計算機パワーの増大&アルゴリズムの進展で、
列挙という手法を使ったモデルを解けるようになった)
- データの生成、解候補の作成、ものの特徴付け、など
問題:根無し木の列挙
問題: 頂点数が n 、直径が k の根無し木を列挙せよ
ただし、同型なものは同一視せよ。
根無し木の列挙
既存研究:
・ 1つあたり定数時間。
・ ただし、複雑でよく分からない
・ Delay(次の出力までの時間)は定数でない
問題の難しさ
・ 通常、この手の列挙問題にはバックトラック法が使われる
・ 例えば、1頂点から子供を付け足していき、n頂点、直径k
になったら出力して引き返し、他の位置に子供を付け足す。
⇒ 木をメモリに蓄える際に、どうしても根(のようなもの)と
兄弟の順番が決まる。
⇒ 同型なものが
たくさん出てしまう
難しさを避ける
作戦:
根無し木に対して、ある標準的な「根の与え方」「子供の順序
の与え方」を定める(標準形)
- 根無し木と標準形は1対1対応する
・ あとは、標準形を列挙しましょう
(※ 以後、直径 k を偶数とする)
根の与え方
木のセンターを根とする
センター: 最も遠い頂点までの距離が最も短い頂点
(つまりは真ん中)
直径が偶数だと、唯一的に定まる
順番を与える:depth sequence
depth sequence:
左を優先して深さ優先探索し、訪れた頂点の深さをpreorderで並べたもの
2つの木が順番も含めて同型 ⇔ depth sequence が等しい
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
L(v) : v から下の部分木の depth sequence
辞書順:
bro(v ) : v の左隣の兄弟
長いほうが大きい
T が Left-heavy embedding :
⇔ 任意の頂点v について、L(bro(v)) ≧ L(v)
・ 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
標準形ができました
・ 根無し木に対して
(1) センターを根にする
(2) Left-heavy embedding になるように順番をつける
として標準形(根付き順序木)が得られる
・ あとは、頂点数が n、直径がk である、標準形(left-heavy
embedding)を列挙しましょう
left heavy embedding の親
left-heavy embedding T の親 :
Tの(根の子供でない)最も右の葉を取り、
根の子供にした木
⇒ 親も left-heavy embedding
ただし、直径が変わってしまう場合は、右から2番目をとる
T
0,1,2,3,3,2,1,2,3,2,1
親
親の親
0,1,2,3,3,2,1,2,3,1,1 0,1,2,3,3,1,2,3,1,1,1
Family tree
Left-heavy embedding の親子関係をグラフで表現
・これを深さ優先探索する
・標準形Tの子供が作れれば
探索できる
頂点数 7、
直径 4 の場合
left heavy embedding の子
・ Tの子供 S は T の根の子供を1つとり、(深さ2以上の)最も
右の葉になるように付けたもの
O(1)時間で
作れる
・逆は、成り立つとは限らない。しかし、
「ある頂点 v の深さ以下であれば子供になる」
という性質が成り立つ
しかも、子供の v は、親の v の次か、加えた頂点の直左
T
子供
O(1)時間で
更新できる
1つ定数時間
で列挙できる
Delayを定数にする
・ 「深さが奇数の反復は、再帰呼び出しの前に出力」
「深さが偶数の反復は、再帰呼び出しの後に出力」
とすると、次の出力までの計算時間が定数(3反復以下)になる
再帰構造
直径が奇数の場合
・ センターが2つになる
2つのセンターを1つの頂点のように扱い、同様の議論をする
(根の子供の順番付けに関して例外処理が必要)
まとめと今後の展開
・頂点数 n 、直径 k の根無し木を列挙する、次の出力まで
定数時間であるアルゴリズムを提案した
・ まず直径が偶数の場合のアルゴリズムを作り、直径が奇
数の場合は、それを拡張した
今後は:
・ 平面に埋め込んだ木や、木以外のグラフオブジェクトも
(簡単なアイディアで)列挙したい