Advertisement

More Related Content

Slideshows for you(20)

Advertisement
Advertisement

直交領域探索

  1. 直交領域探索 okuraofvegetable
  2. まずはじめに • 皆さんよく長方形の内部に含まれ る点を列挙したくなりますよね?
  3. というのは冗談で • 世の中の問題にはしばしばn次元空間における直交領域 のクエリに帰着できるものが存在する • というわけでこれを高速に行いたい
  4. Simple is Best • 𝑑次元平面の𝑁点の中から与えられた直交領域内の点を 列挙したい(𝑑 ≪ 𝑁) • ケースによってはすべての点を列挙することになるので 最悪𝑂(𝑁) • すべての点について領域内か判定すれば𝑂(𝑁) • よって愚直解が最適
  5. Simple is Best • 𝑑次元平面の𝑁点の中から与えられた直交領域内の点を 列挙したい(𝑑 ≪ 𝑁) • ケースによってはすべての点を列挙することになるので 最悪𝑂(𝑁) • すべての点について領域内か判定すれば𝑂(𝑁) • よって愚直解が最適 • 優勝
  6. ご清聴ありがとうございました
  7. というのは冗談で • お分かりのとおり、すべての点の数Nだけでなく領域内 の点の数𝐾で評価すべき • 出力サイズに敏感(𝑂𝑢𝑡𝑝𝑢𝑡 − 𝑠𝑒𝑛𝑠𝑖𝑡𝑖𝑣𝑒)というらしい • これらのクエリにある程度高速に答えられるデータ構造 を紹介します
  8. とりあえず1次元で • これは点の座標を葉に持つような二分探索木を構築すれ ば簡単に答えられる • 二分探索木として平衡二分木を用い、二分木の全頂点で 座標を管理してもできる
  9. こんな感じ 3 19 30 49 59 70 89 100
  10. こんな感じ 49 19 59 3 30 59 89 3 19 30 49 59 70 89 100 3 19 30 49 59 70 89 100
  11. こんな感じ 49 19 59 3 30 59 89 3 19 30 49 59 70 89 100 3 19 30 49 59 70 89 100 葉が各値に対応している
  12. クエリがきたら • クエリに答える際は、𝑠𝑒𝑔𝑚𝑒𝑛𝑡 𝑡𝑟𝑒𝑒の時とほぼ同様にし て答えられる
  13. こんな感じ 49 19 59 3 30 59 89 3 19 30 49 59 70 89 100 クエリ [20,60] 見ている区間 [-∞、∞]
  14. こんな感じ 49 19 59 3 30 59 89 3 19 30 49 59 70 89 100 クエリ [20,60] 見ている区間 [-∞、∞]
  15. こんな感じ 49 19 59 3 30 59 89 3 19 30 49 59 70 89 100 クエリ [20,60] 見ている区間 [-∞、49]
  16. こんな感じ 49 19 59 3 30 59 89 3 19 30 49 59 70 89 100 クエリ [20,60] 見ている区間 [-∞、49]
  17. こんな感じ 49 19 59 3 30 59 89 3 19 30 49 59 70 89 100 クエリ [20,60] 見ている区間 [-∞、19]
  18. こんな感じ 49 19 59 3 30 59 89 3 19 30 49 59 70 89 100 クエリ [20,60] 見ている区間 [-∞、19]←重なりがない→
  19. こんな感じ 49 19 59 3 30 59 89 3 19 30 49 59 70 89 100 クエリ [20,60] 見ている区間 (19,49]完全に含まれている→
  20. こんな感じ 49 19 59 3 30 59 89 3 19 30 49 59 70 89 100 クエリ [20,60] 見ている区間 (19,49]
  21. こんな感じ 49 19 59 3 30 59 89 3 19 30 49 59 70 89 100 クエリ [20,60] 見ている区間 (49,∞]
  22. こんな感じ 49 19 59 3 30 59 89 3 19 30 49 59 70 89 100 クエリ [20,60] 見ている区間 [-∞、49] 残りも同様にして
  23. こんな感じ 49 19 59 3 30 59 89 3 19 30 49 59 70 89 100 クエリ [20,60] 見ている区間 [-∞、49] 残りも同様にして 求まった
  24. 計算量 • 構築 に • 空間計算量 𝑂(𝑁) • 時間計算量 𝑂(𝑁𝑙𝑜𝑔𝑁) • クエリ毎に • 𝑂 𝑙𝑜𝑔𝑁 + 𝐾 • (𝐾は答える点の数)
  25. kD-Tree • 2次元以上でも、同様に点を二分探索木で管理してクエ リに答えたい。 • ではどうするか?
  26. kD-Tree • 2次元以上でも、同様に点を二分探索木で管理してクエ リに答えたい。 • ではどうするか? • 奇数回目はx座標で、偶数回目はy座標で、分割する
  27. kD-Tree
  28. kD-Tree 𝑙1
  29. kD-Tree 𝑙1 𝑙2
  30. kD-Tree 𝑙1 𝑙2 𝑙3
  31. kD-Tree 𝑙1 𝑙2 𝑙3 𝑙5 𝑙6 𝑙4 𝑙9 𝑙7 𝑙8
  32. kD-Tree 𝑙1 𝑙2 𝑙3 𝑙4 𝑙5 𝑙7 𝑙8 𝑙6 𝑙9
  33. クエリがきたら • 1次元の場合とほぼ同様にできる。
  34. kD-Treeの計算量 • 2次元の場合 • 構成に • 空間計算量𝑂(𝑁) • 時間計算量𝑂(𝑁𝑙𝑜𝑔𝑁) • クエリ毎に • 𝑂( 𝑁 + 𝐾)
  35. kD-Treeの計算量 • 一般に𝑑次元の場合(𝑑 ≥ 2) • 構成に • 空間計算量𝑂(𝑁) • 時間計算量𝑂(𝑁𝑙𝑜𝑔𝑁) • クエリ毎に • 𝑂(𝑁1− 1 𝑑 + 𝐾)
  36. 領域木(Range Tree) • まずx座標だけに着目して二分探索木で点を持つ • 今回はkD木の時とは異なり葉だけが点の座標を管理して いるわけではない • そして、各頂点に対応するx座標を持った点達のy座標を 管理する二分探索木を頂点が持っている
  37. こんな感じ
  38. イメージ図
  39. 計算量 • x座標を管理する二分探索木を走査するのに𝑂(𝑙𝑜𝑔𝑁) • 走査した各頂点からy座標を管理している二分探索木を 走査するのに𝑂(𝑙𝑜𝑔𝑁) • あわせて𝑂(𝑙𝑜𝑔2 𝑁 + 𝐾)
  40. 計算量 • x座標を管理する二分探索木を走査するのに𝑂(𝑙𝑜𝑔𝑁) • 走査した各頂点からy座標を管理している二分探索木を 走査するのに𝑂(𝑙𝑜𝑔𝑁) • あわせて𝑂(𝑙𝑜𝑔2 𝑁 + 𝐾) • よさみが深い
  41. 計算量 • x座標を管理する二分探索木を走査するのに𝑂(𝑙𝑜𝑔𝑁) • 走査した各頂点からy座標を管理している二分探索木を 走査するのに𝑂(𝑙𝑜𝑔𝑁) • あわせて𝑂(𝑙𝑜𝑔2 𝑁 + 𝐾) • よさみが深い • が、まだ早くできる
  42. ~断片的直列接続法~ フラクショナルカスケーディング
  43. RangeTreeのムダ • 𝑂(𝑙𝑜𝑔𝑁)個の二分探索木に対する探索の範囲はすべて同 じ • うまいことやればいい感じにできそう
  44. Fractional cascading 3 19 30 49 59 70 89 100 ↑点たちをy座標でソート(枠内はy座標の値)
  45. Fractional cascading 3 19 30 49 59 70 89 100 3 49 59 89 19 30 70 100 x座標が中央値以下のものとそれ以外のものに分ける
  46. Fractional cascading 3 19 30 49 59 70 89 100 3 49 59 89 19 30 70 100 残りも同様に 3 59 49 89 19 100 30 70
  47. Fractional cascading 3 19 30 49 59 70 89 100 3 49 59 89 19 30 70 100 3 59 49 89 19 100 30 70 3 59 49 89 19 100 30 70
  48. 3 19 30 49 59 70 89 100 3 49 59 89 19 30 70 100 3 59 49 89 19 100 30 70 3 59 49 89 19 100 30 70 x座標の区間に対応する数列たち(例えば図の赤い部分)か ら同じy座標の区間に入る数たちを探す
  49. Fractional cascading 3 19 30 49 59 70 89 100 3 49 59 89 19 30 70 100 3 59 49 89 19 100 30 70 3 59 49 89 19 100 30 70
  50. Fractional cascading • あとは昨日のcatupperさんの講義で言っていたのと同 じ要領で、始めの1つだけ二分探索をしてあとはリンク をたどっていけばよい • 今回は特殊ケースで、元から1つ前の数列の半分が入っ ているので扱う数の範囲に偏りがある心配はない
  51. 計算量 • 始めの二分探索に𝑂(𝑙𝑜𝑔𝑁) • リンクをたどるのに𝑂(𝑙𝑜𝑔𝑁) • あわせて𝑂(𝑙𝑜𝑔𝑁 + 𝐾)
  52. 計算量 • 始めの二分探索に𝑂(𝑙𝑜𝑔𝑁) • リンクをたどるのに𝑂(𝑙𝑜𝑔𝑁) • あわせて𝑂(𝑙𝑜𝑔𝑁 + 𝐾) • ありえんよさみが深い
  53. 競プロの問題を解きたい • せっかくやし競プロの問題といてAcceptedの文字が見 たい • AOJのDSLくらいしかない…
  54. 使う問題あるよ!
  55. Codeforces Round #118 Div1 E Soap Time! – 2 • 問題概要 • 座標平面上のN点に人がおり、どこか一点に集まりたい。 • 人は1単位時間ごとに上下左右に1進むことができる • 座標平面上のK点に駅があり、これらの任意の2点間は相 互に瞬間移動可能である • 全員が1点に集まるのにかかる時間の最小値を求めよ
  56. ごめんなさい • 今回は時間がたりなかったため通すのを断念しました • また時間があるときに解こうと思います
  57. ご清聴ありがとうございました
Advertisement