Покрытие прямоугольника Sweep Line


9

Мне дали упражнение, к сожалению, я сам не справился.

Существует множество прямоугольников и прямоугольник R 0 . Используя алгоритм подметания плоскости, определите, полностью ли покрыто R 0 набором R 1 . , R n .R1..RnR0R0R1..Rn

Более подробную информацию о принципе алгоритмов стреловидной линии смотрите здесь .

Начнем с самого начала. Изначально мы знаем алгоритм строчной линии как алгоритм для поиска пересечений отрезков, который требует двух структур данных:

  • набор точек событий (он хранит конечные точки сегментов и точек пересечений)Q
  • состояние (динамическая структура для множества сегментов, пересекающих линию развертки)T

Общая идея: предположим, что линия развертки - это вертикальная линия, которая начинает приближаться к набору прямоугольников слева. Сортируйте все координаты x прямоугольников и сохраняйте их в Q в возрастающем порядке - нужно взять O ( n log n ) . Начните с первой точки события, для каждой точки определите набор прямоугольников, которые пересекаются с заданной координатой x , идентифицируйте непрерывные сегменты прямоугольников пересечения и проверьте, полностью ли они покрывают R 0 в текущей координате x . С T в качестве двоичного дерева это займет O ( журналlxQO(nlogn)xR0xT . Если какая-либо часть R 0 остается открытой, то R 0 не полностью покрыта.O(logn)R0R0

Детали: Идея алгоритма пересечения сегментов заключалась в том, что пересекаются только смежные сегменты. Основываясь на этом факте, мы создали статус и поддерживали его в течение всего алгоритма. Я попытался найти аналогичную идею в этом случае, и пока безуспешно, единственное, что я могу сказать, это то, что два прямоугольника пересекаются, если их соответствующие координаты x и y перекрываются.Txy

TT

T


1
Это выровненные по оси прямоугольники или нет? (Вы можете сделать это в любом случае, но это легче, если они есть.)
Луи,

@ Луис, давайте немного упростим это, давайте предположим, что есть прямоугольники, выровненные по оси, но, конечно, общий случай более интересен
ком

Какие точки прямоугольника являются точками событий? Все углы, левый верхний ...?
Рафаэль

@Raphael, только x - это точки события
ком

Ответы:


6

nRii1

  • RiRi
  • RiRi

O(logn)

R0R0O(nlogn)O(n)

В общем случае очевидный трюк не такой быстрый. Используйте стандартный алгоритм линии развертки, чтобы вычислить все плоское подразделение, индуцированное прямоугольниками.

FR0R0O(1)O(n2logn)Ω(n2) по размеру, поэтому мы используем столько места в худшем случае, поэтому время является «экзистенциально оптимальным», но не «чувствительным к выходу».

R0FRifRiffRiffRi

O(nlogn)O(n2logn)


QxTxiRRi,i1R0R0

RiRi
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.