Хороший алгоритмический подход для больших наборов данных
Храните свои призмы в 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)
, и проверка на пересечение следует Подход Магнуса Скога , учитывая 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)