У меня много кубоидов в трехмерном пространстве, у каждого есть начальная точка в (x, y, z) и размер (Lx, Ly, Lz). Интересно, как найти самый большой куб в этом трехмерном пространстве, который содержится в объединении кубоидов. Есть ли эффективный алгоритм для этого?
Например, если у меня есть следующие кубоиды:
- кубоид, начинающийся с (0,0,0) с размером (10,10,10),
- кубоид в (10,0,0) с размером (12,13,15),
- кубоид в (0,10,0) с размером (10,10,10),
- кубоид в (0,0,10) с размером (10,10,10), и
- кубоид в (10,10,10) с размером (9,9,9).
Тогда самый большой куб, содержащийся в объединении этих кубоидов, будет кубом, начинающимся с (0,0,0) с размером (19,19,19).
Более общая версия этого вопроса:
Учитывая набор из блоков в R d , найдите самый большой гиперкуб, содержащийся в объединении блоков.
ds.algorithms
cg.comp-geom
pantoffski
источник
источник
Ответы:
Ну, вот первый глупый ответ ... Возьмите самолет через каждую грань прямоугольных коробок. Это образует сетку размером . Нетрудно вычислить для каждой такой ячейки сетки, будь то внутри объединения или снаружи. Теперь, из каждой вершины сетки, вырастите куб (имеющий эту вершину как вершину), пытаясь сделать его максимально большим. Делать это в самом наивном смысле, это занимает OO ( n3) времени на вершину, но, вероятно, используя магию поиска с ортогональным диапазоном, нужно уметь делать это в log O ( 1 ) n на вершину. Итак, О ( п 3O ( n3журналн ) журналO ( 1 )N должно быть возможно ...O ( n3журналO ( 1 )н )
Вторая попытка: вычислить союз. В этом конкретном случае это можно сделать вO ( n logн ) времени (путем подметания плоскостей). Теперь обратите внимание, что вам просто нужно вычислить диаграмму вороной границы объединения. Используя результат: http://vw.stanford.edu/~vladlen/publications/vor-polyhedral.pdf , это можно сделать за время O ( n 2 + ε ) для произвольной малой постоянной ε > 0 .L∞ O ( n2 + ε) ε > 0
Нарушение ограниченного временем выполнения, было бы интересно, ИМХО.O ( n2)
источник
Казалось бы, ответ на общий вопрос о является NP-сложным. Доказательство довольно простое. Мы просто берем экземпляр 3SAT для d переменных и связываем каждую переменную с измерением. Думайте о пространстве как о пространстве возможных назначений переменных: мы рассматриваем только точки между -1 и +1 в каждом димеснионе и связываем местоположения < 0 с назначением 0 для этой переменной и > 0 с назначением 1. Каждый пункт исключает область, заданную 1 × 1 × 1 × n × n × n . , , × nрd d < 0 > 0 1 × 1 × 1 × n × n × n . , , × n hypercuboid.
Если объединение этих кубоидов заполняет пространство (и так содержит куб), то не существует удовлетворяющего присвоение переменных для экземпляра 3sat. Если, однако, самый большой куб содержал 1 × 1 × . , , × 1 или 0 (без предложений), существуют только другие возможности, а затем удовлетворительное присваивание переменных.2 × 2 × . , , × 2 1 × 1 × . , , × 1
источник