<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=109.188.220.108&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=109.188.220.108&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/109.188.220.108"/>
		<updated>2026-04-16T21:23:25Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D1%80%D0%B0%D0%BF%D0%B5%D1%86%D0%BE%D0%B8%D0%B4%D0%BD%D0%B0%D1%8F_%D0%BA%D0%B0%D1%80%D1%82%D0%B0&amp;diff=19434</id>
		<title>Трапецоидная карта</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D1%80%D0%B0%D0%BF%D0%B5%D1%86%D0%BE%D0%B8%D0%B4%D0%BD%D0%B0%D1%8F_%D0%BA%D0%B0%D1%80%D1%82%D0%B0&amp;diff=19434"/>
				<updated>2012-03-14T17:55:39Z</updated>
		
		<summary type="html">&lt;p&gt;109.188.220.108: /* Структура данных */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Трапецоидная карта {{---}} геометрическая структура позволяющая локализоваться на площади за &amp;lt;tex&amp;gt;\mathcal{O}(\log(n))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
==Постановка задачи==&lt;br /&gt;
Предположим, у нас есть наши координаты, и есть карта мира.&lt;br /&gt;
  &lt;br /&gt;
Мы можем найти по карте наше местоположение и сказать в какой стране мы находимся.&lt;br /&gt;
Области задаются замкнутыми ломаными. &lt;br /&gt;
  &lt;br /&gt;
'''Формальная постановка задачи'''	&lt;br /&gt;
&lt;br /&gt;
Есть множество отрезков на плоскости.&lt;br /&gt;
Есть запрос (точка &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt;), на выходе {{---}} область, в которой находится точка &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Структура данных==&lt;br /&gt;
[[Файл:Trapezoidmapshagal.png|450px|thumb|right|трапецоидная карта]]	&lt;br /&gt;
&lt;br /&gt;
*''Геометрическая''&lt;br /&gt;
&lt;br /&gt;
У нас есть множество отрезков, ограниченных оболочкой &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt;(это не выпуклая оболочка, а просто мнимая граница плоскости, за которую не вылезают отрезки).&lt;br /&gt;
&lt;br /&gt;
Мы договариваемся, что никакие две точки не лежат на одной вертикали(в противном случае всё ещё противнее).&lt;br /&gt;
	&lt;br /&gt;
''Трапецоидная карта'' множества отрезков &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; {{---}} это эти отрезки и из каждой точки выпущены два луча {{---}} вверх и вниз, до первого пересечения с другим отрезком или с оболочкой &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt;.&lt;br /&gt;
	&lt;br /&gt;
{{Лемма &lt;br /&gt;
 |statement= Любой &amp;lt;tex&amp;gt;\operatorname{face}&amp;lt;/tex&amp;gt; трапецоидной карты ограничен одним или двумя вертикальными отрезками и обязательно двумя не вертикальными отрезками.&lt;br /&gt;
}}&lt;br /&gt;
	[[Файл:Trapezoidmapnavigationshagal.jpg|650px|thumb|right|навигация в трапецоидной карте]]&lt;br /&gt;
&lt;br /&gt;
	Именно отсюда берется название структуры, так как любой &amp;lt;tex&amp;gt;\operatorname{face}&amp;lt;/tex&amp;gt; либо трапеция, либо треугольник.&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
Введем обозначения для навигации по карте.&lt;br /&gt;
&lt;br /&gt;
*''левая граница'' (&amp;lt;tex&amp;gt;\operatorname{leftp}&amp;lt;/tex&amp;gt;) {{---}} точка, определяющая левую сторону трапецоида или, в случаи треугольника, просто являющаяся левой вершиной.&lt;br /&gt;
*''правая граница'' (&amp;lt;tex&amp;gt;\operatorname{rightp}&amp;lt;/tex&amp;gt;) {{---}} аналогично левой, только справа.&lt;br /&gt;
*''верхний отрезок'' (&amp;lt;tex&amp;gt;\operatorname{top}&amp;lt;/tex&amp;gt;) и нижний отрезок(&amp;lt;tex&amp;gt;\operatorname{bottom}&amp;lt;/tex&amp;gt;) {{---}} отрезки, ограничивающие, трапецоид сверху и снизу.&lt;br /&gt;
*трапецоиды называются ''смежными'', если имеют общую вертикальную границу.&lt;br /&gt;
*пусть &amp;lt;tex&amp;gt;\Delta_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\Delta_2&amp;lt;/tex&amp;gt; смежны и либо &amp;lt;tex&amp;gt;\operatorname{top}(\Delta_1) = \operatorname{top}(\Delta_2)&amp;lt;/tex&amp;gt;, либо &amp;lt;tex&amp;gt;\operatorname{bottom}(\Delta_1) = \operatorname{bottom}(\Delta_2)&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\Delta_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\Delta_2&amp;lt;/tex&amp;gt; называют либо нижними, либо верхними левыми соседями.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Трапецоидная карта, построенная на &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; отрезках содержит максимум &amp;lt;tex&amp;gt;6n+4&amp;lt;/tex&amp;gt; вершины и максимум &amp;lt;tex&amp;gt;3n+1&amp;lt;/tex&amp;gt; трапецоид.&lt;br /&gt;
|proof=&lt;br /&gt;
*''вершины'', а точнее откуда они берутся.&lt;br /&gt;
[[Файл:Trapezoidmapnavigationleftpshagal.jpg|400px|thumb|right|варианты leftp(&amp;lt;tex&amp;gt;\Delta&amp;lt;/tex&amp;gt;)]]&lt;br /&gt;
**4 вершины уходит на оболочку &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt;&lt;br /&gt;
**&amp;lt;tex&amp;gt;2 \cdot n&amp;lt;/tex&amp;gt; концы отрезков&lt;br /&gt;
**&amp;lt;tex&amp;gt;2 \cdot 2n&amp;lt;/tex&amp;gt; пересечения вертикальных лучей из концов отрезков с другими отрезками или оболочкой&lt;br /&gt;
*''трапецоиды''&lt;br /&gt;
Будем смотреть на левую сторону трапецоида. &lt;br /&gt;
&lt;br /&gt;
У каждого трапецоида есть точка &amp;lt;tex&amp;gt;\operatorname{leftp}(\Delta)&amp;lt;/tex&amp;gt;. Либо это конец какого-то отрезка, либо это левый нижний угол оболочки.&lt;br /&gt;
&lt;br /&gt;
При этом можно сразу сказать, что левый и нижний угол будут соответствовать только одному трапецоиду.&lt;br /&gt;
&lt;br /&gt;
Далее заметим, что правый конец отрезка может быть &amp;lt;tex&amp;gt;\operatorname{leftp}(\Delta)&amp;lt;/tex&amp;gt; только для одного трапецоида.&lt;br /&gt;
&lt;br /&gt;
Левый конец может быть &amp;lt;tex&amp;gt;\operatorname{leftp}(\Delta)&amp;lt;/tex&amp;gt; максимум для двух трапецоидов. &lt;br /&gt;
&lt;br /&gt;
Из этого следует, что количество трапецоидов &amp;lt;tex&amp;gt;n + 2n + 1 = 3n + 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
Хранить трапецоиды можно в чем угодно. Вместе с самим трапецоидом, стоит хранить &amp;lt;tex&amp;gt;\operatorname{leftp}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\operatorname{rightp}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\operatorname{top}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\operatorname{bottom}&amp;lt;/tex&amp;gt;. Так же следует хранить соседей трапецоида.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
*''Поисковая структура''&lt;br /&gt;
Поисковая структура представляет из себя ациклический граф с одним корнем и соответствующими трапецоидам листьями.&lt;br /&gt;
	&lt;br /&gt;
У каждого узла есть два ребенка. При этом узел может быть двух типов.&lt;br /&gt;
[[Файл:Trapezoidmapsearchstructureshagal.jpg|650px|thumb|right|навигация в трапецоидной карте]]&lt;br /&gt;
&lt;br /&gt;
*Первый тип узла - точка, соответствующая концу отрезка.&lt;br /&gt;
*Второй тип узла - отрезок.&lt;br /&gt;
	&lt;br /&gt;
Во время запроса мы двигаемся по графу от его корня до момента, когда окажемся в листе. Это и будет означать, что точка находится внутри трапецоида.&lt;br /&gt;
	&lt;br /&gt;
Если мы находимся не в листе, то мы должны опредетиться, в каком из детей мы окажемся дальше.&lt;br /&gt;
	&lt;br /&gt;
Еcть два правила:&lt;br /&gt;
	&lt;br /&gt;
*Если текущий узел соответсвует вершине, то смотрим левее или правее мы находимся(проверка по &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;-координате).&lt;br /&gt;
*Если текущий узел соответствует отрезку, то смотрим выше или ниже мы находимся(проверка по &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;-координате).&lt;br /&gt;
		&lt;br /&gt;
*Плохие случаи:&lt;br /&gt;
		&lt;br /&gt;
Мы находимся на одной вертикали с вершиной&lt;br /&gt;
			&lt;br /&gt;
Мы находимся на отрезке&lt;br /&gt;
			&lt;br /&gt;
(Решение: молиться, или просто обрабатывать вручную.)&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
[[Файл:Trapezoidmapnotsuchbadcaseshagal.jpg|400px|thumb|right|простой случай]]&lt;br /&gt;
Во время построения трапецоидной карты(в дальнейшем &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;) алгоритм так же строит структуру для поиска.&lt;br /&gt;
&lt;br /&gt;
Так как трапецоидная карта {{---}} геометрическая структура, а основные операции ведутся именно с поисковой, основной упор делается на неё.&lt;br /&gt;
&lt;br /&gt;
Наш алгоритм добавляет отрезки по одному и, после каждого добавления, модидицирует &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
''Порядок добавления отрезков''&lt;br /&gt;
&lt;br /&gt;
От порядка добавления зависит время запроса. Как? Время запрос пропорцианально глубине графа.&lt;br /&gt;
&lt;br /&gt;
Считается, что если добавлять отрезки в случайном порядке, то время будет хорошим. Почему и какое время будет достигаться, расписано дальше.&lt;br /&gt;
&lt;br /&gt;
===Алгоритм===&lt;br /&gt;
&lt;br /&gt;
*Добавили отрезок.&lt;br /&gt;
&lt;br /&gt;
*Нашли все трапецоиды, которые пересек новый отрезок.&lt;br /&gt;
&lt;br /&gt;
*Удалили их.&lt;br /&gt;
&lt;br /&gt;
*Создали новые трапецоиды.&lt;br /&gt;
[[Файл:Trpezoidmapbadcaseshagal.jpg|400px|thumb|right|сложный случай]]&lt;br /&gt;
&lt;br /&gt;
===Поиск трапецоидов, которые пересек отрезок===&lt;br /&gt;
Чтобы модифицировать карту, мы должны понять, где произошло изменение.&lt;br /&gt;
&lt;br /&gt;
Оно произошло в тех трапецоидах, которые пересек текущий отрезок, или можно сказать, что трапецоид с &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt;-ой итерации не будет в &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой только если его пересек отрезок.&lt;br /&gt;
&lt;br /&gt;
Пусть якобы есть множество трапецоидов &amp;lt;tex&amp;gt;\Delta_0, \Delta_1, \Delta_2 \ldots \Delta_k&amp;lt;/tex&amp;gt;, упорядоченное по &amp;lt;tex&amp;gt;s_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\Delta_{j+1}&amp;lt;/tex&amp;gt; {{---}} один из правых соседей &amp;lt;tex&amp;gt;\Delta_j&amp;lt;/tex&amp;gt;. Так же, при этом не сложно понять, каким соседом он является.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;\operatorname{rightp} \Delta_j&amp;lt;/tex&amp;gt; лежит выше &amp;lt;tex&amp;gt;s_i&amp;lt;/tex&amp;gt;, то сосед нижний и наоборот.&lt;br /&gt;
&lt;br /&gt;
Это значит, что, если мы знаем первый трапецоид, то мы можем найти остальные просто обходя по карте соседей справа.&lt;br /&gt;
&lt;br /&gt;
Чтобы найти первый трапецоид, нужно просто локализовать правый конец в текущей карте.&lt;br /&gt;
&lt;br /&gt;
===update===&lt;br /&gt;
Рассмотрим подробнее последние две части&lt;br /&gt;
&lt;br /&gt;
Есть два случая.&lt;br /&gt;
*Простой {{---}} отрезок не пересекает ни одного трапецоида, то есть целиком внутри.&lt;br /&gt;
&lt;br /&gt;
Тогда удаляем этот старый трапецоид и на его место ставим дерево из двух концов отрезка, отрезка и четырех образовавшихся трапецоидов.&lt;br /&gt;
&lt;br /&gt;
Важно не забыть правильно определить соседей новых трапецоидов.&lt;br /&gt;
&lt;br /&gt;
В случае, если какие-то трапецоиды выродятся в треугольники, будет не четыре новых трапецоида, а 2 или 3. Слава богу это не самая большая проблема.&lt;br /&gt;
&lt;br /&gt;
*Сложный {{---}} отрезок пересекает сразу несколько трапецоидов.&lt;br /&gt;
&lt;br /&gt;
Итак наш отрезок пересекает трапецоиды &amp;lt;tex&amp;gt;\Delta_0, \Delta_1, \Delta_2 ... \Delta_k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сначала добавляем вертикальные лучи из концов текущего отрезка. Это нужно, чтобы модифицировать &amp;lt;tex&amp;gt;\Delta_0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\Delta_k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Теперь мы должны удалить соответствующие листья и на их место поставить те новые, которые появились из-за изменения лучей.&lt;br /&gt;
&lt;br /&gt;
Дальше мы модифицуруем вертикальные лучи, которые пересекают текущий отрезок. Этот процесс происходит достаточно быстро, так мы храним много информацию об этих лучах.&lt;br /&gt;
&lt;br /&gt;
По-хорошему, то, как это происходит, просто ужасно и видеть этого не хочется. А все потому, что много что добавляет много новых узлов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Delta_0, \Delta_1, \Delta_2 \ldots \Delta_k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
==Случай коллизии==&lt;br /&gt;
Рассмотрим момент, когда мы мы строим карты. Мы должны добавить очередной отрезок.&lt;br /&gt;
&lt;br /&gt;
Предположим, левый конец отрезка лежит на одной вертикале с уже добавленной в карту точкой &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Скажем, что наша точка лежит правее, чем та, которая уже есть. В случае, если мы попали на уже созданный отрезок, мы скажем, что находимся, например, ниже его. &lt;br /&gt;
&lt;br /&gt;
Что при этом произойдет.&lt;br /&gt;
&lt;br /&gt;
*С геометрической точки зрения, появится ещё несколько трапецоидов, как в случае, если бы вновь добавленная точка была правее на &amp;lt;tex&amp;gt; \varepsilon \rightarrow 0&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
А значит, у трапецоида по прежнему не более двух правых соседей.&lt;br /&gt;
&lt;br /&gt;
*С точки зрения поисковой структуры мы по-прежнему можем локализоваться. По крайней мере, узел, соответствующий точке &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt; будет иметь правым сыном нашу точку.&lt;br /&gt;
&lt;br /&gt;
Итого, слова &amp;quot;трапецоидные карты просты отсутствие случаев&amp;quot; появляются именно отсюда, так как, казалось бы, неприятный случай будет прописан заменой &amp;lt;tex&amp;gt;\textless &amp;lt;/tex&amp;gt; &lt;br /&gt;
на &amp;lt;tex&amp;gt; \le &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Асимптотика==&lt;br /&gt;
===Запрос===&lt;br /&gt;
Предположим у нас есть запрос на локализацию точки &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt;. Время, затраченное, на этот запрос будет линейно зависеть от глубина графа. &lt;br /&gt;
&lt;br /&gt;
При добавлении в карту очередного отрезка(в дальнейшем, итерация алгоритма), глубина графа увеличивается максимум на 3. Из этого мы можем сделать простую оценку.&lt;br /&gt;
&lt;br /&gt;
Наибольшее время на запрос, которое мы можем потратить {{---}} &amp;lt;tex&amp;gt;3n&amp;lt;/tex&amp;gt;. Произойдет это в самом ужасном из самых ужасных случаев.&lt;br /&gt;
&lt;br /&gt;
Как говорилось раньше, отрезки мы добавляем в случайном порядке, а потому, редко будет самый ужасный случай и, с вероятностных точек зрения, время на запрос будет меньше.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим путь, пройденный точкой по графу. Каждый узел был создан на какой-то итерации цикла. Обозначим за &amp;lt;tex&amp;gt;X_i&amp;lt;/tex&amp;gt; количество узлов, созданных на итерации &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как никто не выбирал исходное множество отрезков и запрос &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;X_i&amp;lt;/tex&amp;gt; {{---}} рандомная величина, зависящая только от рандомного порядка добавления отрезков.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E[\sum^{n}_{i=1}X_i] = \sum^{n}_{i=1}E[X_i]&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как уже упоминалось, на каждой итерации добавляется не более 3 узлов, а значит &amp;lt;tex&amp;gt;X_i \leq 3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Считая, что &amp;lt;tex&amp;gt;P_i&amp;lt;/tex&amp;gt; {{---}} вероятность того, что существует узел, который встречается при нашем запросе, созданный на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой итерации.&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum^{n}_{i=1}E[X_i] &amp;lt;= \sum^{n}_{i=1}3P_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Начинаем оценивать &amp;lt;tex&amp;gt; P_i &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Что значит, что узел был создан на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой итерации и встретился при запросе &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt;?&lt;br /&gt;
&lt;br /&gt;
Это значит, что на &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt;-ой итерации мы локализовывали &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; в трапецоиде &amp;lt;tex&amp;gt;\Delta_q(i-1)&amp;lt;/tex&amp;gt;,а на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой итерации уже в трапецоиде &amp;lt;tex&amp;gt; \Delta_q(i) &amp;lt;/tex&amp;gt; и эти два трапецоида разные.&lt;br /&gt;
&lt;br /&gt;
То есть, после добавления непонятно чего в карту, трапецоид изменился.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;tex&amp;gt;P_i = P(\Delta_q(i) \ne \Delta_q(i - 1))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
  	&lt;br /&gt;
Если эти два трапеецоида не равны, значит на i-ой итерации трапецоид &amp;lt;tex&amp;gt;\Delta_q(i)&amp;lt;/tex&amp;gt; был одним из созданных при модификации.&lt;br /&gt;
&lt;br /&gt;
Заметим, что все трапецоиды, созданные на этой итерации, были смежны текущему отрезку(&amp;lt;tex&amp;gt;s_i&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Значит либо &amp;lt;tex&amp;gt;s_i = \operatorname{top} \Delta_i&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;\operatorname{bottom} \Delta_i&amp;lt;/tex&amp;gt;, либо концы &amp;lt;tex&amp;gt;s_i = \operatorname{leftp} \Delta_i&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;\operatorname{rightp} \Delta_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Зафиксируем множество отрезков на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой итерации. Тогда состояние трапецоидов никак не будет зависеть от порядка добавленных отрезков.&lt;br /&gt;
&lt;br /&gt;
Тогда, вероятность изменения трапецоида {{---}} это его вероятность исчезнуть, если удалится &amp;lt;tex&amp;gt;s_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда переходим, к &amp;lt;tex&amp;gt;\operatorname{top} \Delta_i&amp;lt;/tex&amp;gt; и т.п. так как мы уже говорили, что &amp;lt;tex&amp;gt;s_i&amp;lt;/tex&amp;gt; будет определенной стороной при навигации.&lt;br /&gt;
&lt;br /&gt;
Отрезки добавлялись рандомно, поэтому, в качестве &amp;lt;tex&amp;gt;s_i&amp;lt;/tex&amp;gt; мог быть любой отрезок из &amp;lt;tex&amp;gt;S_i&amp;lt;/tex&amp;gt;. А, тогда, вероятность для всех сторон &amp;lt;tex&amp;gt;\frac1i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Суммируем по всем 4 сторонам.&lt;br /&gt;
	&lt;br /&gt;
Таким образом &amp;lt;tex&amp;gt;P_i = P( \Delta_q(i) \ne \Delta_q(i - 1)) =  P( \Delta_q(i)  \in  \Delta_q(i - 1) ) \le \frac4i&amp;lt;/tex&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;tex&amp;gt;\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)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Память===&lt;br /&gt;
Заметим, что количество трапецоидов, как мы доказали раньше, равно &amp;lt;tex&amp;gt;\mathcal{O}(n)&amp;lt;/tex&amp;gt;, поэтому мы должны оценить количество узлов созданых на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой итерации.&lt;br /&gt;
	&lt;br /&gt;
А результирующее выражение для памяти тогда будет&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{Mem} = \mathcal{O}(n) + \sum^{n}_{i=1}&amp;lt;/tex&amp;gt; количество узлов созданное на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой итерации&lt;br /&gt;
	&lt;br /&gt;
Обозначив за &amp;lt;tex&amp;gt;k_i&amp;lt;/tex&amp;gt; количество узлов, созданное на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой итерации&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{Mem} = \mathcal{O}(n) + \sum^{n}_{i=1} E[k_i]&amp;lt;/tex&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
Используя вывод из предыдущей части получаем, что &amp;lt;tex&amp;gt;E[k_i] \le \frac{\mathcal{O}(i)}i = \mathcal{O}(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
А тогда &amp;lt;tex&amp;gt;\mathrm{Mem} = \mathcal{O}(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
Из этих двух выводов очевидно следует, что время построения карты равно &amp;lt;tex&amp;gt;\mathcal{O}(n \log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Реализация==&lt;br /&gt;
Здесь будут рассмотрены некоторые основные моменты реализации&lt;br /&gt;
Это только идеи, в коде все выглядит примерно в 50 раз хуже.(по количеству строк)&lt;br /&gt;
===Класс &amp;quot;трапецоид&amp;quot;===&lt;br /&gt;
 struct Trapezoid&lt;br /&gt;
   Trapezoid next&lt;br /&gt;
   Trapezoid up&lt;br /&gt;
   Trapezoid down&lt;br /&gt;
   Trapezoid end&lt;br /&gt;
   Segment top&lt;br /&gt;
   Segment bottom&lt;br /&gt;
   Point left&lt;br /&gt;
   Point right&lt;br /&gt;
&lt;br /&gt;
===Построение трапецоидной карты===&lt;br /&gt;
&lt;br /&gt;
 TrapezoidMap(S - segments)&lt;br /&gt;
   Строим оболочку(просто находим крайние точки множества отрезков по четырем направлениям)&lt;br /&gt;
   Строим рандомную перестановку отрезков&lt;br /&gt;
   for для всех&lt;br /&gt;
     ищем множество трапецоидов пересекаемых отрезком &amp;lt;tex&amp;gt;s_i&amp;lt;/tex&amp;gt;. //это специальная функция//&lt;br /&gt;
     Удаляем это множество из карты и добавляем новые узлы появившиеся из-за &amp;lt;tex&amp;gt;s_i&amp;lt;/tex&amp;gt; в поисковой структуре&lt;br /&gt;
     Аналогично для просто карты&lt;br /&gt;
&lt;br /&gt;
===Поиск трапецоидов, которых пересекает отрезок===&lt;br /&gt;
&lt;br /&gt;
 LookforTrapezoid(&amp;lt;tex&amp;gt;s_i&amp;lt;/tex&amp;gt; - segment)&lt;br /&gt;
   Запоминаем левый и правый конец &amp;lt;tex&amp;gt;s_i&amp;lt;/tex&amp;gt;  &lt;br /&gt;
   Делаем запрос на левый конец в карте.&lt;br /&gt;
   j &amp;lt;tex&amp;gt;\leftarrow&amp;lt;/tex&amp;gt; 0;&lt;br /&gt;
   while q &amp;lt;tex&amp;gt;\in&amp;lt;/tex&amp;gt; правый от rightp(трапецоид_j)&lt;br /&gt;
     do if rightp(трапецоид_j) над &amp;lt;tex&amp;gt;s_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
       then ставим трапецоид_(j+1) нижним правым соседом трапецоид_j.&lt;br /&gt;
       else ставим трапецоид_(j+1) верхним правым соседом трапецоид_j.&lt;br /&gt;
     j &amp;lt;tex&amp;gt;\leftarrow&amp;lt;/tex&amp;gt; j+1&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
[http://graphics.stanford.edu/courses/cs268-09-winter/  Lecture notes from stanford, Seidel]&lt;/div&gt;</summary>
		<author><name>109.188.220.108</name></author>	</entry>

	</feed>