Алгоритм Балабана — различия между версиями
(add picture) |
|||
| Строка 24: | Строка 24: | ||
}} | }} | ||
| − | Два отрезка <tex>s_1</tex> и <tex>s_2</tex> называются пересекающимися внутри полосы <tex>\langle a, b \rangle</tex>, если их точка пересечения лежит в пределах этой полосы. <br> | + | {{Определение |
| + | |definition= | ||
| + | Два отрезка <tex>s_1</tex> и <tex>s_2</tex> называются ''пересекающимися внутри'' полосы <tex>\langle a, b \rangle</tex>, если их точка пересечения лежит в пределах этой полосы.<br> | ||
| + | |||
Для двух множеств отрезков <tex>S</tex> и <tex>S'</tex> определим множество <tex>Int(S, S')</tex> как <tex>\{ {s, s'} | (s \in S, s' \in S') \& (s \ intersect \ s') \}</tex>. | Для двух множеств отрезков <tex>S</tex> и <tex>S'</tex> определим множество <tex>Int(S, S')</tex> как <tex>\{ {s, s'} | (s \in S, s' \in S') \& (s \ intersect \ s') \}</tex>. | ||
| + | }} | ||
| + | [[Файл:Balaban_pic_1.png|350px|thumb|right|<tex>D = ((s_1, s_2, s_3), \langle a, b \rangle)</tex>, <tex>Loc(D, s_4) = 0</tex>, <tex>Loc(D, s_5) = 2</tex> или <tex>3</tex>, <tex>Int(D, \{s_4,\ s_5\}) = \{\{s_3,\ s_5\}\}</tex>]] | ||
Обозначения <tex>Int_{a, b}(S)</tex> и <tex>Int_{a, b}(S, S')</tex> будут использоваться для описания подмножеств <tex>Int(S)</tex> и <tex>Int(S, S')</tex>, состоящих из пересекающихся пар отрезков в пределах полосы <tex>\langle a, b \rangle</tex>. Далее скобки <tex>\{\}</tex> используются для определения неупорядоченных наборов, а скобки <tex>()</tex> используются для определения упорядоченных множеств. | Обозначения <tex>Int_{a, b}(S)</tex> и <tex>Int_{a, b}(S, S')</tex> будут использоваться для описания подмножеств <tex>Int(S)</tex> и <tex>Int(S, S')</tex>, состоящих из пересекающихся пар отрезков в пределах полосы <tex>\langle a, b \rangle</tex>. Далее скобки <tex>\{\}</tex> используются для определения неупорядоченных наборов, а скобки <tex>()</tex> используются для определения упорядоченных множеств. | ||
| Строка 33: | Строка 38: | ||
{{Определение | {{Определение | ||
| + | |neat=neat | ||
|definition= | |definition= | ||
| − | ''Лестница'' <tex>D</tex> — это пара <tex>(Q, \langle a, b \rangle)</tex>, в которой отрезки <tex>Q</tex> удовлетворяют следующим условиям : | + | ''Лестница'' <tex>D</tex> — это пара <tex>(Q, \langle a, b \rangle)</tex>, в которой отрезки из множества <tex>Q</tex> удовлетворяют следующим условиям : |
− любой отрезок из <tex>Q</tex> содержит полосу <tex>\langle a, b \rangle</tex>; <br> | − любой отрезок из <tex>Q</tex> содержит полосу <tex>\langle a, b \rangle</tex>; <br> | ||
− нет пересечений отрезков внутри лестницы; <br> | − нет пересечений отрезков внутри лестницы; <br> | ||
− <tex>Q</tex> упорядочена по отношению <tex><_a</tex>. | − <tex>Q</tex> упорядочена по отношению <tex><_a</tex>. | ||
| + | |||
| + | Часть отрезков лестницы внутри полосы будем называть '''ступеньками'''. | ||
| + | }} | ||
| + | |||
| + | {{Определение | ||
| + | |definition= | ||
| + | Если точка <tex>p</tex> отрезка <tex>s</tex> лежит между ступеньками <tex>i</tex> и <tex>i + 1</tex>, тогда число <tex>i</tex> называется ''местоположением'' <tex>s</tex> на лестнице <tex>D</tex> и обозначается как <tex>Loc(D, s)</tex> | ||
}} | }} | ||
| − | + | {{Утверждение | |
| + | |statement= | ||
| + | Имея лестницу <tex>D = (Q, \langle a, b \rangle)</tex> и множество отрезков <tex>S</tex>, множество <tex>Int(D, S)</tex> можно найти за время <tex>O(|S| log|Q| + |Int(D, S)|)</tex>. <br> | ||
| + | Однако, если <tex>S’</tex> упорядочено отношением <tex><_x</tex>, где <tex>x \in [a, b]</tex>, тогда можно найти <tex>Int(D, S)</tex> за время <tex>O(|S| + |Q| + |Int(D, S)|)</tex>. | ||
| + | }} | ||
==Алгоритм== | ==Алгоритм== | ||
Версия 11:28, 1 октября 2013
Алгоритм Балабана — детерминированный алгоритм, позволяющий по множеству отрезков на плоскости получить множество точек, в которых эти отрезки пересекаются.
Введение
Решение задачи по поиску множества пересечений отрезков является одной из главных задач вычислительной геометрии. Тривиальный детерминированный алгоритм имеет временную сложность , и его суть заключается в проверке попарного пересечения отрезков. Сложнее, но эффективнее алгоритм Бентли-Оттмана [1] с оценкой сложности , в основе которого лежит метод заметающей прямой. Алгоритм, предложенный Чазелле и Едельсбруннером [2], имеет лучшую оценку , но в отличие от предыдущих методов требует квадратичной памяти. Оптимальный детерминированный алгоритм был предложен Балабаном [3] с временной оценкой сложности и памяти, где К - число пересекающихся отрезков. При количестве отрезков равным 2000 и большому количеству пересечений целесообразно использовать алгоритм Балабана. Однако в результате громоздкости и высокой сложности реализации алгоритма в большинстве практических задач используется алгоритм заметающей прямой Бентли-Оттмана.
Основные понятия
Введем некоторые обозначения. Пусть - множество всех точек пересечения отрезков из множества , а - количество таких пересечений ;
Через обозначим вертикальную полосу, которая ограничена прямыми и , а через отрезок с концами абсцисс и .
Рассмотрим взаимное расположение вертикальной полосы и отрезка .
| Определение: |
| Будем говорить, что отрезок , с концами абсцисс и :
- содержит(span) полосу , если ; |
| Определение: |
| Два отрезка и называются пересекающимися внутри полосы , если их точка пересечения лежит в пределах этой полосы. Для двух множеств отрезков и определим множество как . |
Обозначения и будут использоваться для описания подмножеств и , состоящих из пересекающихся пар отрезков в пределах полосы . Далее скобки используются для определения неупорядоченных наборов, а скобки используются для определения упорядоченных множеств.
Введем отношение порядка на множестве отрезков если оба отрезка пересекают вертикальную линию и точка пересечения этой прямой с отрезком лежит ниже точки пересечения с .
− любой отрезок из содержит полосу ;
− нет пересечений отрезков внутри лестницы;
− упорядочена по отношению .
| Определение: |
| Если точка отрезка лежит между ступеньками и , тогда число называется местоположением на лестнице и обозначается как |
| Утверждение: |
Имея лестницу и множество отрезков , множество можно найти за время . Однако, если упорядочено отношением , где , тогда можно найти за время . |
Алгоритм
Примечания
Литература
Т.Вознюк, В.Терещенко — К построению эффективного решения задачи пересечения отрезков
Ф.Препарата, М.Шеймос — Вычислительная геометрия