第4章 データ探索(続き)

パシステント構造

領域を分割した構造。今自分がどの領域にいるかという問題(点位置決定問題)がお手軽に解ける。
何度も同様な質問が繰り返されるときに最適っぽい。
分割格子点がn個くらいあるとすると、すべての分割格子点で縦に分割した“スラブ”を2分探索するのにO(log(n))、スラブを2分探索するのにO(log(n))なので、O(log(n))でたぶん探索できる。
問題点:

  • 各スラブでデータ構造が必要:各スラブにO(n)の領域が必要になる可能性がある。スラブはO(n)個存在するので、全体でO(n^2)個の領域が必要になる可能性がある。

対策:

  • 分割する代わりにスイープラインを用いて、ライン上の領域について2色木を作ることを考える。
    • 要素の挿入削除はO(log(n))で行うことができる。
    • 全部覚えたら一緒だけど、スイープで変化した変化分を覚えることによってデータが少なくできるかもしれない。

2色木のパシステント化

過去の情報も覚えておく2色木はどうやって作ろうか

  • 変化したパスを記憶してみる。(パスコピー木)
    • 新しくルートノードを作る。
    • 更新されたパスの部分だけ新しくオブジェクトを作って繋げる。そのほかのところは元通り繋いどく。
    • 記憶領域はn回の操作によってO(nlog(n))くらいになる。(ちょっと多い)
  • パスに時刻を付けてみる。(タイムラベル木)
    • ひとつのノードから異なる時刻ラベルのついているパスが沢山出る。
    • 記憶領域がn回の操作によってO(n)になる
    • どのパスをたどるかを探索するのにO(log(n))かかる⇒探索時間がO((logn)^2)になるという問題点がある。
  • 組み合わせてみる
    • タイムスロットを設けて、最初はタイムラベル木の要領でいれ、パスの上限(スロット上限)に達したらパスコピー木の要領でコピーを行う。
    • ならし計算量で考えると、良いことが分かる。(そのならし計算量が意味不明)

最適2分探索木

アクセスされる確率が等確率でない2分探索木を設計する(確率はわかっているとする)
→アクセスする確率の高いものが上の方のノードにしたい。
すべての探索木の個数\frac{_{2n}C_{n}}{n+1}について評価するのは現実的ではない。

最適探索木Tijを、次式のコストを最小にする2分探索木とする
C_{i,j}=\sum_{p=i}^j \alpha_{p} (depth(\alpha_{p}+1))+\sum_{p=i-1}^j (\beta_{p}depth(v_{p}))
↑Tijについては、部分木についても最適探索木になっているというように考えて再帰的に設計できる。すなわち

  • Tijについて、C(i,k)+C(k+1,j)を最小とするようなkを見つける。
  • Ti,kとTk-1,jを作り、再帰的に構成する。

このような手法を動的計画法という