Slide 1

Slide 1 text

グラフの省領域探索 2019/06/24 StringBeginners #6 at AIP @kgoto 0

Slide 2

Slide 2 text

はじめに 1 n“Space Efficient Algorithms for Breadth-Depth Search, Sankardeep Chakraborty, Anish Mukherjee, Srinivasa Rao Satti, acceptted to FCT 2019”の論⽂紹介をします

Slide 3

Slide 3 text

論⽂の主張 2 nBreadth Depth Search(BDS)とはグラフ探索法の1つ 同じ名前で中⾝が違う2つのアルゴリズムがある pBDShs (Horowitz and Sahni, 1984) pBDSj (Jiang, 1993) n(2つの)BDSのspace-efficientなアルゴリズムを提案した *素朴な⽅法ではO(m + n) time and O(n lg n) bits space必要

Slide 4

Slide 4 text

計算モデル 3 nread-only memory (ROM) model(⼊⼒を編集することが出 来ない)を仮定する pROM modelは領域を使いたくない、書き込み回数を減らしたい 場⾯に有⽤ • メモリ書き込みに時間がかかる • メモリの耐久性を上げたい n ⼊⼒グラフG=(V, E), n=|V|, m=|E|と表記する, ここでGは隣 接リストの形式で表される(各ノードについて隣接ノード をリストとして持つ、隣接リストは⼦のラベルの昇順に並 んでいるものとする)

Slide 5

Slide 5 text

今⽇話す話題 4 n提案アルゴリズムのベースとなるBDSjのO(m lg n)時間O(n) bits領域アルゴリズムを説明する (主定理のアルゴリズムはなかなか複雑なので) n論⽂を読んだ限りBDSjは⼦の探索順を逆にした(⼦のラベ ルが⼤きい⽅から順に読む)DFSにしか⾒えませんでした nなので以降はDFSの省領域探索アルゴリズムとして説明し ます。もし、違う点があれば教えてほしいです おことわり

Slide 6

Slide 6 text

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領域使⽤する

Slide 9

Slide 9 text

状態管理 8 n探索ステップの各ノードの3状態をO(n) bitsで保存する pwhite: 未探索 pgray: 探索中(スタックに保存されているノード) pblack: 探索済み(⼦ノードはすべてblack)

Slide 10

Slide 10 text

探索ステップ 9 nrootノードをgrayノードに変更しスタックにpush top n / lg n個保存し、あぶれた(忘却する)最後のノードをlast nodeとして記憶 nスタックが空でない場合、topノードvについて処理を⾏う pif vの⼦供がすべてblack(⼦供をすべて探索済み) • vをスタックからpopし出⼒する pelse • vのright-mostなwhite(未探索)ノードをgrayノードに変更しスタックにpush nスタックが空の場合探索ステップを終了 探索ステップで少なくともn / lg n個の要素を出⼒する 計算時間はO(m)時間

Slide 11

Slide 11 text

再構築ステップ 10 nすべてのgrayノードをwhiteノードに変更する nlast nodeがスタックに保存されるまで探索ステップを⾏う 前探索ステップの出⼒ノードに続く スタックのtop n / lg n要素が必ずスタックに保存される なぜか︖通常のDFSを正しく模倣出来ているから。 blackノードは通常のDFS探索で欲しい状態に⾄る前にpopさ れるノード → skipしても状態の再構築(探索順)には影響ない → skipすることで省領域で状態を復元できる

Slide 12

Slide 12 text

より省領域なアルゴリズム(気持ちだけ) 11 nボトルネックはスタックの復元にかかる計算時間 n復元に必要な情報を省領域に保存し⾼速化する pスタックをO(lg n/ lg lg lg n)ブロックに分割、top 2ブロックを陽 に保存し、すべてのブロックの最初と最後の要素を保存する p各ノードについて、color, 所属するブロックID、処理した⼦供の 数(m/nグループに分け、グループIDを記録する) あるブロックを復元する場合 (保存した)最初のノードから探索を⾏い復元する その際に、各ノードがどのブロックに属するかを保存して いるので適切に復元できる