<?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=188.162.64.33&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=188.162.64.33&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/188.162.64.33"/>
		<updated>2026-05-14T17:50:58Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9B%D0%BE%D0%BA%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%B2_%D0%9F%D0%9F%D0%9B%D0%93_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BB%D0%BE%D1%81_(%D0%BF%D0%B5%D1%80%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B5_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D1%8F)&amp;diff=36020</id>
		<title>Локализация в ППЛГ методом полос (персистентные деревья)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9B%D0%BE%D0%BA%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%B2_%D0%9F%D0%9F%D0%9B%D0%93_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BB%D0%BE%D1%81_(%D0%BF%D0%B5%D1%80%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B5_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D1%8F)&amp;diff=36020"/>
				<updated>2014-01-25T03:38:16Z</updated>
		
		<summary type="html">&lt;p&gt;188.162.64.33: /* Источники */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ptready}}&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;
[[Файл:cgslabs.png|200px|thumb|right]]&lt;br /&gt;
Проведём через каждую вершину вертикальную прямую. Получим полосы (slabs). Пусть каждой полосе соответствует точка, через которую проведён левый край полосы. Будем хранить отсортированный массив &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;-координат, тогда за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;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;
&lt;br /&gt;
Один из способов сделать дерево частично персистентным — node-copying (или path-copying, в разных источниках по-разному). Храним массив корней дерева. Когда нам нужно изменить ноду, мы создаём в этом массиве новый корень, но его поля left и right совпадают с таковыми в предыдущем корне. Далее мы идём от корня к ноде, которую хотим изменить. Все вершины по пути мы «копируем» так же, как и корень, при этом у предка меняем соответствующий указатель на новый. После этого мы меняем нужную нам ноду. Таким образом, для такого дерева нам нужно &amp;lt;tex&amp;gt;O(n \log n)&amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
Можно усовершенствовать этот способ. Теперь в каждой ноде будет храниться номер версии и поля для ленивого изменения дерева: фиксированное количество запасных указателей left и right и номера версий для них. Когда мы хотим изменить ноду, вместо копирования записываем изменения в запасные указатели, если они ещё есть, иначе создаём новую ноду и соответственно исправляем её предка. Для поиска по версиям используем бинпоиск. Этот способ называется limited node copying, для него нужно O(n) памяти, потому что амортизированно за один апдейт копируем O(1) нод.&lt;br /&gt;
&lt;br /&gt;
===Локализация в полосе===&lt;br /&gt;
Воспользуемся сбалансированным частично персистентным деревом для хранения отрезков в полосах. Каждая полоса — это новая версия дерева.&lt;br /&gt;
&lt;br /&gt;
==Время и память==&lt;br /&gt;
На запрос нужно &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;, на препроцессинг — &amp;lt;tex&amp;gt;O(n \log n)&amp;lt;/tex&amp;gt;; памяти нужно &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
*Goodman, O'Rourke &amp;quot;Handbook of Discrete and Computational Geometry&amp;quot;, 2004 г., стр. 775-776&lt;br /&gt;
*Sarnak, Tarjan &amp;quot;Planar Point Location Using Persistent Search Trees&amp;quot;&lt;br /&gt;
*de Berg и компания, Computational Geometry, третье издание, стр. 122-123&lt;br /&gt;
*[http://wwwisg.cs.uni-magdeburg.de/ag/lehre/WS1213/GDS/slides/S12.pdf] Тут есть чуть подробнее про персистентные деревья&lt;/div&gt;</summary>
		<author><name>188.162.64.33</name></author>	</entry>

	</feed>