Upgrade to Pro — share decks privately, control downloads, hide ads and more …

2019-06-space-efficient-graph-search

kgoto
June 24, 2019

 2019-06-space-efficient-graph-search

kgoto

June 24, 2019
Tweet

More Decks by kgoto

Other Decks in Research

Transcript

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

    View full-size slide

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

    View full-size slide

  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必要

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  6. DFSのおさらい
    5
    nrootノードから開始し、各⼦ノードを再帰的に探索、その
    際に同じノードを2度辿らないように探索する
    https://en.wikipedia.org/wiki/Depth-first_search
    左の図でrootをA、ラベルの⼤
    きい⼦から順に探索すると仮定
    すると
    A, E, F, B, D, C, Gと探索する

    View full-size slide

  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
    *素朴なアルゴリズム

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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)時間

    View full-size slide

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

    View full-size slide

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

    View full-size slide