<?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=91.108.28.29&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=91.108.28.29&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/91.108.28.29"/>
		<updated>2026-06-11T14:09:22Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=71311</id>
		<title>Алгоритмы и структуры данных</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=71311"/>
				<updated>2019-05-25T12:33:11Z</updated>
		
		<summary type="html">&lt;p&gt;91.108.28.29: /* Другие задачи */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Амортизационный анализ ==&lt;br /&gt;
* [[Амортизационный анализ]]&lt;br /&gt;
* [[Динамический массив]]&lt;br /&gt;
* [[Hashed Array Tree]]&amp;lt;tex&amp;gt;^\star&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;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
* [[List order maintenance]]&amp;lt;tex&amp;gt;^\star&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;
* [[Куча Бродала-Окасаки]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Система непересекающихся множеств ==&lt;br /&gt;
* [[СНМ (наивные реализации) | Наивные реализации]]&lt;br /&gt;
* [[СНМ (списки с весовой эвристикой) | Списки с весовой эвристикой]]&lt;br /&gt;
* [[СНМ(реализация с помощью леса корневых деревьев) | Реализация с помощью леса корневых деревьев]]&lt;br /&gt;
* [[СНМ с операцией удаления за О(1)]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Поисковые структуры данных]] ==&lt;br /&gt;
* [[Упорядоченное множество]]&lt;br /&gt;
* [[Дерево поиска, наивная реализация]]&lt;br /&gt;
* [[АВЛ-дерево]]&lt;br /&gt;
* [[2-3 дерево]]&lt;br /&gt;
* [[B-дерево]]&lt;br /&gt;
* [[B+-дерево]]&lt;br /&gt;
* [[Красно-черное дерево]]&lt;br /&gt;
* [[Декартово дерево]]&lt;br /&gt;
* [[Декартово дерево по неявному ключу]]&lt;br /&gt;
* [[Splay-дерево]]&lt;br /&gt;
* [[Взвешенное дерево]]&lt;br /&gt;
* [[Tango-дерево]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
* [[Рандомизированное бинарное дерево поиска]]&lt;br /&gt;
* [[Дерево ван Эмде Боаса]]&lt;br /&gt;
* [[Список с пропусками]]&lt;br /&gt;
* [[Fusion tree]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
* [[Сверхбыстрый цифровой бор]]&lt;br /&gt;
* [[Rope]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
* [[AA-дерево]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
* [[Техника частичного каскадирования]] &amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
* [[Centroid decomposition]] &amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Запросы на отрезках ==&lt;br /&gt;
&lt;br /&gt;
=== Корневая эвристика ===&lt;br /&gt;
* [[Статистики на отрезках. Корневая эвристика]]&lt;br /&gt;
* [[Корневая декомпозиция с операциями: get, insert, erase]]&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;
== Задача о наименьшем общем предке ==&lt;br /&gt;
* [[Сведение задачи LCA к задаче RMQ]]&lt;br /&gt;
* [[Сведение задачи RMQ к задаче LCA]]&lt;br /&gt;
* [[Метод двоичного подъема]]&lt;br /&gt;
* [[Решение RMQ с помощью разреженной таблицы]]&lt;br /&gt;
* [[Двумерная разреженная таблица]]&lt;br /&gt;
* [[Алгоритм Фарака-Колтона и Бендера]] (решение +/-1 RMQ с помощью метода четырех русских)&lt;br /&gt;
* [[Алгоритм Хьюи]]&lt;br /&gt;
* [[Heavy-light декомпозиция]]&lt;br /&gt;
* [[Алгоритм Шибера-Вишкина]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
* [[Алгоритм Тарьяна поиска LCA за O(1) в оффлайн]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
* [[Link-Cut Tree]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
* [[Rake-Compress деревья]]&amp;lt;tex&amp;gt;^\star&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;
* [[Quotient filter]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
* [[Универсальное семейство хеш-функций]]&lt;br /&gt;
* [[Расширяемое хеширование]]&amp;lt;tex&amp;gt;^\star&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;
* [[Сортировка Шелла]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
* [[Сортировка кучей]]&lt;br /&gt;
* [[Быстрая сортировка]]&lt;br /&gt;
* [[Сортировка слиянием]]&lt;br /&gt;
* [[Cортировка слиянием с использованием O(1) дополнительной памяти]]&lt;br /&gt;
* [[Терпеливая сортировка]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
* [[Timsort]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
* [[Smoothsort]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
* [[Теорема о нижней оценке для сортировки сравнениями]]&lt;br /&gt;
&lt;br /&gt;
=== Многопоточные сортировки ===&lt;br /&gt;
* [[Многопоточная сортировка слиянием]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
* [[PSRS-сортировка]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
=== Другие сортировки ===&lt;br /&gt;
* [[Поиск k-ой порядковой статистики]]&lt;br /&gt;
* [[Поиск k-ой порядковой статистики за линейное время]]&lt;br /&gt;
* [[Поиск k-ой порядковой статистики в двух массивах]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
* [[Сортировка подсчетом]]&lt;br /&gt;
* [[Цифровая сортировка]]&lt;br /&gt;
* [[Карманная сортировка]]&lt;br /&gt;
* [[Сортировка Хана]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
* [[Задача флага Нидерландов]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
* [[Блинная сортировка]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Сортирующие сети ==&lt;br /&gt;
* [[Сортирующие сети]]&lt;br /&gt;
* [[0-1 принцип | Проверка сети компараторов на то, что она сортирующая. 0-1 принцип]]&lt;br /&gt;
* [[Сортирующие сети для квадратичных сортировок]]&lt;br /&gt;
* [[Сортировочные сети с особыми свойствами]]&amp;lt;tex&amp;gt;^\star&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;^\star&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;^\star&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;
*[[Применение метода четырех русских в задачах ДП на примере задачи о НОП]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
*[[Задача об оптимальном префиксном коде с сохранением порядка. Монотонность точки разреза]]&lt;br /&gt;
*[[Meet-in-the-middle]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
*[[Convex hull trick]]&lt;br /&gt;
&lt;br /&gt;
=== Другие задачи ===&lt;br /&gt;
*[[Задача о расстоянии Дамерау-Левенштейна]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
*[[Задача о выводе в контекстно-свободной грамматике, алгоритм Кока-Янгера-Касами]]&lt;br /&gt;
*[[Задача о наибольшей подпоследовательности-палиндроме]]&lt;br /&gt;
*[[Задача о наибольшей общей возрастающей последовательности]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
*[[Задача о наибольшей общей палиндромной подпоследовательности]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
*[[Динамическое программирование по профилю]]&amp;lt;tex&amp;gt;^\star&amp;lt;/tex&amp;gt;&lt;br /&gt;
*[[Динамика по поддеревьям]]&lt;br /&gt;
*[[Level Ancestor problem]]&lt;br /&gt;
&lt;br /&gt;
==  Криптографические алгоритмы ==&lt;br /&gt;
*[[RSA]]&lt;br /&gt;
&lt;br /&gt;
== Связь между структурами данных ==&lt;br /&gt;
* [[Связь между структурами данных]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;/div&gt;</summary>
		<author><name>91.108.28.29</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Level_Ancestor_problem&amp;diff=71309</id>
		<title>Level Ancestor problem</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Level_Ancestor_problem&amp;diff=71309"/>
				<updated>2019-05-25T12:26:02Z</updated>
		
		<summary type="html">&lt;p&gt;91.108.28.29: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Задача о уровне предка''' — (англ. &amp;quot;Level Ancestor problem&amp;quot;) является задачей о превращении данного подвешенного дерева &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; в структуру данных, которая сможет определить предка любого узла на заданном расстоянии от корня дерева.&lt;br /&gt;
&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition = Дано подвешенное дерево &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; c &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами. Поступают запросы вида &amp;lt;tex&amp;gt;LA(v, k)&amp;lt;/tex&amp;gt;, для каждого из которых необходимо&lt;br /&gt;
найти предка вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, который находится на расстоянии &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; от корня дерева &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
== Использование Heavy-light декомпозиции ==&lt;br /&gt;
[[Файл:LevelAncestor.png|200px|thumb|right]]&lt;br /&gt;
Этот алгоритм базируется на различных способах [[Heavy-light декомпозиция | декомпозиции дерева]] (выберем heavy-light декомпозицию), из свойств этого разбиения следует,&lt;br /&gt;
что подняться на любую высоту из вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; мы можем за время &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Данное разбиение можно строить за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;, что дает нам алгоритм за &amp;lt;tex&amp;gt;\langle O(n), O(\log n) \rangle&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В данном примере поступает запрос LA(v, 2), на который алгоритм должен дать ответ h.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм лестниц ==&lt;br /&gt;
=== Longest path decomposition &amp;lt;ref&amp;gt;[https://www.mi.fu-berlin.de/en/inf/groups/abi/teaching/lectures/lectures_past/WS0910/V____Discrete_Mathematics_for_Bioinformatics__P1/material/scripts/treedecomposition1.pdf Longest path decomposition]&amp;lt;/ref&amp;gt;===&lt;br /&gt;
Это декомпозиция дерева, которая разбивает его на множество вершинно-непересекающихся путей, идущих из каждой вершины в ее ребенка с самым глубоким поддеревом.&lt;br /&gt;
Сделаем ее следующим образом: обойдем дерево с помощью обхода в глубину, пусть мы стоим в вершине&lt;br /&gt;
&amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, обойдем всех ее детей, добавив &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; в путь, идущий в самое глубокое поддерево,&lt;br /&gt;
т.е. в котором находится вершина с самой большой глубиной.&lt;br /&gt;
Для каждой вершины сохраним номер пути в который она входит.&lt;br /&gt;
&lt;br /&gt;
=== Ladder decomposition ===&lt;br /&gt;
Это улучшение Longest-path декомпозиции, позволяющее, как мы потом докажем, подниматься на любую высоту за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;. Выполним его следующим образом: увеличим каждый путь в два раза вверх, для каждого нового пути сохраним все входящие в него вершины,&lt;br /&gt;
а для каждой вершины сохраним ее номер в пути, в который она входит. Построение обычной longest-path декомпозиции займет у&lt;br /&gt;
нас &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; времени (обход в глубину), соответственно удлиннение каждого пути ухудшит асимптотику до  &amp;lt;tex&amp;gt;O(n \log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После этого посчитаем двоичные подъемы для каждой вершины за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;, что соответственно не ухудшит асимптотику.&lt;br /&gt;
&lt;br /&gt;
=== Псевдокод ===&lt;br /&gt;
&lt;br /&gt;
Пусть после этого нам пришел запрос LA(v, k).&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;p[i] [v]&amp;lt;/tex&amp;gt; — &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-тый двоичный подъем в предка вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;&lt;br /&gt;
*&amp;lt;tex&amp;gt;way[v]&amp;lt;/tex&amp;gt; — путь, проходящий через данную вершину&lt;br /&gt;
*&amp;lt;tex&amp;gt;num[v]&amp;lt;/tex&amp;gt; — номер данной вершины на пути&lt;br /&gt;
*&amp;lt;tex&amp;gt;ladder[p][i]&amp;lt;/tex&amp;gt; — возвращает &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-тую вершину на пути &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   '''function''' LA('''int''' v,'''int''' k):&lt;br /&gt;
      '''int''' n = h(v) ''&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// получаем глубину вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;''&lt;br /&gt;
      n = n - k;  ''&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// на столько необходимо подняться до ответа&amp;lt;/font&amp;gt;''&lt;br /&gt;
      i = &amp;lt;tex&amp;gt;\lfloor \log_2 n \rfloor&amp;lt;/tex&amp;gt;&lt;br /&gt;
      v = p[i][v]  ''&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// делаем максимально большой прыжок вверх&amp;lt;/font&amp;gt;''&lt;br /&gt;
      i = n - i  ''&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// на столько осталось еще подняться&amp;lt;/font&amp;gt;''&lt;br /&gt;
      '''return''' ladder[way[v]][num[v] - i] ''&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// так как теперь &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и ответ находятся на одном пути&amp;lt;/font&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
=== Доказательство корректности ===&lt;br /&gt;
Рассмотрим путь, на котором лежит вершина &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; до удвоения. Он длины хотя бы &amp;lt;tex&amp;gt;2^i&amp;lt;/tex&amp;gt;, так как мы точно знаем, что существует вершина потомок &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, расстояние до которого ровно &amp;lt;tex&amp;gt;2^i&amp;lt;/tex&amp;gt; (это вершина, из которой мы только что пришли). Значит, после удвоения этот путь стал длины хотя бы &amp;lt;tex&amp;gt;2^{i + 1}&amp;lt;/tex&amp;gt;, причем хотя бы &amp;lt;tex&amp;gt;2^i&amp;lt;/tex&amp;gt; вершин в нем  — предки &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Это означает, что вершина, которую мы ищем, находится на этом пути (иначе бы мы могли до этого прыгнуть еще на &amp;lt;tex&amp;gt;2^i&amp;lt;/tex&amp;gt; вверх). Так как мы знаем позицию &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; в этом пути, то нужную вершину мы можем найти за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, наш алгоритм работает за &amp;lt;tex&amp;gt;\langle O(n\log n), O(1)\rangle &amp;lt;/tex&amp;gt; времени и за &amp;lt;tex&amp;gt;O(n\log n)&amp;lt;/tex&amp;gt; памяти. Методом четырех русских данный метод можно улучшить до &amp;lt;tex&amp;gt;\langle O(n), O(1)\rangle &amp;lt;/tex&amp;gt; с помощью оптимизации предподсчета.&lt;br /&gt;
&lt;br /&gt;
==  The Macro-Micro-Tree Algorithm ==&lt;br /&gt;
В данном разделе мы докажем, что предподсчет предыдущего алгоритма можно улучшить до &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Для начала рассмотрим алгоритм &amp;lt;tex&amp;gt;\langle O(L\log n + n), O(1)\rangle &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; это количество листьев.&lt;br /&gt;
*С помощью обхода в глубину запомним по одному листу в ее поддереве для каждой вершины&lt;br /&gt;
*Воспользуемся алгоритмом лестниц, но будем выполнять предподсчет только для листьев.&lt;br /&gt;
Рассмотрим как можно улучшить данный алгоритм:&lt;br /&gt;
*Зададим некую функцию &amp;lt;tex&amp;gt;S(n) = \dfrac{1}{4} \log_2 n&amp;lt;/tex&amp;gt;&lt;br /&gt;
*Посчитаем размер поддерева для каждой вершины с помощью обхода в глубину, после чего удалим все вершины размер поддерева которых меньше чем  &amp;lt;tex&amp;gt;S(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*Забудем на время про удаленные поддеревья, для оставшегося дерева наш алгоритм работает за  &amp;lt;tex&amp;gt;\langle O(\dfrac{n}{S(n)} \log n + n), O(1)\rangle &amp;lt;/tex&amp;gt;. Получаем алгоритм &amp;lt;tex&amp;gt;\langle O(n), O(1) \rangle &amp;lt;/tex&amp;gt;. Для удаленных поддеревьев же выполним полный предподсчет: таких деревьев не более чем &amp;lt;tex&amp;gt;2^{2S(n)}&amp;lt;/tex&amp;gt;, что дает асимптотику предподсчета &amp;lt;tex&amp;gt;O(\sqrt{n} \log^2{n}) = o(n) = O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В итоге полученный алгоритм действительно работает за &amp;lt;tex&amp;gt;\langle O(n), O(1)\rangle &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;
Используя DFS посчитаем глубину каждой вершины дерева (это можно сделать за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;), после чего можем из вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; подняться до необходимой глубины вершины &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;,&lt;br /&gt;
что так же в худшем случае работает за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Получили алгоритм за &amp;lt;tex&amp;gt;\langle O(n), O(n) \rangle&amp;lt;/tex&amp;gt; времени и &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; памяти, где время ответа на&lt;br /&gt;
запрос можно улучшить до &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; c помощью [[Метод двоичного подъёма | предподсчета двоичных подъемов]]  ,&lt;br /&gt;
но тогда и время предподсчета в наивной реализации (посчитать подъемы для всех вершин) ухудшится до &amp;lt;tex&amp;gt;\langle O(n \log n),&lt;br /&gt;
O(\log n)\rangle &amp;lt;/tex&amp;gt; времени и &amp;lt;tex&amp;gt;O(n \log n)&amp;lt;/tex&amp;gt; памяти. Также альтернативой данным двум алгоритмам является полный предподсчет всех возможных запросов, что соответственно дает нам асимптотику &amp;lt;tex&amp;gt;\langle O(n^2), O(1)\rangle &amp;lt;/tex&amp;gt;времени и &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
Сравнение различных асимптотик из данной статьи:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;clear:right;&amp;quot; cellpadding=&amp;quot;10&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
!&lt;br /&gt;
| Предподсчет&lt;br /&gt;
| Ответ на запрос&lt;br /&gt;
| Память&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
!Обычный подъем до нужного уровня&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
!Полный предподсчет&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
!Двоичные подъемы&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(n \log n)&amp;lt;/tex&amp;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;&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
!Декомпозиция&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
!Алгоритм лестниц&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(n \log n)&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;O(n \log n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
!Macro-Micro-Tree Algorithm&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;||&amp;lt;tex&amp;gt;O(1)&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;
*[[Метод двоичного подъёма]]&lt;br /&gt;
*[[Heavy-light декомпозиция]]&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[https://www.cadmo.ethz.ch/education/lectures/HS18/SAADS/reports/5.pdf Level Ancestor problem simplified Cai Qi]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Level_ancestor_problem Wikipedia: LA]&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;/div&gt;</summary>
		<author><name>91.108.28.29</name></author>	</entry>

	</feed>