2019-06-space-efficient-graph-search

6f84f75ab93ad599bcf89a78dc5da8dc?s=47 kgoto
June 24, 2019

 2019-06-space-efficient-graph-search

6f84f75ab93ad599bcf89a78dc5da8dc?s=128

kgoto

June 24, 2019
Tweet

Transcript

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

  2. はじめに 1 n“Space Efficient Algorithms for Breadth-Depth Search, Sankardeep Chakraborty,

    Anish Mukherjee, Srinivasa Rao Satti, acceptted to FCT 2019”の論⽂紹介をします
  3. 論⽂の主張 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必要
  4. 計算モデル 3 nread-only memory (ROM) model(⼊⼒を編集することが出 来ない)を仮定する pROM modelは領域を使いたくない、書き込み回数を減らしたい 場⾯に有⽤

    • メモリ書き込みに時間がかかる • メモリの耐久性を上げたい n ⼊⼒グラフG=(V, E), n=|V|, m=|E|と表記する, ここでGは隣 接リストの形式で表される(各ノードについて隣接ノード をリストとして持つ、隣接リストは⼦のラベルの昇順に並 んでいるものとする)
  5. 今⽇話す話題 4 n提案アルゴリズムのベースとなるBDSjのO(m lg n)時間O(n) bits領域アルゴリズムを説明する (主定理のアルゴリズムはなかなか複雑なので) n論⽂を読んだ限りBDSjは⼦の探索順を逆にした(⼦のラベ ルが⼤きい⽅から順に読む)DFSにしか⾒えませんでした nなので以降はDFSの省領域探索アルゴリズムとして説明し

    ます。もし、違う点があれば教えてほしいです おことわり
  6. DFSのおさらい 5 nrootノードから開始し、各⼦ノードを再帰的に探索、その 際に同じノードを2度辿らないように探索する https://en.wikipedia.org/wiki/Depth-first_search 左の図でrootをA、ラベルの⼤ きい⼦から順に探索すると仮定 すると A, E,

    F, B, D, C, Gと探索する
  7. 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 *素朴なアルゴリズム
  8. 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領域使⽤する
  9. 状態管理 8 n探索ステップの各ノードの3状態をO(n) bitsで保存する pwhite: 未探索 pgray: 探索中(スタックに保存されているノード) pblack: 探索済み(⼦ノードはすべてblack)

  10. 探索ステップ 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)時間
  11. 再構築ステップ 10 nすべてのgrayノードをwhiteノードに変更する nlast nodeがスタックに保存されるまで探索ステップを⾏う 前探索ステップの出⼒ノードに続く スタックのtop n / lg

    n要素が必ずスタックに保存される なぜか︖通常のDFSを正しく模倣出来ているから。 blackノードは通常のDFS探索で欲しい状態に⾄る前にpopさ れるノード → skipしても状態の再構築(探索順)には影響ない → skipすることで省領域で状態を復元できる
  12. より省領域なアルゴリズム(気持ちだけ) 11 nボトルネックはスタックの復元にかかる計算時間 n復元に必要な情報を省領域に保存し⾼速化する pスタックをO(lg n/ lg lg lg n)ブロックに分割、top

    2ブロックを陽 に保存し、すべてのブロックの最初と最後の要素を保存する p各ノードについて、color, 所属するブロックID、処理した⼦供の 数(m/nグループに分け、グループIDを記録する) あるブロックを復元する場合 (保存した)最初のノードから探索を⾏い復元する その際に、各ノードがどのブロックに属するかを保存して いるので適切に復元できる