大数据集的优秀算法方法
将棱柱存储在R-Tree中。对于矩形轴向棱柱,搜索和插入应按顺序进行log(n)
。
有一些Python包可用于R-Trees。使用Rtree 0.6.0,您的代码将非常简单:
>>> from rtree import Rtree
>>> idx = Rtree()
>>> minx, miny, maxx, maxy = (0.0, 0.0, 1.0, 1.0)
>>> idx.add(0, (minx, miny, maxx, maxy))
>>> list(idx.intersection((1.0, 1.0, 2.0, 2.0)))
[0L]
>>> list(idx.intersection((1.0000001, 1.0000001, 2.0, 2.0)))
[]
实用且快速的方法
将数据存储在一个sqlite
数据库中,可以使用非常少的代码行在文件或内存中创建它(有许多Java实现)。创建一个名为prisms
的表,其列应为id
、min_x
、min_y
、min_z
、max_x
、max_y
和max_z
。索引每一行。
插入的时间复杂度为O(1)
,检查交集遵循Magnus Skog的方法,给定new_min_x, new_min_y, new_min_z, new_max_x, new_max_y, new_max_z
:
SELECT COUNT(*) FROM prisms
WHERE (new_min_x BETWEEN min_x and max_x OR new_max_x BETWEEN min_x and max_x)
AND (new_min_y BETWEEN min_y and max_y OR new_max_y BETWEEN min_y and max_y)
AND (new_min_z BETWEEN min_z and max_z OR new_max_z BETWEEN min_z and max_z)