Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
分割木
~明日から使えないオーダーがやばそうな木~
劉 鴻志@hogloid
問題概要
 2次元平面上にN点があります
 直線で区切られた半平面内にある、点の数を数え
たい
 点は固定されていて、直線は色々なものが来る
(クエリーみたいに)
 クエリー毎にO(N)より早く!!
 半平面ができれば、同じように三角...
どうしよう??
 簡単のためN=m^4とします
 2次元の領域を扱うとき、分割統治を使うことが多
い
 これも分割統治でできるのでは??
 唐突ですが、N点を交わらない2直線で4つの領域に
分け、それぞれの4つの領域にN/4点が属するよ...
例
何がうれC?
 半平面を区切る直線が、それぞれの4つに分割され
た領域をすべて含むならその領域の点の数を加算
すべて含まないなら無視
 交差しているなら、再帰的に計算
 毎回、交差する領域の数は4つ中3つ
 もっとも再帰が下ったとき、訪...
構築
 N点を2直線で4つの同じ数の点を含む領域に分けれ
ばよい
 N点をY座標順でソートし、0-originでN/2番目のY座
標でX軸と並行の線を一つ引いてみる
 紫を青にして水色にして・・・こうじゃ!
 上の領域で、N/4番目の点のY座標で線を引く
 上の領域で、片方の領域がN/4個の状態が維持されるよ
うに、少しずつ回転
構築
 1回上の領域から出ていく点はもう入ってこないし、左
下の領域には点が入っていくだけ
 毎回、次の点を探すのにO(N)かかるので、合計O(N^2)
 N頂点ある時にかかる計算量をc2(N)とおくと、
c2(N)=O(N^2)+4*c...
ベンチマーク
 N=4096(=4^6)、クエリーを10000回投げてみる
 O(N)愚直解は約2秒、今回の方法は約6秒
 毎回交点計算などするし、しょうがないね
おまけ
 O(N^2)の構築でやったことより、X軸に平行に一つ同じ
ように直線を引いても、2本目は上側/下側の両方の点を
通るものが必ずある(直線上のものは、どちらに属する
としても構わない)
 下側の通る点pを固定し、上側の点をpから見た...
おまけ2
 情オリ夏セミisGOD(日並感)
 気づいたら3年間連続で出ていました 最高の夏に
出来ました、今まで本当に楽しかったです!!!
 来年はチューターとして参加できるとうれしいナ
~~
 受験こわい><><><><><><><...
分割木
Upcoming SlideShare
Loading in …5
×

分割木

夏セミスライドです。少しだけ間違っているところがあります

  • Login to see the comments

分割木

  1. 1. 分割木 ~明日から使えないオーダーがやばそうな木~ 劉 鴻志@hogloid
  2. 2. 問題概要  2次元平面上にN点があります  直線で区切られた半平面内にある、点の数を数え たい  点は固定されていて、直線は色々なものが来る (クエリーみたいに)  クエリー毎にO(N)より早く!!  半平面ができれば、同じように三角形ができて、 三角形ができれば多角形もできて変なのも大体近 似できます
  3. 3. どうしよう??  簡単のためN=m^4とします  2次元の領域を扱うとき、分割統治を使うことが多 い  これも分割統治でできるのでは??  唐突ですが、N点を交わらない2直線で4つの領域に 分け、それぞれの4つの領域にN/4点が属するよう にしてみましょう  この分割を、一つの領域が一つの点を持つように なるまで繰り返します
  4. 4.
  5. 5. 何がうれC?  半平面を区切る直線が、それぞれの4つに分割され た領域をすべて含むならその領域の点の数を加算 すべて含まないなら無視  交差しているなら、再帰的に計算  毎回、交差する領域の数は4つ中3つ  もっとも再帰が下ったとき、訪れる葉っぱの数は 3^m  これがボトルネックなので、O(3^m)=O(3^(log_4 n))=O(n^(log_4 3))≒O(n^0.7925)
  6. 6. 構築  N点を2直線で4つの同じ数の点を含む領域に分けれ ばよい  N点をY座標順でソートし、0-originでN/2番目のY座 標でX軸と並行の線を一つ引いてみる
  7. 7.  紫を青にして水色にして・・・こうじゃ!  上の領域で、N/4番目の点のY座標で線を引く  上の領域で、片方の領域がN/4個の状態が維持されるよ うに、少しずつ回転
  8. 8. 構築  1回上の領域から出ていく点はもう入ってこないし、左 下の領域には点が入っていくだけ  毎回、次の点を探すのにO(N)かかるので、合計O(N^2)  N頂点ある時にかかる計算量をc2(N)とおくと、 c2(N)=O(N^2)+4*c2(N/4)  再帰が下るたびに、計算量は4/(4*4)=1/4倍になるので、 O(N^2)+O(N^2)/4+O(N^2)/16…  これより、O(N^2)  (空間計算量は、葉っぱノード以外点の場所を陽に持つ 必要がないので、O(N))
  9. 9. ベンチマーク  N=4096(=4^6)、クエリーを10000回投げてみる  O(N)愚直解は約2秒、今回の方法は約6秒  毎回交点計算などするし、しょうがないね
  10. 10. おまけ  O(N^2)の構築でやったことより、X軸に平行に一つ同じ ように直線を引いても、2本目は上側/下側の両方の点を 通るものが必ずある(直線上のものは、どちらに属する としても構わない)  下側の通る点pを固定し、上側の点をpから見た角度で ソートすると、2本目の直線は0-originでN/4-1 or N/4 番 目の点とpを結んだもの  これが下側の領域も二つに分けているか確認すればよい  これでO(N^2logN)
  11. 11. おまけ2  情オリ夏セミisGOD(日並感)  気づいたら3年間連続で出ていました 最高の夏に 出来ました、今まで本当に楽しかったです!!!  来年はチューターとして参加できるとうれしいナ ~~  受験こわい><><><><><><><><> <  キルミーベイベーとても面白い

×