Алгоритм Балабана — различия между версиями
(→Введение) |
|||
| Строка 1: | Строка 1: | ||
| + | {| class="wikitable" align="center" style="color: red; background-color: black; font-size: 56px; width: 800px;" | ||
| + | |+ | ||
| + | |-align="center" | ||
| + | |'''НЕТ ВОЙНЕ''' | ||
| + | |-style="font-size: 16px;" | ||
| + | | | ||
| + | 24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян. | ||
| + | |||
| + | Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием. | ||
| + | |||
| + | Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей. | ||
| + | |||
| + | Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить. | ||
| + | |||
| + | ''Антивоенный комитет России'' | ||
| + | |-style="font-size: 16px;" | ||
| + | |Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению. | ||
| + | |-style="font-size: 16px;" | ||
| + | |[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки]. | ||
| + | |} | ||
| + | |||
{{В разработке}} | {{В разработке}} | ||
Версия 09:35, 1 сентября 2022
| НЕТ ВОЙНЕ |
|
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян. Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием. Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей. Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить. Антивоенный комитет России |
| Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению. |
| meduza.io, Популярная политика, Новая газета, zona.media, Майкл Наки. |
Алгоритм Балабана — детерминированный алгоритм, позволяющий по множеству отрезков на плоскости получить множество точек, в которых эти отрезки пересекаются.
Содержание
Введение
Решение задачи по поиску множества пересечений отрезков является одной из главных задач вычислительной геометрии. Рассмотрим несколько самых распространенных алгоритмов:
- Тривиальный детерминированный алгоритм имеет временную сложность , и его суть заключается в проверке попарного пересечения отрезков.
- Сложнее, но эффективнее алгоритм Бентли-Оттмана [1] с оценкой сложности , в основе которого лежит метод заметающей прямой.
- Алгоритм, предложенный Чазелле и Едельсбруннером [2], имеет лучшую оценку , но в отличие от предыдущих методов требует квадратичной памяти.
- Оптимальный детерминированный алгоритм был предложен Балабаном [3] с временной оценкой сложности и памяти, где К - число пересекающихся отрезков.
При количестве отрезков от 2000, и большому количеству пересечений целесообразно использовать алгоритм Балабана. Однако в результате громоздкости и высокой сложности реализации алгоритма, в большинстве практических задач используется алгоритм заметающей прямой Бентли-Оттмана.
Основные понятия
Введем некоторые обозначения. Пусть - множество всех точек пересечения отрезков из множества , а - количество таких пересечений ;
Через обозначим вертикальную полосу, которая ограничена прямыми и , а через — отрезок с вершинами в точках с абсциссами и .
Рассмотрим взаимное расположение вертикальной полосы и отрезка .
| Определение: |
| Будем говорить, что отрезок , с вершинами в точках с абсциссами и :
— охватывает (span) полосу , если ; — внутренний (inner) для полосы , если ; |
| Определение: |
| Два отрезка и называются пересекающимися внутри полосы , если их точка пересечения лежит в пределах этой полосы. Для двух множеств отрезков и определим множество как . |
Обозначения и будут использоваться для описания подмножеств и , состоящих из пересекающихся пар отрезков в пределах полосы .
Далее фигурные скобки используются для определения неупорядоченных множеств, а круглые скобки используются для определения упорядоченных множеств.
и точка пересечения этой прямой с отрезком лежит ниже точки пересечения с .
— любой отрезок из охватывает полосу ;
— нет пересечений отрезков внутри лестницы;
— упорядочена по отношению .
| Определение: |
| Будем называть лестницу полной относительно множества отрезков , если каждый отрезок из либо не охватывает полосу , либо пересекает хотя бы одну из ступенек из множества . |
| Лемма: |
Пусть лестница полна относительно множества отрезков , где состоит из отрезков, пересекающих полосу , тогда , где это число вершин отрезков из , находящихся в пределах полосы . |
| Определение: |
| Если точка отрезка лежит между ступеньками и , тогда число называется местоположением на лестнице и обозначается как |
| Утверждение: |
Имея лестницу и множество отрезков , множество можно найти за время . Однако, если упорядочено отношением , где , тогда можно найти за время . |
Алгоритм
Введем несколько дополнительных функций, чтобы упростить основной алгоритм:
Split
Функция разделяет входное множество отрезков , охватывающих некоторую полосу , на подмножества и так, что лестница полна относительно множества отрезков .
Пусть , где for do if отрезок не пересекает последний отрезок из внутри полосы и при этом охватывает её then добавить в конец else добавить в конец
Эта функция работает за времени.
Search In Strip
Зная мы можем найти и используя следующую рекурсивную функцию:
if then return Найдем
Здесь, это функция объединения множеств и , упорядоченных по отношению . Время выполнения эквивалентно сумме времён каждого её запуска. Очевидно, что время работы -той функции, будет равно , где это соответствующие наборы .
Учитывая лемму, заключаем, что функция работает за .
Предположим, что все отрезки лежат в полосе . Таким образом в самом начале у нас есть пара . Что же дальше происходит: множество распадается в подмножества и , после чего лестница становится полной относительно множества . Необходимо найти пересечения отрезков из и , затем, все пересечения в . Чтобы найти пересечения отрезков в , мы режем полосу и множество по вертикале на полосы , и множества , соответственно, где является медианой вершин отрезков между и . Затем мы рекурсивно вызываем функцию к парам и . Ключевым является тот факт, что согласно лемме , таким образом, число дополнительных отрезков, появляющихся после разрезаний пропорционально числу найденных пересечений.
Ключевые моменты
Давайте разберемся с алгоритмом более подробно:
Не умаляя общности, предположим, что все пересечения и вершины отрезков имеют разные абсциссы (в конечном счете, их можно будет отсортировать введением дополнительных свойств). Будем рассматривать целые координаты на промежутке . Обозначим через слева направо конец отрезка множества , а через отрезок, которому он принадлежит соответственно.
Основная задача нашего алгоритма, это рекурсивная функция . Соединим каждый вызов функции с узлом некоего двоичного дерева (далее рекурсивное дерево). Соответствующим узлом отметим все значения, множества и параметры вызова. Обозначим множество внутренних вершин за .
Отсортируем вершин по координатам и найдем ;
if then отсортируем по отношению ; ; return; Разделим на и так, что лестница будет полной, относительно множества ; Найдем ; ; Разделим отрезки из на пересекающих полосу и полосу ; ; ;
Отсюда и дальше , и означают, соответственно, левого сына, правого сына, и отцовскую вершину узла . Наша задача показать, что все операции с узлом происходят за , для этого возьмем во внимание, что (очевидно, что ).
Функция похожа на функцию . Основная разница заключается в том, что вызывает себя без изменения полосы, когда делит полосу на две части, после чего рекурсивно вызывает себя для них. Другое отличие заключается в том, что множество не упорядочено так же, как . В результате мы не можем напрямую использовать функцию для эффективного деления .
Чтобы решить эту проблему, представим как объединение трех множеств: множества упорядоченного по отношению , неупорядоченного множества , и множества упорядоченного по отношению . Расположим отрезки из , пересекающие границу во множество , отрезки пересекающие во множество , и внутренние отрезки во множество (пример на рисунке справа).
Теперь мы можем вызвать функцию для множества и построить за времени. Но мы натыкаемся на новую проблему: передавая множества , и , необходимо найти соответствующие множества сыновей узла .
Неупорядоченные множества и строятся легко. Множество будет найдено вызовом функции для нахождения в функции . Множество получается из за линейное время вставкой (если левая вершина отрезка) или удалением (если правая вершина отрезка) отрезка . Но как получить из , и без сортировки?
Для листьев мы сделаем проверку вначале, и получим из . Пусть и известны, и все сыновья узла - листья. Для начала запустим функцию и найдем и . Теперь мы должны найти , но мы не знаем и, соответственно, можем найти только . Применим к множеству и получим . Множество получается из вставкой или удалением отрезка . Применим к и найдем . Теперь можем продолжить вычисление и получим слиянием и .
Конечная функция будет выглядеть так:
Отсортируем концов отрезков по абсциссе и найдем , где ; ; ; ;
if then ; return; ; ; Найдем ; ; Разделяем отрезки из внутренние для полосы во множество внутренние для полосы во множество ; if левый конец отрезка then вставить в else удалить из ; Найдем ; for do Найдем используя двоичный поиск; Найдем используя значения, полученные шагом выше; ;
Заметим, что нахождение надо делать аккуратно, так как множества и могут иметь одни и те же отрезки (которые пересекают ). Мы нашли их пересечения с при поиске , и не должны вывести эти пересечения снова.
Время работы
Для начала рассчитаем место, необходимое для выполнения алгоритма. Алгоритм использует рекурсивную функцию . Последовательность вызовов функции может занять память. Эта последовательность может быть представлена как путь корня рекурсивного дерева, до узла. Соответствующий вызов этого узла занимает памяти, каждый его "предок" занимает памяти, а остальные структуры используют . Очевидно, что любой путь от корня рекурсивного дерева до какого-то узла .
В итоге для работы алгоритма требуется памяти.
| Лемма (#2): |
. |
| Доказательство: |
| Утверждение напрямую вытекает из первой леммы и очевидного факта, что для любого множества , количество концов отрезков, лежащих в полосе , меньше чем . |
| Теорема (#1): |
| Доказательство: |
| Утверждение напрямую вытекает из леммы №2 и следующего отношения . |
Обозначим множество всех вершин рекурсивного дерева за .
| Теорема (#2): |
| Доказательство: |
| Для всех узлов, кроме корня имеет место выражение , следовательно . |
Начальная сортировка и инициализация множеств и может быть произведена за времени. Время работы функции является суммой длительностей всех его вызовов. Каждый вызов от внешних узлов добавляет к этой сумме . Для внутренних же узлов, время требуемое для поиска равно , а для остальных . Если мы все это сложим, то придем к выводу, что наш алгоритм работает за . Заметим, что его скорость можно увеличить до , если не будем учитывать время нахождения .
Соответственно в оптимальном алгоритме Балабана находится за .
Примечания
Литература
Т.Вознюк, В.Терещенко — К построению эффективного решения задачи пересечения отрезков
Ф.Препарата, М.Шеймос — Вычислительная геометрия