DFSのおさらい
5
nrootノードから開始し、各⼦ノードを再帰的に探索、その
際に同じノードを2度辿らないように探索する
https://en.wikipedia.org/wiki/Depth-first_search
左の図でrootをA、ラベルの⼤
きい⼦から順に探索すると仮定
すると
A, E, F, B, D, C, Gと探索する
Slide 7
Slide 7 text
O(m)時間O(n lg n) bits領域DFSアルゴリズム
6
n準備(使⽤するデータ構造)
p各ノードの状態、未探索 or 探索済みをO(n)bitsで管理
pO(n lg n)bitsのスタックで探索順を管理
nアルゴリズム
prootノードを探索済みノードに変更しスタックにpush
pスタックが空出ない場合、topノードvについて以下の処理を⾏う
• if vの⼦供がすべて探索済み
– vをスタックからpopし出⼒する
• else
– vのright-mostな未探索ノードを探索済みノードに変更しスタックにpush
*素朴なアルゴリズム
Slide 8
Slide 8 text
O(m lg n)時間O(n) bits領域アルゴリズムの概要
7
nボトルネックはスタック領域。
スタックの上部(直近挿⼊要素)n / log n個の要素だけを
陽に保存し(O(n) bits領域)、O(m)時間探索を⾏う
n次のtop n / log n個をO(m)時間で復元し同様の処理を⾏う
top n / lg n個を陽に保存する。O(n) bits必要
陽に持たない、復元ステップで復元する
スタック
n
O(lg n)回
全体でO(m lg n)時間、O(n) bits領域使⽤する