LoginSignup
5
2

More than 1 year has passed since last update.

【Python】フラクショナルカスケーディング実装

Last updated at Posted at 2019-02-08

概要

フラクショナルカスケーディングは2次元領域において, 層状領域木を用いて指定した長方形領域に含まれる点を高速に探索する技術です。問い合わせ時間は$O(\log n + k)$, $n$はデータ点数, $k$は報告される点の個数です[1]。

frac.png

フラクショナルカスケーディングについて, 詳しくは[1], もしくは fractional cascadingを参考にしてください。

スクリーンショット 2019-04-04 19.46.11.png

ネットでもあまり, 実装例を見かけないので
このフラクショナルカスケーディングをPythonで実装しました。

コード

開発環境: macOS Mojave(10.14.2), Python(>=3.7)
実装参考: [1]
https://gist.github.com/cf012cbc3caca173d2b9d2a89977f3bf

使い方

from fractional_cascading import Tree, Point, Rectangle

層状領域木の作成

# データ準備
points = list()
points.append(Point(name='A', loc=(1, 5))) # loc(x座標, y座標)
points.append(Point(name='B', loc=(2, 2)))
points.append(Point(name='C', loc=(4, 8)))
points.append(Point(name='D', loc=(5, 7)))
points.append(Point(name='E', loc=(5, 5)))
points.append(Point(name='F', loc=(8, 6)))
points.append(Point(name='E', loc=(7, 1)))

output_2_1.png

# 木のインスタンスの作成
tree = Tree(sample_data)

frac_tree.png

# treeをpickleで保存
# tree.dump_pickle(pickle_file='sample.pickle')
# treeをpickleから読み込み
# tree = Tree(pickle_file='sample.pickle')

長方形領域探索

# 探索領域を指定
R = Rectangle(x_min=1.5, x_max=5.5,
              y_min=1.5, y_max=5.5)

output_5_1.png

# フラクショナルカスケーディングを実行 / 結果の出力
for elm in tree.query(R):
    print(elm)
>> name: B, loc: (2, 2)
>> name: E, loc: (5, 5)

参考

[1] De Berg, Mark, et al. "コンピュータ・ジオメトリ 計算幾何学: アルゴリズムと応用." (2000) 第5章
[2] https://www.slideshare.net/secret/48dF2L2saJOz2e
コード: https://gist.github.com/cf012cbc3caca173d2b9d2a89977f3bf

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2