Алгоритм Балабана — различия между версиями
Строка 13: | Строка 13: | ||
Введем некоторые обозначения. Пусть <tex>Int(S)</tex> - множество всех точек пересечения отрезков из множества <tex>S</tex>, а <tex>K = |Int(S)|</tex> - количество таких пересечений ;<br> | Введем некоторые обозначения. Пусть <tex>Int(S)</tex> - множество всех точек пересечения отрезков из множества <tex>S</tex>, а <tex>K = |Int(S)|</tex> - количество таких пересечений ;<br> | ||
− | Через <tex>\langle a, b \rangle</tex> обозначим вертикальную полосу, которая ограничена прямыми <tex>x = a</tex> и <tex>x = b</tex>, а через <tex>s</tex> отрезок с | + | Через <tex>\langle a, b \rangle</tex> обозначим вертикальную полосу, которая ограничена прямыми <tex>x = a</tex> и <tex>x = b</tex>, а через <tex>s</tex> {{---}} отрезок с вершинами в точках с абсциссами <tex>l</tex> и <tex>r</tex>.<br> |
Рассмотрим взаимное расположение вертикальной полосы <tex>\langle a, b \rangle</tex> и отрезка <tex>s</tex>. | Рассмотрим взаимное расположение вертикальной полосы <tex>\langle a, b \rangle</tex> и отрезка <tex>s</tex>. | ||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
− | Будем говорить, что отрезок <tex>s</tex>, с | + | Будем говорить, что отрезок <tex>s</tex>, с вершинами в точках с абсциссами <tex>l</tex> и <tex>r</tex> : |
- '''содержит'''(span) полосу <tex>\langle a, b \rangle</tex>, если <tex>l \le a \le b \le r</tex>; <br> | - '''содержит'''(span) полосу <tex>\langle a, b \rangle</tex>, если <tex>l \le a \le b \le r</tex>; <br> | ||
- '''внутренний'''(inner) для полосы <tex>\langle a, b \rangle</tex>, если <tex>a < l < r < b</tex>; <br> | - '''внутренний'''(inner) для полосы <tex>\langle a, b \rangle</tex>, если <tex>a < l < r < b</tex>; <br> | ||
Строка 57: | Строка 57: | ||
|statement= | |statement= | ||
Если лестница <tex>D</tex> полностью соотносима множеству отрезков <tex>S</tex>, где <tex>S</tex> состоит из отрезков, пересекающих полосу <tex>\langle a, b \rangle</tex>, тогда <tex>|S| \le Ends_{a, b}(S) + |Int(D, S)|</tex>,<br> | Если лестница <tex>D</tex> полностью соотносима множеству отрезков <tex>S</tex>, где <tex>S</tex> состоит из отрезков, пересекающих полосу <tex>\langle a, b \rangle</tex>, тогда <tex>|S| \le Ends_{a, b}(S) + |Int(D, S)|</tex>,<br> | ||
− | где <tex>Ends_{a, b}(S)</tex> это число | + | где <tex>Ends_{a, b}(S)</tex> это число вершин отрезков <tex>S</tex>, находящихся в пределах полосы <tex>\langle a, b \rangle</tex>. |
}} | }} | ||
Строка 113: | Строка 113: | ||
Учитывая [[#lemma1|лемму]], заключаем, что функция <tex>SearchInStrip_{a, b}(L, R)</tex> работает за <tex>O(|L| + |Int_{a, b}(L)|)</tex>. | Учитывая [[#lemma1|лемму]], заключаем, что функция <tex>SearchInStrip_{a, b}(L, R)</tex> работает за <tex>O(|L| + |Int_{a, b}(L)|)</tex>. | ||
+ | Предположим, что все отрезки лежат в полосе <tex>\langle a, b \rangle</tex>. Таким образом в самом начале у нас есть пара <tex>(S, \langle a, b, \rangle)</tex>. | ||
+ | Что же дальше происходит: множество <tex>S</tex> ''распадается'' в подмножества <tex>Q</tex> и <tex>S'</tex>, после чего лестница <tex>D = (Q, \langle a, b \rangle)</tex> становится полностью соотносимой множеству <tex>S'</tex>. Необходимо найти пересечения отрезков из <tex>D</tex> и <tex>S'</tex>, затем, все пересечения в <tex>S'</tex>. Чтобы найти пересечения отрезков в <tex>S'</tex>, мы ''режем'' полосу <tex>\langle a, b \rangle</tex> и множество <tex>S'</tex> по вертикале <tex>x = c</tex> на полосы <tex>\langle a, с \rangle</tex>, <tex>\langle с, b \rangle</tex> и множества <tex>S'_{ls}</tex>, <tex>S'_{rs}</tex> соответственно, где c является медианой вершин отрезков, между <tex>a</tex> и <tex>b</tex>. Затем мы рекурсивно вызываем функцию к парам <tex>(S'_{ls}, \langle a, c \rangle)</tex> и <tex>(S'_{rs}, \langle c, b \rangle)</tex>. Ключевым является тот факт, что согласно [[#lemma1|лемме]] <tex>|S'| \le Ends_{a, b}(S') + |Int(D, S')|</tex>, таким образом, число дополнительных отрезков, появляющихся после ''разрезаний'' пропорционально числу найденных пересечений. | ||
+ | |||
+ | ===Пункт подробностей =)=== | ||
+ | |||
+ | Давайте разберемся с алгоритмом более подробнее: | ||
+ | |||
+ | Не умаляя общности, предположим, что все пересечения и вершины отрезков имеют разные абсциссы. В конечном счете, их можно будет ''поставить на свое место'' введением дополнительных свойств. Рассматриваем целые координаты на промежутке <tex>\[1, 2N\]</tex>. | ||
+ | |||
+ | Итак, пусть <tex>p_i{</tex> | ||
+ | So, let p,, i and s(i) be the ith endpoint its abscissa and the segment to which it belongs, respectively. | ||
+ | |||
+ | Основная задача нашего алгоритма, это рекурсивная функция <tex>TreeSearch</tex>. Мы соединяем каждый вызов функции с узлом некоего двоичного дерева, именуемого далее ''рекурсивным деревом''. Мы отмечаем все значения, множества и параметры вызова соответствующим узлом. As a result we shall analyze our algorithm examining the recursion tree. Let RT be the set of all nodes of recursion tree, and V be the set of internal nodes. We shall define some values, sets and notations inside the bodies of procedures. | ||
+ | |||
+ | procedure IntersectingPairs(SO ). | ||
+ | Sort the 2N endpoints by abscissa and | ||
+ | find p,, s(i), i= 1,,..,2N; ST := S.; | ||
+ | TreeSearch(S,, 1, 2N); | ||
+ | end procedure. | ||
+ | procedure TreeSearch(S., b, e). | ||
+ | Ife–b=l then | ||
+ | L. =sort S. by <b; SearchInStripb,. (LU, R.); exit; | ||
+ | endif | ||
+ | Split S. into Q. and S: so that staircase | ||
+ | Du := (Qv, (b, e)) be complete relative to S:; | ||
+ | Find lnt(DV , S:); | ||
+ | c:= L(b + e)/2J; | ||
+ | Place segments of S: | ||
+ | crossing the strip (b, c) into S[~(V ) and | ||
+ | the strip (c, e) into s~.(~); | ||
+ | TreeSearch(S1.(V), b, c); | ||
+ | TreeSearch(ST,(V), c, e); | ||
+ | end procedure. | ||
==Примечания== | ==Примечания== |
Версия 23:43, 4 октября 2013
Алгоритм Балабана — детерминированный алгоритм, позволяющий по множеству отрезков на плоскости получить множество точек, в которых эти отрезки пересекаются.
Содержание
Введение
Решение задачи по поиску множества пересечений отрезков является одной из главных задач вычислительной геометрии. Тривиальный детерминированный алгоритм имеет временную сложность [1] с оценкой сложности , в основе которого лежит метод заметающей прямой. Алгоритм, предложенный Чазелле и Едельсбруннером [2], имеет лучшую оценку , но в отличие от предыдущих методов требует квадратичной памяти. Оптимальный детерминированный алгоритм был предложен Балабаном [3] с временной оценкой сложности и памяти, где К - число пересекающихся отрезков. При количестве отрезков равным 2000 и большому количеству пересечений целесообразно использовать алгоритм Балабана. Однако в результате громоздкости и высокой сложности реализации алгоритма в большинстве практических задач используется алгоритм заметающей прямой Бентли-Оттмана.
, и его суть заключается в проверке попарного пересечения отрезков. Сложнее, но эффективнее алгоритм Бентли-ОттманаОсновные понятия
Введем некоторые обозначения. Пусть
Через обозначим вертикальную полосу, которая ограничена прямыми и , а через — отрезок с вершинами в точках с абсциссами и .
Рассмотрим взаимное расположение вертикальной полосы и отрезка .
Определение: |
Будем говорить, что отрезок - содержит(span) полосу | , с вершинами в точках с абсциссами и :
Определение: |
Два отрезка Для двух множеств отрезков и определим множество как . | и называются пересекающимися внутри полосы , если их точка пересечения лежит в пределах этой полосы.
Обозначения
и будут использоваться для описания подмножеств и , состоящих из пересекающихся пар отрезков в пределах полосы . Далее скобки используются для определения неупорядоченных наборов, а скобки используются для определения упорядоченных множеств.Введем отношение порядка на множестве отрезков
если оба отрезка пересекают вертикальную линию и точка пересечения этой прямой с отрезком лежит ниже точки пересечения с .
− любой отрезок из
− нет пересечений отрезков внутри лестницы;
− упорядочена по отношению .
Определение: |
Будем называть лестницу | полностью соотносимой множеству отрезков , если каждый отрезок из либо не пересекает полосу , либо пересекает хотя бы одну из ступенек из множества .
Лемма: |
Если лестница полностью соотносима множеству отрезков , где состоит из отрезков, пересекающих полосу , тогда ,где это число вершин отрезков , находящихся в пределах полосы . |
Определение: |
Если точка | отрезка лежит между ступеньками и , тогда число называется местоположением на лестнице и обозначается как
Утверждение: |
Имея лестницу и множество отрезков , множество можно найти за время . Однако, если упорядочено отношением , где , тогда можно найти за время . |
Алгоритм
Введем несколько дополнительных функций, чтобы упростить основной алгоритм:
Split
Функция
разделяет входное множество отрезков , пересекающих некоторую полосу , на подмножества и так, что лестница полностью соотносима множеству отрезков .Пусть, где For do if отрезок не пересекает последний отрезок из внутри полосы и при этом содержит её then добавить в конец else добавить в конец
Эта функция работает за
времени.Search In Strip
Зная
мы можем найти и используя следующую рекурсивную функцию:if then return Найдем
Здесь,
это функция объединения множеств и , упорядоченных по отношению . Время выполнения эквивалентно сумме времён каждого её запуска. Очевидно, что время работы -той функции, будет равно , где это соответствующие наборы .Учитывая лемму, заключаем, что функция работает за .
Предположим, что все отрезки лежат в полосе лемме , таким образом, число дополнительных отрезков, появляющихся после разрезаний пропорционально числу найденных пересечений.
. Таким образом в самом начале у нас есть пара . Что же дальше происходит: множество распадается в подмножества и , после чего лестница становится полностью соотносимой множеству . Необходимо найти пересечения отрезков из и , затем, все пересечения в . Чтобы найти пересечения отрезков в , мы режем полосу и множество по вертикале на полосы , и множества , соответственно, где c является медианой вершин отрезков, между и . Затем мы рекурсивно вызываем функцию к парам и . Ключевым является тот факт, что согласноПункт подробностей =)
Давайте разберемся с алгоритмом более подробнее:
Не умаляя общности, предположим, что все пересечения и вершины отрезков имеют разные абсциссы. В конечном счете, их можно будет поставить на свое место введением дополнительных свойств. Рассматриваем целые координаты на промежутке
.Итак, пусть
So, let p,, i and s(i) be the ith endpoint its abscissa and the segment to which it belongs, respectively.Основная задача нашего алгоритма, это рекурсивная функция
. Мы соединяем каждый вызов функции с узлом некоего двоичного дерева, именуемого далее рекурсивным деревом. Мы отмечаем все значения, множества и параметры вызова соответствующим узлом. As a result we shall analyze our algorithm examining the recursion tree. Let RT be the set of all nodes of recursion tree, and V be the set of internal nodes. We shall define some values, sets and notations inside the bodies of procedures.procedure IntersectingPairs(SO ). Sort the 2N endpoints by abscissa and find p,, s(i), i= 1,,..,2N; ST := S.; TreeSearch(S,, 1, 2N); end procedure. procedure TreeSearch(S., b, e). Ife–b=l then L. =sort S. by <b; SearchInStripb,. (LU, R.); exit; endif Split S. into Q. and S: so that staircase Du := (Qv, (b, e)) be complete relative to S:; Find lnt(DV , S:); c:= L(b + e)/2J; Place segments of S: crossing the strip (b, c) into S[~(V ) and the strip (c, e) into s~.(~); TreeSearch(S1.(V), b, c); TreeSearch(ST,(V), c, e); end procedure.
Примечания
Литература
Т.Вознюк, В.Терещенко — К построению эффективного решения задачи пересечения отрезков
Ф.Препарата, М.Шеймос — Вычислительная геометрия