Покриття прямокутника по лінії зачистки


9

Мені дають вправу, на жаль, я сам не досяг успіху.

Існує набір прямокутників і прямокутник . Використовуючи алгоритм підмітання площини, визначте, чи повністю покритий набором .R1..RnR0R0R1..Rn

Більш детально про принцип алгоритмів розгортки ліній див. Тут .

Почнемо з початку. Спочатку ми знаємо алгоритм розгортки ліній як алгоритм пошуку перетину відрізків ліній, який вимагає двох структур даних:

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

Загальна ідея: припустимо, що лінія розгортки - це вертикальна лінія, яка починає наближатися до набору прямокутників зліва. Сортуйте всі координати прямокутників і зберігайте їх у у збільшенні - слід приймати . Почніть з першої точки події, для кожної точки визначте набір прямокутників, які перетинаються за заданою координатою, визначте безперервні відрізки прямокутників перетину та перевірте, чи повністю вони покривають у поточній координаті . Якщо як двійкове дерево, воно прийме . Якщо будь-яка частина залишається непокритою, цеlxQO(nlogn)xR0xTO(logn)R0R0 не повністю охоплений.

Деталі: Ідея алгоритму перетину сегментів полягала в тому, що перетинаються лише суміжні сегменти. На основі цього факту ми побудували статус і підтримували його протягом усього алгоритму. Я намагався знайти подібну ідею в цьому випадку, і поки що не мав успіху, єдине, що можу сказати, - це два прямокутники, що перетинаються, якщо їх відповідні координати та перетинаються.Txy

Проблема полягає в тому, як будувати і підтримувати , і то , що складність створення і підтримки є. Я припускаю, що R дерева можуть бути дуже корисними в цьому випадку, але, як я виявив, дуже важко визначити мінімальний обмежуючий прямокутник за допомогою R дерев.TT

Чи маєте ви якесь уявлення про те, як вирішити цю проблему, зокрема, як побудувати ?T


1
Ці прямокутні прямокутники - це чи ні? (Ви можете це зробити будь-яким способом, але простіше, якщо вони є.)
Луї,

@Louis, давайте трохи спростимо це, припустимо, є прямокутники, що вирівнюються по осі, але, звичайно, цікавіший загальний випадок
com

Які точки прямокутника є подіями? Усі кути, верхній лівий ...?
Рафаель

@Raphael, тільки ікси є точками подій
кому

Відповіді:


6

Почнемо з nпрямокутники, вирівняні по осі, оскільки є своєрідний простий прямий аргумент. Ми підмітаємо вертикальну лінію. Події є кінцевими точками горизонтальних країв прямокутників. Під час підмітання ми підтримуємо набір інтервалів на лінії розгортки, які "розкриваються"Ri, i1:

  • Додайте вертикальний інтервал, охоплений прямокутником Ri до лінії розгортки, коли ми вперше стикаємося Ri
  • Видаліть вертикальний проміжок, охоплений прямокутником Ri від лінії розгортки, коли вона рухається повз Ri

Це легко зробити за допомогою бінарного дерева, щоб оновлення відбулися O(logn)час. (По суті, проблема є одновимірною. Ви з'ясовуєте, чи кінцеві точки знаходяться в непокритому інтервалі, і розширюєте / об'єднуєте належним чином, додаючи та подовжуючи їх при видаленні.)

Тоді ви просто перевіряєте це в проміжок часу R0, жоден із непокритих інтервалів ніколи не перетинає вертикальний проміжок R0. Вся справа в цьомуO(nlogn) час O(n) простір.

Для загального випадку очевидний трюк не настільки швидкий. Використовуйте стандартний алгоритм розгортки для обчислення всього плоского підрозділу, індукованого прямокутниками.

Ясно якийсь диск, як набір F лицьових кришок R0. Сам по собі це не говорить нам достатньо, оскільки те, що нас цікавить, чи є якесь із цих облич всерединіR0і поза іншими прямокутниками. Для цього ми трохи модифікуємо конструкцію, щоб, додаючи край, позначити одну сторону ідентичністю прямокутника, який знаходиться всередині. Це додаєO(1) накладні, тому будівництво є O(n2logn)час; без припущень щодо прямокутників, вихід може бутиΩ(n2) за розміром, тому ми використовуємо стільки місця в гіршому випадку, тому час є "екзистенційно оптимальним", хоча і не "чутливим до виходу".

Нарешті, R0 охоплюється до тих пір, поки жодне з облич F мають лише краї, не позначені як один із Ri. Справа в тому, що якщо крайf є в Ri, то весь fтак само. Уявіть, як підмітаєте рядокf ортогонально уздовж цього краю: він може лише вийти Ri або поза межами f або f обмежена більш ніж одним краєм Ri.

Тож висновок такий, що особлива справа O(nlogn) а загальне є O(n2logn) принаймні, але я підозрюю, що це можна покращити.


Дуже дякую за вашу відповідь. Є кілька речей, які я хочу прояснити у загальному випадку.Q - точки події є x узгоджена координата, T - статус - "непокриті" інтервали, наскільки я зрозумів, що це відповідник інтервалу xi одного з RЯкий не виявлений будь-яким іншим Ri,i1. Частина сR0Я не розумів. Я думаю, що на кожній ітерації (додаванні) ми повинні перевірити, чи перетинається інтервалR0, це право?
com

В цілому, я припускаю, що ви знаєте, як побудувати всю площинну карту, індуковану прямокутниками, і тоді я стверджую, що обличчя цього повністю Ri якщо один з його обмежуючих країв знаходиться на "внутрішній стороні" Ri. Ви можете відстежувати це за допомогою звичайних алгоритмів розгортки (наприклад, із книги "Позначки"), просто записуючи напрямки сегментів "всередині" та "зовні", коли вони додаються до рядка розгортки.
Луї
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.