Compact Data Structures: A Practical Approach の Chapter 5: Permutations の輪講資料です。
Chapter 5: PermutationsCompact Data Structures: A Practical Approach (Gonzalo Navarro)発表者:飯塚1
View Slide
発表の流れ21. 順列 [1, ] の最悪エントロピーの評価➡ 順列の保存は log bits でほとんど最適2. Inverse *+() を実現する簡潔順列➡ 1 + log + () bits の空間計算量で 1/ の時間計算量を実現 ( > 0)3. Power 5() を実現する簡潔順列➡ 任意の について *+() と同様の時間・空間計算量内部的には *+() の簡潔順列を利⽤して実現される
順列 [1, ] の最悪エントロピーの評価3• 順列 [1, ]:1, 2, …, n を並べ替えた配列• ⼤きさ の順列は ! 種あるので ℋ9:= log = log !a. ≥ 1 のとき ! ≤ ? より ℋ9:≤ log ? = log b. log ! = log ∏ ?5A+= ∑ log ?5A+Jensen の不等式 ∑ 5?5A+≤ +?∑ 5?5A+が使えるE log ?5A+≤ log1E ?5A+= log1⋅12 + 1= (log + 1 − 1) = log + 1 − Θ()c. Stirling の近似を使うと log ! = log − Θ()各要素 log bits の配列 (Section 3.1) に保存するだけでほとんど最適 ➡ 有⽤な機能という付加価値を付ける
実現したい有⽤な機能4• *+ : = となる を⾒つける• 5(): … … のように を 回適⽤したときの遷移先を求める• 1 + log + () bits のスペースで 1/ の時間計算量を実現 ( > 0)• log + log ではないから succinct ではない?➡ = 1/ log とすれば log + bits のスペースで log の時間計算量
5.1 Inverse Permutations5【⽬的】*+ : = となる を⾒つけるa. あらかじめ *+ を持っておくと時間計算量 1➡ 補助領域が log bits … log が達成できないb. += () ,O= + , … を繰り返して = となる を⾒つけたらストップ➡ 時間計算量が () … は⼤きいb. をベースに⾼速化するためのアイデア1. cycle decomposition2. shortcut
cycle decomposition6 1 2 3 4 5 6 7 8 9 10 11 12() 10 7 3 5 8 1 11 12 4 6 9 2581227941110613
shortcut75812279411Inverse *+ の計算1. 基本的には順列の⽅向に進む2. 逆向きのショートカットがあったら1度だけ使う3. = となる を⾒つけたらストップ時間計算量 : パラメータ 以上の間隔が空かないように逆向きのショートカットを⽤意
shortcut の格納85812279411 1 2 3 4 5 6 7 8 9 10 11 12() 10 7 3 5 8 1 11 12 4 6 9 2 0 1 0 0 0 0 0 1 1 0 0 0 8 9 2:ショートカットの有無:ショートカット先 は左詰めにして の rank でアクセスする
空間計算量と時間計算量9• , 元の順列: log bits• , shortcut の有無: n bits の bit vector。constant time の rankが必要。4.2.2 の⽅法で + bits• , shortcut 先:サイクルの⻑さを としたとき個々のサイクルは / 個のショートカットを持つから の要素数は O?WX+を超えない(←サイクル⻑が + 1 の場合)よって OWX+ log bits• = OWX+とおくと 1 + log + + () bits• = 1/ log とすれば log + bits のスペースで = 1/ = log の時間計算量
5.2 Powers of Permutations10サイクル順に要素を並べた配列を作るとPower は簡単に計算できる+ … [5, 8, 12, 2, 7, 11, 9, 4]O … [10, 6, 1]Z … [3]581227941110613
Power の計算例11• + … [5, 8, 12, 2, 7, 11, 9, 4]• O … [10, 6, 1]• Z … [3]O[(12) を計算したい1. 12 は +の 3 番⽬の要素である2. +3 − 1 + 20 mod ++ 1 = +22 mod 8 + 1 = 9*+(10) を計算したい1. 10 は Oの 1 番⽬の要素である2. O1 − 1 − 1 mod O+ 1 = O−1 mod 3 + 1 = 1*+ のデータ構造は不要だった?➡ 5 の実装に必要
格納⽅法 (1)12+ … [5, 8, 12, 2, 7, 11, 9, 4]O … [10, 6, 1]Z … [3]• :+, O, … を並べた配列。 log bits• :+, O, … の終端の位置が 1 になる bit vector。pred と succ (Section 4.5.2) を使ってサイクル⻑を求める※ 元の順列 の格納はもはや不要 1 2 3 4 5 6 7 8 9 10 11 12 5 8 12 2 7 11 9 4 10 6 1 3 0 0 0 0 0 0 0 1 0 0 1 1
格納⽅法 (2)13• これだけでは「 上での の出現位置」を答えるのに かかってしまう• そこでポインタ を⽤意して 1 で計算可能にする 5 8 12 2 7 11 9 4 10 6 1 3 0 0 0 0 0 0 0 1 0 0 1 1 1 2 3 4 5 6 7 8 9 10 11 12
格納⽅法 (3)14• に ⌈log ⌉ bits, に ⌈log ⌉ bits, に + () 必要• これでは 2 log + () bits 必要で簡潔にならない• 実は は不要 5 8 12 2 7 11 9 4 10 6 1 3 0 0 0 0 0 0 0 1 0 0 1 1 1 2 3 4 5 6 7 8 9 10 11 12
格納⽅法 (4)15• に Section 5.1 の⼿法を適⽤して *+ を計算可能にする• の 番⽬の要素は *+() で計算可能• よって に 1 + log + + () bits, に + () bits• = 1/ log のとき全体で log + bits 5 8 12 2 7 11 9 4 10 6 1 3 0 0 0 0 0 0 0 1 0 0 1 1 1 2 3 4 5 6 7 8 9 10 11 12
計算例16O[(12) を計算したい1. 12の 上での位置は 12 = 32. , 3 = 0, , 3 = 8 よりサイクル⻑は 83. 3 − 1 + 20 mod 8 + 1 = 7, *+ 7 = 9 5 8 12 2 7 11 9 4 10 6 1 3 0 0 0 0 0 0 0 1 0 0 1 1 1 2 3 4 5 6 7 8 9 10 11 12