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

2021-02-implicit-static-finger-search

kgoto
February 12, 2021

 2021-02-implicit-static-finger-search

kgoto

February 12, 2021
Tweet

More Decks by kgoto

Other Decks in Research

Transcript

  1. 強暗黙静的指探索 Strong Implicit Static Finger Search StringBeginners #15 – online

    Feb 10, 2021 @kgoto 0
  2. 発表の概要 1 ◼省領域データ構造の究極系である 強暗黙データ構造 (strong implicit data structures)を 指探索(finger search)を通して学ぶ

    ◼強暗黙データ構造を学ぶとここがうれしい! 領域をケチる実用的なテクニック・考え方が学べる 良い問題設定の方法について学べる • なにを前提とするか • 性能の測り方の基準 などなど
  3. 省領域データ構造の分類 2 ◼あるデータの保存に必要な情報量下限をZとしたとき データ構造を使用領域によって分類する 小領域(Compact): O(Z) bits 簡潔(Succinct): Z +

    o(Z) bits 暗黙(Implicit): Z + O(1) bits https://ja.wikipedia.org/wiki/簡潔データ構造 明確な同意はない 本発表では以下の定義を採用する [Nielsen, 2015] 強暗黙: Z bits 弱暗黙: Z bits + O(1) words
  4. 強暗黙データ構造 3 ◼計算モデルはRAMモデル 要素の比較、swapをコスト1で実行する 配列Aとn=|A|は領域にカウントしない ◼Query間でA, n以外は保存しない Query中はO(1)のレジスタ(word)が使用可能

  5. 暗黙データ構造の例: Binary heap 4 ◼heap制約を満たす完全二分木の配列表現 *heap制約:各ノードは子より大きい 0 1 2 3

    4 5 6 7 8 100 19 36 17 3 25 1 2 7 = A[i]の子はA[2i+1], A[2i+2] 保存するのは値を格納した配 列のみ(自明な情報量下限) 発表でn log U(ここでデータ構造は[0, U-1]の整数値を保存するとする)は 情報量下限でないのではというツッコミあり。log U C n では?
  6. 暗黙データ構造の例: Binary heap 5 ◼Binary heapは以下の操作をサポートする add(x): xを追加する pop(): 最大値を削除する

    0 1 2 3 4 5 6 7 8 100 19 36 17 3 25 1 2 7 = O(log n) time O(log n) time
  7. 暗黙データ構造の例: Binary heap 6 pop 100 0 1 2 3

    4 5 6 7 8 100 19 36 17 3 25 1 2 7 popはrootを取り出し、A[n-1]をrootに移動したあとheap制約 を満たすように左右いずれかの子とswapを繰り返す
  8. 暗黙データ構造の例: Binary heap 7 36 25 7 0 1 2

    3 4 5 6 7 8 36 19 25 17 3 7 1 2 - popはrootを取り出し、A[n-1]をrootに移動したあとheap制約 を満たすように左右いずれかの子とswapを繰り返す O(log n)時間で実行可能 addも同様の時間で計算可能
  9. 指探索(finger search) 8 ◼finger searchはfinger propertyを持ち、 以下の操作を提供する辞書データ構造 search(x): xが含まれるかyes/noを返す change_finger(x):

    fingerをxに変更する ある要素をfingerとして、search(x)の計算時間が fingerとxとのランク距離tに依存する finger property 要素の追加、削除をサポートする動的なバージョンもあるが今回は静的な場合のみを考える
  10. 弱暗黙指探索 9 ◼ データをソートして配列で保存、fingerの位置を保存 O(log N) bits search(x): fingerを起点として指数探索を行う O(log

    t)時間 • ① x≦A[rank(f)+2i]を満たす最小のiを求める • ② A[rank(f), rank(f)+ 2i]を二分探索 強暗黙指探索ではfingerを保存できないのでこの方法は使えない f x
  11. 強暗黙静的指探索は難しいぞ 10 ◼素朴な発想:fingerの位置を固定する ソート済み配列をrotationしてfingerを先頭に持ってくる searchは高速 O(log t) time change_fingerが大変 O(n)

    time searchとchange_fingerのトレードオフを考慮 して効率良いデータ構造を考える必要あり
  12. 強暗黙静的指探索 11 q(t, n) ∈ Ω(log n) s.t. • q(t,

    n)≧log t • q(0, n)<log (n/2) • q(t, n)はt, nについて単調非減少 Δ=Zq(n) = min{t ∈[1, n]|q(t, n)≧log (n/2)} • qがtだけの関数ならZq(n) = q-1(log (n/2)) ◼q(t, n)=(1/ε) log t for 0<ε≦1とすると change_searchはO(nε)時間 searchをO(q(t, n))時間、change_searchをO(Δ+log n)時間でサ ポートする強暗黙指探索データ構造が存在する 定理 [Brodal+, 2012] qはトレードオフパラメータ この計算時間は最適であることが証明されている(今回は省略)
  13. メモリレイアウト 12 ◼ソート済み配列Aにおいてf近傍A[rank(f)-Δ, rank(f)+Δ]を A[Δ+1]=fになるようにAの先頭に移動する ソート済み配列A fの位置の場合分けは4つある fが必ずA[Δ+1]に来るので 位置を覚えておく必要なし 図:Implicit

    Data Structures, Sorting, and Text Indexing
  14. データ境界の計算 13 ◼各データ境域を知ることが重要 ◼P内部のデータ境界はO(log Δ)時間で計算可能 任意の値はfより小さい 任意の値はfより大きい O内部のデータ境界も同様の方法でO(log n)時間で計算可能

  15. データ境界の計算 14 ◼O内部のデータ境界はO(log n)時間で計算可能 case 3, 4はPの左端、右端とfの大小をチェック case 2はcase 1の特殊系と考える

    case 1における境界の求め方。 A[Δ+1]のpredecessorがl2の右端、l2の右端のsuccessorを計算する
  16. change_finger 15 ◼左(ソート済み配列)から右へO(Δ)回のswapで変換可能 change_fingerはソート済み配列へrevertして同様の処理を行う (Caseの判定とデータ境界の計算が必要)O(Δ+log n)時間

  17. search(x) 16 ◼P領域でfを起点として指数探索 t≦Δかつxを含むならxはP領域にある O(log t) 時間 ◼見つからなければその他の領域をそれぞれ二分探索する 二分探索によりO(log n)時間で見つかる

  18. search(x) 17 ◼P領域でfを起点として指数探索 t≦Δかつxを含むならxはP領域にある O(log t)∈O(q(t, n))時間 ◼見つからなければその他の領域をそれぞれ二分探索する 二分探索によりO(log n)時間で見つかる

    ここでt>ΔよりO(log n)∈O(q(t, n)) searchをO(q(t, n))時間、change_searchをO(Δ+log n)時間で サポートする強暗黙指探索データ構造が存在する 定理 [Brodal+, 2012] q(t, n)≧log tより Δの定義とqはtに対して単調非減少より Δ = min{t ∈[1, n]|q(t, n)≧log (n/2)}