Slide 1

Slide 1 text

強暗黙静的指探索 Strong Implicit Static Finger Search StringBeginners #15 – online Feb 10, 2021 @kgoto 0

Slide 2

Slide 2 text

発表の概要 1 ◼省領域データ構造の究極系である 強暗黙データ構造 (strong implicit data structures)を 指探索(finger search)を通して学ぶ ◼強暗黙データ構造を学ぶとここがうれしい! 領域をケチる実用的なテクニック・考え方が学べる 良い問題設定の方法について学べる • なにを前提とするか • 性能の測り方の基準 などなど

Slide 3

Slide 3 text

省領域データ構造の分類 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

Slide 4

Slide 4 text

強暗黙データ構造 3 ◼計算モデルはRAMモデル 要素の比較、swapをコスト1で実行する 配列Aとn=|A|は領域にカウントしない ◼Query間でA, n以外は保存しない Query中はO(1)のレジスタ(word)が使用可能

Slide 5

Slide 5 text

暗黙データ構造の例: 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 では?

Slide 6

Slide 6 text

暗黙データ構造の例: 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

Slide 7

Slide 7 text

暗黙データ構造の例: 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を繰り返す

Slide 8

Slide 8 text

暗黙データ構造の例: 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も同様の時間で計算可能

Slide 9

Slide 9 text

指探索(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 要素の追加、削除をサポートする動的なバージョンもあるが今回は静的な場合のみを考える

Slide 10

Slide 10 text

弱暗黙指探索 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

Slide 11

Slide 11 text

強暗黙静的指探索は難しいぞ 10 ◼素朴な発想:fingerの位置を固定する ソート済み配列をrotationしてfingerを先頭に持ってくる searchは高速 O(log t) time change_fingerが大変 O(n) time searchとchange_fingerのトレードオフを考慮 して効率良いデータ構造を考える必要あり

Slide 12

Slide 12 text

強暗黙静的指探索 11 q(t, n) ∈ Ω(log n) s.t. • q(t, n)≧log t • q(0, n)

Slide 13

Slide 13 text

メモリレイアウト 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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

データ境界の計算 14 ◼O内部のデータ境界はO(log n)時間で計算可能 case 3, 4はPの左端、右端とfの大小をチェック case 2はcase 1の特殊系と考える case 1における境界の求め方。 A[Δ+1]のpredecessorがl2の右端、l2の右端のsuccessorを計算する

Slide 16

Slide 16 text

change_finger 15 ◼左(ソート済み配列)から右へO(Δ)回のswapで変換可能 change_fingerはソート済み配列へrevertして同様の処理を行う (Caseの判定とデータ境界の計算が必要)O(Δ+log n)時間

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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)}