Изменения
→Модификация трапецоидной карты
<div style="background-color: #ABCDEF; font-size: 16px; font-weight: bold; color: #000000; text-align: center; padding: 4px; border-style: solid; border-width: 1px;">Эта статья находится в разработке!</div><includeonly>[[Категория: В разработке]]</includeonly> Трапецоидная карта {{---}} геометрическая структура позволяющая локализоваться на площади за <tex>\mathcal{O}(\log(n))</tex>данных для локализации в конфигурации отрезков.
==Постановка задачи==
==Структура данных==
[[Файл:TrapazoidmapshagalTrapezoidmapshagal.jpgpng|650px450px|thumb|right|трапецоидная карта]]
*''Геометрическая''
У нас есть множество отрезков, ограниченных оболочкой <tex>R</tex>(это не выпуклая оболочка, а просто мнимая граница плоскости, за которую не вылезают отрезки).
{{Лемма
|statement= Любой <tex>\operatorname{face}</tex> трапецоидной карты ограничен одним или двумя вертикальными отрезками и обязательно двумя не вертикальными отрезками.
}}
[[Файл:Trapezoidmapnavigationshagal.jpgpng|650px|thumb|right|навигация в трапецоидной картеТрапецоидная карта]]
Именно отсюда берется название структуры, так как любой <tex>\operatorname{face}</tex> либо трапеция, либо треугольник.
|proof=
*''вершины'', а точнее откуда они берутся.
**4 вершины уходит на оболочку <tex>R</tex>
**<tex>2 \cdot n</tex> концы отрезков
}}
Хранить трапецоиды можно в чем угодно. Вместе с самим трапецоидом, стоит хранить <tex>\operatorname{leftp}</tex>, <tex>\operatorname{rightp}</tex>, <tex>\operatorname{top}</tex> и <tex>\operatorname{bottom}</tex>. Так же Также следует хранить соседей трапецоида.
----
[[Файл:Trapezoidmapsearchstructureshagal.png|650px|thumb|right|навигация в трапецоидной карте]]
*''Поисковая структура''
Поисковая структура представляет из себя ациклический граф с одним корнем и каждому трапецоиду в структуре соответствует один листсоответствующими трапецоидам листьями.
У каждого узла есть два ребенка и при . При этом узел может быть двух типов.[[Файл:Trapezoidmapsearchstructureshagal.jpg|650px|thumb|right|навигация в трапецоидной карте]]
*Первый тип узла - точка, соответствующая концу отрезка.
*Второй тип узла - отрезок.
Во время запроса мы двигаемся по графу от его корня до момента, когда окажемся в листе, это . Это и будет означать , что точка находится внутри трапецоида. Если мы находимся не в листе, то мы должны опрелетиться в каком из детей мы окажемся дальше.
Еcть два правила:
*Если текущий узел соответсвует вершине, то смотрим левее или провее мы находимся(проверка по x-координате)выбираем лексикографически нужную. *Если текущий узел соответствует отрезку, то смотрим , выше или ниже мы находимся(проверка по <tex>y</tex>-координате). *Плохие случаи: Мы находимся на одной вертикале с вершиной Мы находимся на отрезке (Решение: молиться, или просто обрабатывать вручную.)
==Алгоритм==
[[Файл:Trapezoidmapnotsuchbadcaseshagal.jpgpng|400px|thumb|right|простой случай]]Во время построения трапецоидной карты(в дальнейшем <tex> T</tex>) алгоритм так же также строит структуру для поиска .
''Порядок добавления отрезков''
От порядка добавления зависит время запроса. Как? Время запрос пропорцианально запроса пропорционально глубине графа.
Считается, что еслли , если добавлять отрезки рандомнов случайном порядке, то время будет хорошим. Почему и какое время будет рассписано достигаться, расписано дальше.
===Алгоритм===
*Удалили их.
*Создали новый новые трапецоиды.[[Файл:TrpezoidmapbadcaseshagalTrpezoidmapbadcaseshaga.jpgpng|400px|thumb|right|сложный случай]]
===Поиск трапецоидов которых , которые пересек отрезок===Чтобы модифицировать карту, мы должны понять , где произошло изменение.
Оно произошло в тех трапецоидах , которые пересек текущий отрезок или можно сказать, что трапецоид с i-1-ой итерации не будет в i-ой только если его пересек отрезок.
Пусть якобы есть множество трапецоидов <tex>\Delta_0, \Delta_1, \Delta_2 ... \ldots \Delta_k</tex> , упорядоченное по <tex>s_i</tex>
Пусть <tex>\Delta_{j+1}</tex> {{---}} один из правых соседей <tex>\Delta_j</tex> Так же . Также, при этом не сложно несложно понять , каким соседом он является.
Если rightp(<tex>\operatorname{rightp} \Delta_j</tex>) лежит выше <tex>s_i</tex>, то сосед нижний и наоборот.
Это значит, что , если мы знаем первый трапецоид, то мы можем найти остальные , просто обходя по карте соседей справа.
Чтобы найти первый трапецоид , нужно просто локализовать правый конец в текущей карте.
===update===
Есть два случая.
*'''Простой ''' {{- --}} отрезок не пересекает ни одного трапецоида, то есть целеком целиком внутри.
Тогда удаляем этот старый трапецоид и на его место ставим дерево из двух концов отрезка, отрезка и четырех образовавшихся трапецоидов.
Важно не забыть правильно определить соседей новых трапецоидов.
В случае, если какие-то трапецоиды выродятся в треугольники, будет не четыре новых трапецоида, а 2 или 3.
*Находим множество трапецоидов, которых пересек отрезок (в данном случаи он один).
*Находим этот трапецоид в <tex> T </tex> и добавляем вместо него нужные трапецоиды.
*Спускаемся по <tex> D </tex> до соответствующего трапецоида.
*Вместо этого трапецоида добавляем ключ "x" и строим оттуда часть структуры, как показано на картинке.
*'''Сложный''' {{---}} отрезок пересекает сразу несколько трапецоидов.
==Случай коллизии==
Рассмотрим момент, когда мы мы строим карты. Мы должны добавить очередной отрезок.
Предположим, левый конец отрезка лежит на одной вертикале вертикали с уже добавленной в карту точкой <tex> p </tex>.
Скажем, что наша точка лежит правее , чем та , которая уже есть. В случаи случае, если мы попали на уже созданный отрезок , мы скажем, что находимся , например , ниже его.
Что при этом произойдет.
*С геометрической точки зрения , появится еще ещё несколько трапецоидов , как в случааи случае, если бы вновь добавленная точка была правее на <tex> \varepsilon \rightarrow 0</tex>.
А значит, у трапецоида по прежнему не более двух правых соседей.
*С точки зрения поисковой структуры мы по -прежнему можем локализоваться. По крайней мере , узел , соответствующий точке <tex> p </tex> будет иметь правого сына правым сыном нашу точку.
Итого, слова "трапецоидные карты просты отсутствие случаев" появляются именно отсюда, так как , казалось бы , неприятный случай будет прописан заменой <tex>\textless </tex>
на <tex> \le </tex>
==Асимптотика==
===Запрос===
Предположим , у нас есть запрос на локализацию точки <tex>q</tex>. Время , затраченное на этот запрос , будет линейно зависеть от глубина глубины графа.
При добавлении в карту очередного отрезка(в дальнейшем , итерация алгоритма) , глубина графа увеличивается максимум на 3. Из этого мы можем сделать простую оценку.
Наибольшее время на запрос, которое мы можем потратить {{---}} <tex>3n</tex>. Произойдет это в самом ужасном из самых ужасных случаев.
Как говорилось раньше , отрезки мы добавляем рандомнов случайном порядке, а потому редко будет самый ужасный случай , и , с вероятностных точек зрения , время на запрос будет меньше.
Рассмотрим путь , пройденный точкой по графу. Каждый узел был создан на какой-то итерации цикла. Обозначим за <tex>X_i</tex> - количество узлов , созданных на итерации <tex>i</tex>.
Так как никто не выбирал исходное множество отрезков и запрос <tex>q</tex>, <tex>X_i</tex> {{- --}} рандомная величина , зависящая только от рандомного порядка добавления отрезков.
<tex>E[\sum^{n}_{i=1}X_i] = \sum^{n}_{i=1}E[X_i]</tex>
Как уже упоминалось , на каждой итерации добавляется не более 3 узлов, а значит <tex>X_i\leq 3</tex> <= 3.
Считая, что <tex> P_i </tex> {{- --}} вероятность того, что существует узел, который встречается при нашем запросе , созданный на <tex>i</tex>-ой итерации.
<tex>\sum^{n}_{i=1}E[X_i] <= \sum^{n}_{i=1}3P_i</tex>
Начинаем оценивать <tex> P_i </tex>.
Что значит, что узел был создан на <tex>i</tex>-ой итерации и встретился при запросе q? Это значит, что на i - 1-ой итерации мы локализовывали q в трапецоиде <tex> \Delta_q(i - 1) q</tex>,?
Это значит, что на <tex>i-1</tex>-ой итерации мы локализовывали <tex>q</tex> в трапецоиде <tex>\Delta_q(i-1)</tex>,а на <tex>i</tex>-ой итерации уже в трапецоиде <tex> \Delta_q(i) </tex> и эти два трапецоида разные.
То есть, после добавления непонятно чего в карту, трапецоид изменился.
Таким образом <tex>P_i</tex> = P(<tex> \Delta_q(i) \ne \Delta_q(i - 1)) </tex>).
Если эти два трапеецоида трапецоида не равны, значит , на i-ой итерации трапецоид <tex> \Delta_q(i) </tex> был одним из созданных при модификации.
Заметим, что все трапецоиды , созданные на этой итерации , были смежны текущему отрезку(<tex> s_i </tex>).
Значит , либо <tex> s_i </tex> = \operatorname{top(<tex>} \Delta_i</tex>) или bottom(<tex>\operatorname{bottom} \Delta_i</tex>), либо концы <tex>s_i</tex> = \operatorname{leftp(<tex>} \Delta_i</tex>) или rightp(<tex>\operatorname{rightp} \Delta_i</tex>).
Зафиксируем множество отрезков на <tex>i</tex>-ой итерации. Тогда состояние трапецоидов никак не будет зависеть от порядка добавленных отрезков.
Тогда, вероятность изменения трапецоида {{--- }} это его вероятность исчезнуть , если удалится <tex>s_i</tex>.
Тогда переходим, к top(<tex>\operatorname{top} \Delta_i</tex>) и т.п. так как мы уже говорили, что <tex>s_i</tex> будет определенной стороной при навигации.
Отрезки добавлялись рандомно , поэтому , в качестве <tex>s_i</tex> мог быть любой отрезок из <tex>S_i</tex>. А , тогда , вероятность для всех сторон 1<tex>\frac1i</itex>.
Суммируем по всем 4 сторонам.
Таким образом <tex>P_i = P( \Delta_q(i) \ne \Delta_q(i - 1)) = P( \Delta_q(i) \in \Delta_q(i - 1) ) \le 4/i\frac4i</tex>
<tex>\sum^{n}_{i=1}E[X_i] \le \sum^{n}_{i=1}3P_i \le \sum^{n}_{i=1}\frac{12/}i \le 12\sum^{n}_{i=1}(1/i) \approx 12 \cdot log(n)</tex>
===Память===
Заметим, что количество трапецоидов , как мы доказали раньше , равно <tex>\mathcal{O}(n)</tex>, поэтому мы должны оценить количество узлов созданых на <tex>i</tex>-ой итерации.
А результирующее выражение для памяти тогда будет
Обозначив за <tex>k_i </tex> количество узлов , созданное на <tex>i</tex>-ой итерации
==Реализация==
Здесь будут рассмотрены некоторые основные моменты реализации
Это только идейные реализации идеи, в коде все выглядет пример выглядит примерно в 50 раз хуже.(по количеству строк)
===Класс "трапецоид"===
struct Trapezoid Trapezoid next Trapezoid up Trapezoid down Trapezoid end Segment top Segment bottom Point left Point right
===Построение трапецоидной карты===
TrapezoidMap(S - segments) Строим оболочку(просто находим крайние точки множества отрезков по четырем направлениям) Строим рандомную перестановку отрезков
for для всех
==Ссылки==
[http://graphics.stanford.edu/courses/cs268-09-winter/ Lecture notes from stanford, Seidel]
[[Категория: Вычислительная геометрия]]