Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Локализация точки / Локализация точки.doc
Скачиваний:
94
Добавлен:
01.05.2014
Размер:
16.82 Mб
Скачать
    1. Метод трапеций

Мы уже представили оптимальный алгоритм, метод детализации триангуляции, но более привлекательным может оказаться такой алгоритм, асимптотическое поведение которого в худшем случае, возможно, и не оптимально. Это связано с тем, что обозначения «порядка» (, ,  и ) скрывают мультипликативные константы. Следовательно, оценка вычислительной сложности алгоритма достигает своей законной силы при больших размерах задачи (именно поэтому такой подход и называется асимптотическим анализом). Поэтому, вполне вероятно, и действительно часто бывает так, что при малых размерах задачи наиболее пригоден алгоритм, который асимптотически не оптимален. Это предостережение никак нельзя игнорировать при выборе алгоритма для конкретного приложения. Учитывая все ранее упомянутое, желаемой целью может оказаться компромиссный подход, основанный на прямой процедуре поиска при, возможно, немного не оптимальной затрате памяти. Именно с этой позиции и следует рассматривать метод трапеций.

Неформально, идею метода трапеций можно считать развитием метода полос. Напомним, что этот метод имеет очень простую процедуру поиска - , но в худшем случае использует досадно много памяти -(это может происходить при наличии «длинных» ребер в ППЛГ, т.е. пересекающих несколько полос См. Рис. 2.10.).

Рис.2.10.

В методе трапеций, в отличии от метода полос, такие “длинные” ребра могут стать преимуществом. Действительно, “длинное” ребро очень удачно разрезает ППЛГ, так что горизонтальные полосы по обе стороны от ребра образуют полностью независимые структуры (трапеции).

Определение. Трапеция имеет две горизонтальные стороны и может иметь две, одну или нуль боковых сторон, причем боковые стороны, если они существуют, являются ребрами ППЛГ (или, по крайней мере, их частями) и никакое другое ребро ППЛГ не пересекает обе ее горизонтальные стороны.

Пусть имеется плоский прямолинейный граф . Множество вершин графа упорядочено по возрастанию их ординат. Множество ребер упорядочено в соответствии с отношением частичного порядка “” (способ получения такого упорядочения мы рассмотрим позже).

Определение. Даны два ребра e1 и e2 из . Записьe1e2 (читается “ e1 левее e2”), обозначает, что существует горизонталь, пересекаюшая оба ребра, и точка ее пересечения с e1 будет левее соответствующей точки на e2. (см.рис.2.11.)

.

Рис. 2.11. (а) случай сравнимых ребер e1e2; (б) случай несравнимых ребер.

Поиск осуществляется путем локализации пробной точки в последовательности вложенных трапеций, до тех пор, пока эта последовательность не закончится такой трапецией, внутри которой нет ребер ППЛГ или их фрагментов.

Основной механизм, строящий структуру данных, обрабатывает по одной трапеции и стремится разбить ее на максимально возможное число более мелких трапеций. Это делается путем разрезания трапеции R на «нижний» и «верхний» слои R1 и R2 горизонталью, проходящей через ту вершину ППЛГ, чья ордината является медианой множества ординат вершин внутри R (Рис.2.12).

Рис.2.12.Разбиение ППЛГ на трапеции.

Каждый из этих слоев R1 и R2, хотя и является геометрической трапецией, удовлетворяет не всем условиям нашего определения трапеции, поскольку некоторые ребра ППЛГ могут пересекать одновременно обе его горизонтальные стороны (ребра е2 и е8 на рисунке 3). Такие ребра назовем накрывающими. Теперь каждое ребро, накрывающее один из слоев, определяет его последующий разрез.

Проделываются следующие операции. После определения медианы исходной трапеции R цепочка ребер ППЛГ, пересекающих R, просматривается слева на право и разделяется на две цепочки, относящиеся к слоям R1 и R2 соответственно. Всякий раз, когда встречается накрывающее ребро, оно становится правой боковой границей новой трапеции, которая может обрабатываться независимо.

Структура данных для рисунка 2.12, изображена на рис. 2.13.

Рис. 2.13.Структура данных поиска.

Каждый узел дерева связан с линейной проверкой. Удобно различать узлы двух типов: -узлы, если соответствующая проверка проводится относительно горизонтали, и-узлы, если эта проверка ведется относительно прямой, несущей ребро ППЛГ. Очевидно, что корень T(R) всегда будет -узлом соответствующей вершине, ордината которой является медианой множества ординат вершин ППЛГ в данной трапеции. Поскольку две крайние вершины не участвуют в разбиении трапеции, то число-узлов в дереве поиска будет равноN-2.

Запишем формально процедуру ТРАПЕЦИЯ.

// ТРАПЕЦИЯ (построение структуры поиска)

// Вход: E – цепочка ребер ППЛГ, упорядоченных в соответствии с отношением частичного порядка;

V – последовательность вершин в трапеции R, упорядоченных по возрастанию их ординат;

I – у-интервал трапеции R.

// Выход: Дерево.

// Рабочие списки алгоритма: E1, E2, V1, V2, U1, U2.

Function ТРАПЕЦИЯ (E. V, I)

Begin

If (V = Ø) then return Λ; //лист дерева поиска

Else begin

E1 := E2 := V1 := V2 := U1 := U2 := Ø;

Ymed := Медиана_множества_ординат (V);

I1:= [min(I), Ymed];

I2:= [Ymed, max(I)];

Repeat e  E

For i = 1,2 do begin

If (е имеет конец р внутри Ri)

Then begin

Ei  e;

Vi:=Vi{p} // (*)

end

If (е накрывает Ri) или (e = Λ)

Then begin

Ui  ТРАПЕЦИЯ(Ei, Vi, Ii);

If (e  Λ) then Ui  e;

Ei:=Vi:= Ø;

End

End

Until (e = Λ);

Новый (); // создание нового -узла, корняT(R)

Y[]:=Ymed;

Левое_дерево[]:=БАЛАНС(U1);

Правое_дерево[]:=БАЛАНС(U2);

//функция БАЛАНС принимает на входе чередующуюся //последовательность из деревьев и ребер и организует их в //дерево

return Дерево [];

end

end.

В этом алгоритме можно выделить три основных действия:

  1. Определение медианы множества ординат вершин в R;

  2. Разбиение исходной трапеции R на верхний и нижний слои и получение для них цепочек U1 и U2 состоящих из ребер и деревьев;

  3. Балансировка цепочек U1 и U2 .

Первое действие можно выполнить за время с помощью алгоритма поиска медианы. Однако существует более простой и прямой путь. Вершины трапеции располагаются в массиве по возрастанию ординат (медиану такого массива можно найти за одно обращение). Модификация процедуры ТРАПЕЦИЯ происходит следующим образом. Последовательность ребер просматривается дважды. При первом проходе каждая вершина просто помечается именем той трапеции, к которой она отнесена. Непосредственно используя эти отметки, строится массив вершин для каждой порожденной трапеции. При втором проходе выполняется циклRepeat (за исключением строки (*)).

Теперь рассмотрим функцию БАЛАНС, которая организует последовательность ребер и деревьев в дерево.

Пусть цепочка U имеет вид U=T1e1T2e2…eh-1Th. Определим вес дерева Tj, как число вершин ППЛГ содержащихся в соответствующей трапеции (т.е. число -узлов в деревеTj). Вес U равен .

// Функция БАЛАНС (организует цепочку из ребер и деревьев в дерево)

// Вход: U – цепочка из ребер и деревьев.

// Выход: Дерево.

Function БАЛАНС (U)

Begin

If (W(U)=0) //т.е. U=e1e2…eh-1

Then

Создать_сбалансированное_дерево (U);

Else begin

Определить_r_ такое_ что: ;

:=БАЛАНС(U= T1e1T2e2…Tr-1);

’’:=БАЛАНС(U’’= Tr+1er+1…Tr-1);

Построить_дерево (er-1, er, Tr, , ’’);//строится дерево подобное //изображенному на рис. 2.14.

End

End

Рис.2.14.

Ясно, что процедура БАЛАНС требует времени. Действительно, разделениеU (поиск r) потребует времени, а затем последуют два рекурсивных вызова этой же функции, применяемых к половинам исходной цепи.

Проведем анализ высоты деревьев получаемых с использованием функции БАЛАНС. Отметим, что h – это число деревьев в цепочке U, и оно равно числу трапеций получаемых при обработке слоя соответствующего U. Очевидно, что число новых трапеций на единицу больше, чем число накрывающих ребер. Накрывающие ребра можно считать диагоналями простого многоугольника (Рис.2.15.).

Рис.2.15.

Пусть число вершин этого простого многоугольника равно S. Тогда число его диагоналей не превосходит S-3 (потому что эти диагонали определяют триангуляцию простого многоугольника). Так как , получаем

Вообще справедлива следующая теорема.

Теорема. Для заданной цепочки U=T1e1T2e2…eh-1Th высота дерева построенного с помощью функции БАЛАНС, не превосходит следующего значения

Так как , то

И наконец рассмотрим вычислительную сложность цикла Repeat в процедуре ТРАПЕЦИЯ. Для каждого рассматриваемого ребра (т.е. взятого из списка E) этот цикл выполняет константный объем вычислений. Следовательно, общая работа, проделанная в этом цикле, пропорциональна суммарному числу фрагментов ребер порождаемых алгоритмом. Оценим это число сверху. Очевидно, что ребро делится впервые тогда, когда его концы лежат в разных слоях, определяемых медианой трапеции R (Рис.2.16.).

Рис.2.16.

После этого деления верхний фрагмент ребра попадает в трапецию R. Если медиана R делит e (худший случай), то e накрывает нижний слой в R, а следующее его деление может произойти только в верхнем слое R. Аналогичные соображения применимы к фрагменту e, попавшему в нижний слой R. Поэтому выражая число делений верхнего фрагмента ребра e как функцию от числавершин вR, мы получаем грубую оценку: , где- число вершин в трапецииR’’ (Рис.7). Поскольку , мы получаем , а поскольку , то общее число делений e не превосходит . Эта оценка доказывает два утверждения:

  1. Общая работа, производимая в цикле Repeat, пропорциональна , поскольку имеетсяребер, а каждое ребро разделено не более чемфрагментов. Поскольку обе задачи (поиска медиан и балансировки) требуют в суммевремени, то все построение структуры данных поиска завершится за время.

  2. Поскольку структура данных поиска имеет -узел для каждого фрагмента ребра и -узел для каждой вершины (кроме двух вершин ППЛГ имеющих максимальную и минимальную ординату соответственно), то используемая память также оценивается через.

Резюмируем:

Локализацию точки на - вершинном планарном подразбиении можно реализовать с помощью метода трапеций за времяс использованиемпамяти, есливремени ушло на предобработку.

Теперь вернемся к вопросу о получении множества ребер, упорядоченного в соответствии с отношением частичного порядка. В [1] предложено следующее решение. Для получения искомого упорядочения, применяется метод, являющийся простой модификацией плоского заметания. В процессе заметания сверху вниз вершины графапросматриваются, а статус заметающей прямой корректируется так, как описано выше. Побочным результатом этого заметания является регистрация смежности всех ребер, получаемая при вставлении или удалении. Отношение смежности выражается в виде упорядоченной пары ребер (левое – правое).

Очевидно, что если граф имеетвершин, то отношение смежности можно вычислить за время. Далее следует воспользоваться методом топологической сортировки, и за времяполучить искомое упорядочение.

Однако, можно несколько упростить данную процедуру, а именно избежать явного шага топологической сортировки. Для этого следует немного изменить структуру данных статуса заметающей прямой. Она будет представлена в виде сбалансированного по высоте дерева, с которым будет также связан двунаправленный список. Ключи, хранимые в узлах дерева, состоят из двух элементов: непосредственно ребра, и указателя на элемент списка, содержащего это же самое ребро. При заметании вершин графа , например, сверху вниз, происходит следующее. Определяется правый сосед вставляемого ребра, и используя указатель правого соседа, на элемент списка, вставляем в список ребро непосредственно перед правым соседом. При удалении ребра из дерева, просто удаляем ключ соответствующий этому ребру, никак не изменяя список (см. рис.2.17.).

Рис.2.17.Формирование списка ребер в соответствии с отношением частичного порядка.

Для получаемого списка верно следующее утверждение (через обозначен элемент списка стоящий наi-ой позиции):

Очевидно, что время используемое модифицированной процедурой равно , однако мы избежали явного шага топологической сортировки.

Соседние файлы в папке Локализация точки