<?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=BoyCoder</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=BoyCoder"/>
		<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/BoyCoder"/>
		<updated>2026-08-18T17:38:45Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%9D%D0%9C_(%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_%D0%BB%D0%B5%D1%81%D0%B0_%D0%BA%D0%BE%D1%80%D0%BD%D0%B5%D0%B2%D1%8B%D1%85_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D0%B5%D0%B2)&amp;diff=24599</id>
		<title>СНМ (реализация с помощью леса корневых деревьев)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%9D%D0%9C_(%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_%D0%BB%D0%B5%D1%81%D0%B0_%D0%BA%D0%BE%D1%80%D0%BD%D0%B5%D0%B2%D1%8B%D1%85_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D0%B5%D0%B2)&amp;diff=24599"/>
				<updated>2012-06-09T14:37:12Z</updated>
		
		<summary type="html">&lt;p&gt;BoyCoder: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Реализация==&lt;br /&gt;
Каждое множество хранится в виде дерева. Элементы множества хранятся в узлах дерева. У каждого множества есть его представитель {{---}} один из элементов этого множества, он хранится в корне дерева. В каждом узле, кроме корня, хранится ссылка на &amp;quot;родителя&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
При объединении двух множеств, корень одного дерева подвешивается к другому (операция ''union''). Таким образом, чтобы определить, в каком множестве находится элемент достаточно пройтись по ссылкам по дереву вверх до корня (операция ''get'').&lt;br /&gt;
&lt;br /&gt;
Без использования дополнительных &amp;quot;улучшений&amp;quot;, такое дерево может выродиться в линейный список, где get будет работать за линейное время, и никакого выигрыша по сравнению с [[СНМ(наивные_реализации)|наивными реализацими]] не будет. Выигрыш в скорости можно получить, используя две эвристики: '''объединение по рангу''' (union by rank) и '''сжатие пути''' (path compression).&lt;br /&gt;
&lt;br /&gt;
===Объединение по рангу===&lt;br /&gt;
Эта эвристика аналогична [[СНМ(списки_с_весовой_эвристикой)|весовой эвристике у связных списков]]. Идея в том, чтобы при объединении подвешивать дерево с меньшей глубиной к дереву с большей. &lt;br /&gt;
&lt;br /&gt;
Вместо того, чтобы явно хранить высоту дерева, можно хранить его ранг, который по сути является некой верхней оценкой высоты дерева. У дерева, состоящего ровно из одного элемента ранг равен 1. При объединении дерево с меньшим рангом подвешивается к дереву с большим, и ранг объединенного дерева становится равным большему из этих двух рангов. Если ранги объединяемых деревьев равны, то не важно какое к какому дереву подвешивать, но ранг объединенного дерева следует делать большим на 1.&lt;br /&gt;
&lt;br /&gt;
===Сжатие пути===&lt;br /&gt;
Эта эвристика несколько модифицирует операцию ''get''. Операция get вызывается для элемента ''x'', проходит через несколько вершин и попадает в корень. Все пройденные в этом процессе вершины принадлежат тому же множеству, что и ''x''. Поэтому мы можем подвесить (изменить ссылки) эти вершины напрямую к корню дерева и, таким образом, уменьшить его высоту. При нерекурсивной реализации операция ''get'' становится двухпроходной.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
Для реализации СНМ будем поддерживать следующие массивы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p[x]&amp;lt;/tex&amp;gt; {{---}} массив &amp;quot;родителей&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;r[x]&amp;lt;/tex&amp;gt; {{---}} массив рангов.&lt;br /&gt;
====get====&lt;br /&gt;
 get(x)&lt;br /&gt;
    if p[x] != x&lt;br /&gt;
       p[x] = get(p[x])&lt;br /&gt;
    return p[x]&lt;br /&gt;
&lt;br /&gt;
====union====&lt;br /&gt;
 union(x, y)&lt;br /&gt;
    x = get(x)&lt;br /&gt;
    y = get(y)&lt;br /&gt;
    if x == y&lt;br /&gt;
       return;&lt;br /&gt;
    if r[x] == r[y]&lt;br /&gt;
       r[x]++&lt;br /&gt;
    if r[x] &amp;lt; r[y]&lt;br /&gt;
       p[x] = y&lt;br /&gt;
    else&lt;br /&gt;
       p[y] = x&lt;br /&gt;
&lt;br /&gt;
==Асимптотика==&lt;br /&gt;
:''см. также [[Анализ_реализации_с_ранговой_эвристикой|Анализ реализации с ранговой эвристикой]]''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|-&lt;br /&gt;
!Операция !! Истинное время !! Амортизированное время&lt;br /&gt;
|- style = &amp;quot;text-align = center&amp;quot;&lt;br /&gt;
| ''get''                  || &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;        ||  &amp;lt;tex&amp;gt;O(\alpha(m, n))&amp;lt;/tex&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| ''union''                || &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;            ||  &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
* m {{---}} общее количество операций&lt;br /&gt;
&lt;br /&gt;
* n {{---}} полное количество элементов&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;\alpha(m, n)&amp;lt;/tex&amp;gt; {{---}} функция, обратная к функции Аккермана (если &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; операций get и &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов).&lt;br /&gt;
&lt;br /&gt;
Докажем, что если глубина множества (т.е. его ранг) равна k, то в нем содержится как минимум &amp;lt;tex&amp;gt;2^k&amp;lt;/tex&amp;gt; элементов. Из этого свойства следует, что глубина множества с n элементами есть &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;, а значит и время работы операции get является логарифмическим.&lt;br /&gt;
&lt;br /&gt;
Будем доказывать данное свойство по индукции. Для k = 0, очевидно, в множестве содержится 1 вершина. Пусть для множеств ранга k - 1 свойство выполняется. Как следует из ранговой эвристики, множество ранга k может получиться только при подвешивании множества ранга k - 1 к множеству ранга k - 1. Но тогда из предположения индукции в новом множестве действительно будет &amp;lt;tex&amp;gt;2^k&amp;lt;/tex&amp;gt; вершин, что и требовалось доказать.&lt;br /&gt;
&lt;br /&gt;
===Функция Аккермана===&lt;br /&gt;
&lt;br /&gt;
Функция Аккермана определяется следующим рекуррентным соотношением для целых неотрицательных чисел &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A(m, n) = \begin{cases}&lt;br /&gt;
 2^n, &amp;amp; m = 1 \\&lt;br /&gt;
 2, &amp;amp; m &amp;gt; 1, n = 0 \\&lt;br /&gt;
 A(m - 1, A(m, n - 1)), &amp;amp; m &amp;gt; 1, n &amp;gt; 0&lt;br /&gt;
\end{cases} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таблица значений функции Аккермана:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|-&lt;br /&gt;
!&amp;lt;tex&amp;gt;m \backslash n&amp;lt;/tex&amp;gt; !! 0 !! 1 !! 2 !! 3 !! 4 !! 5&lt;br /&gt;
|- style = &amp;quot;text-align = center&amp;quot;&lt;br /&gt;
| 1 || 1 ||  2 || 4 || 8 || 16 || 32&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 2 || 4 || 16 || 65536 || &amp;lt;tex&amp;gt;2^{2^{16}}&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;2^{2^{2^{16}}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 2 || 16 || &amp;lt;tex&amp;gt;\underbrace{2^{2^{\cdot^{\cdot^{\cdot^2}}}}}_{17}&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\underbrace{2^{2^{\cdot^{\cdot^{\cdot^2}}}}}_{A(3, 2)}&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 2 || &amp;lt;tex&amp;gt;\underbrace{2^{2^{\cdot^{\cdot^{\cdot^2}}}}}_{17}&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Функция, обратная функции Аккермана &amp;lt;tex&amp;gt;\alpha(m, n)&amp;lt;/tex&amp;gt; равна минимальному &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; такому, что &amp;lt;tex&amp;gt;A \left (i, \left [\frac{m}{n} \right ] \right ) \geq \log n&amp;lt;/tex&amp;gt;. Как видно из таблицы значений для функции Аккермана, обратная функция для любых значений, которые могут возникнуть при решении прикладных задач, не превышает 4, то есть можно считать, что операция get выполняется за константное время.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Анализ реализации с ранговой эвристикой===&lt;br /&gt;
&lt;br /&gt;
Проведем анализ реализации с ранговой эвристикой, будем доказывать более слабую оценку(итерированный логарифм).&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt; a &amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt; union  &amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt; b &amp;lt;/tex&amp;gt; операций  &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt; b &amp;gt; a &amp;lt;/tex&amp;gt;).&lt;br /&gt;
Не теряя общности, будем считать, что &amp;lt;tex&amp;gt; union &amp;lt;/tex&amp;gt; принимает в качестве аргументов представителей,&lt;br /&gt;
то есть &amp;lt;tex&amp;gt; union(v_1,v_2) &amp;lt;/tex&amp;gt; заменяем на  &amp;lt;tex&amp;gt; union(get(v_1),get(v_2)) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Оценим стоимость операции &amp;lt;tex&amp;gt; get(v) &amp;lt;/tex&amp;gt;.  &lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt; R(v) &amp;lt;/tex&amp;gt; — ранг вершины, &amp;lt;tex&amp;gt;P(v)&amp;lt;/tex&amp;gt; — представитель множества, содержащего &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&amp;lt;tex&amp;gt; L(v) &amp;lt;/tex&amp;gt; — отец вершины,&lt;br /&gt;
&amp;lt;tex&amp;gt; K(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;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; R(P(v)) &amp;gt; R(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Из принципа работы функции &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; следует:&lt;br /&gt;
#&amp;lt;tex&amp;gt; R(L(v))&amp;gt;R(v) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Между  &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; P(v) &amp;lt;/tex&amp;gt; существует путь вида: &amp;lt;tex&amp;gt; v \rightarrow L(v) \rightarrow L(L(v)) \rightarrow \dots \rightarrow P(v) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Записав неравенство из первого пункта вдоль пути из второго пункта, получаем требуемое.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение &lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; R(v) = i \Rightarrow K(v) \ge 2^i &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем по индукции: &lt;br /&gt;
&lt;br /&gt;
Для 0 равенство очевидно.&lt;br /&gt;
Ранг вершины станет равным &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; при объединении поддеревьев ранга &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt;, следовательно:&lt;br /&gt;
&amp;lt;tex&amp;gt;K(v) \ge K(v_1) + K(v_2) \ge 2^{i-1}+2^{i-1} \ge 2^i &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; R(v) \le \log_2a &amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Количество вершин ранга &amp;lt;tex&amp;gt; i \le {a \over 2^i} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Амортизационная стоимость &amp;lt;tex&amp;gt; get = O(\log^{*}a)  &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим некоторое число &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Разобьем наши ребра  на три класса:&lt;br /&gt;
&lt;br /&gt;
#Ведут в корень или в сына корня.&lt;br /&gt;
#&amp;lt;tex&amp;gt; R(P(v)) \ge x^{R(v)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Все остальные.&lt;br /&gt;
&lt;br /&gt;
Обозначим эти классы &amp;lt;tex&amp;gt; T_1, T_2, T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Амортизационная стоимость &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
S =  {\sum_{get} \limits} ({\sum_{v:v \in get,v \in T_1} \limits 1}&lt;br /&gt;
+&lt;br /&gt;
{\sum_{v:v \in get,v \in T_2} \limits 1} + {\sum_{v: \in get,v \in T_3} \limits 1}  ) /  b &lt;br /&gt;
&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;  {v \in get } &amp;lt;/tex&amp;gt; означает, что ребро, начало которого находится в &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, было пройдено во время выполнения текущего &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt;. &lt;br /&gt;
Ребро &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;  эквивалентно вершине, в которой оно начинается.&lt;br /&gt;
&lt;br /&gt;
В силу того, что &amp;lt;tex&amp;gt;{\sum_{v:v \in get,v \in T_1} \limits 1} = O(1) &amp;lt;/tex&amp;gt; получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
S = O(1) +  {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_2} \limits} 1/b+ {\sum_{get} \limits} ~  {\sum_{v:v \in get,v \in T_3} \limits} 1 / b&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Во время &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; после прохождения K ребер из второго класса &amp;lt;tex&amp;gt; R(v_1) \ge  x^{x^{.^{.^{.^{x^{R(v)}}}}}} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Из выше сказанного и первого следствия второго утверждения получаем, что:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; {\sum_{v:v \in get,v \in T_2} \limits}  \le \log^*_x(\log_2a) = O(\log^*a)&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы &amp;lt;tex&amp;gt; \log^*_x(\log_2a) &amp;lt;/tex&amp;gt; существовал необходимо, чтобы &amp;lt;tex&amp;gt; x &amp;gt; e ^{ 1 /e } \approx 1,44 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сумму&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits} ~  {\sum_{v:v \in get,v \in T_3} \limits} 1/b&lt;br /&gt;
 &amp;lt; &lt;br /&gt;
 {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_3} \limits} 1/a &lt;br /&gt;
&amp;lt;/tex&amp;gt;. &amp;lt;/center&amp;gt; &lt;br /&gt;
Из первого утверждения и в силу использования сжатия путей следует,&lt;br /&gt;
что &amp;lt;tex&amp;gt; R(P(x))&amp;lt;/tex&amp;gt; cтрого увеличивается при переходе по ребру из &amp;lt;tex&amp;gt; T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Как максимум через &amp;lt;tex&amp;gt; x^{R(k)} &amp;lt;/tex&amp;gt; переходов ребро перестанет появляться в классе &amp;lt;tex&amp;gt; T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/a = {\sum_v \limits ~\sum_{get: in ~ this ~ get ~ v \in T_3} \limits  } &lt;br /&gt;
  1/a \le \sum_v \limits x^{R(v)} /a&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Из второго следствия второго утверждения следует:&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; &lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/a \le  \sum_{Rank=0}^{\log_2a} \limits {ax^{Rank} \over 2^{Rank} a}&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При  &amp;lt;tex&amp;gt; x &amp;lt; 2~&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/a&lt;br /&gt;
\le&lt;br /&gt;
\sum_{Rank=0}^{\log_2a} \limits {x^{Rank} \over 2^{Rank}}&lt;br /&gt;
\le&lt;br /&gt;
\sum_{Rank=0}^\infty \limits {x^{Rank} \over 2^{Rank}}&lt;br /&gt;
\le&lt;br /&gt;
{ 2 \over 2-x } = O(1)&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&amp;lt;/center&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итак &amp;lt;tex&amp;gt; S = O(1) + O(\log^*x) + O(1) = O(\log^*x) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
В силу того, что интервал &amp;lt;tex&amp;gt; (1,45...2) &amp;lt;/tex&amp;gt; не пустой, теорема доказана. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
* [http://habrahabr.ru/blogs/algorithm/104772/ Система непересекающихся множеств {{---}} описание этой реализации на habrahabr.ru]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/Функция_Аккермана  Функция Аккермана {{---}} Википедия]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* Томас Кормен, Чарльз Лейзерсон, Рональд Ривест, Клиффорд Штайн. '''Алгоритмы. Построение и анализ''' —  Вильямс, 2010. - 1296с. — ISBN 978-5-8459-0857-4, 0-07-013151-1.   (стр 589)&lt;/div&gt;</summary>
		<author><name>BoyCoder</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0,_%D0%B0%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=24593</id>
		<title>Дискретная математика, алгоритмы и структуры данных</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0,_%D0%B0%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=24593"/>
				<updated>2012-06-09T14:10:50Z</updated>
		
		<summary type="html">&lt;p&gt;BoyCoder: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
*[[Отношение порядка]]&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;
*[[Представление функции класса DM с помощью медианы]]&lt;br /&gt;
*[[Пороговая функция]]&lt;br /&gt;
&lt;br /&gt;
== Схемы из функциональных элементов ==&lt;br /&gt;
*[[Реализация булевой функции схемой из функциональных элементов]]&lt;br /&gt;
*[[Cумматор]]&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;
*[[Алгоритм LZW]]&lt;br /&gt;
*[[Алгоритмы LZ77 и LZ78]]&lt;br /&gt;
*[[Преобразование Барроуза-Уиллера]]&lt;br /&gt;
*[[Обратное преобразование Барроуза-Уиллера]]&lt;br /&gt;
*[[Преобразование MTF]]&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;
*[[Действие перестановки на набор из элементов, представление в виде циклов]]&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;
*[[Метод четырех русских для умножения матриц]]&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;
*[[Дисперсия случайной величины]]&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;
== Амортизационный анализ ==&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;
* [[СНМ (списки с весовой эвристикой) | Списки с весовой эвристикой]]&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;
* [[B-дерево]]&lt;br /&gt;
* [[Красно-черное дерево]]&lt;br /&gt;
* [[Декартово дерево]]&lt;br /&gt;
* [[Splay-дерево]]&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;
* [[Встречное дерево Фенвика]]&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;
* [[Cортировка слиянием с использованием O(1) дополнительной памяти]]&lt;br /&gt;
* [[Сортировка вставками]]&lt;br /&gt;
* [[Сортировка подсчетом]]&lt;br /&gt;
* [[Сортировка подсчетом сложных объектов]]&lt;br /&gt;
* [[Сортировка кучей]]&lt;br /&gt;
* [[Цифровая сортировка]]&lt;br /&gt;
* [[Поиск k-ой порядковой статистики]]&lt;br /&gt;
* [[Поиск k-й порядковой статистики за линейное время]]&lt;br /&gt;
* [[Теорема о нижней оценке для сортировки сравнениями]]&lt;br /&gt;
* [[Быстрая сортировка]]&lt;br /&gt;
&lt;br /&gt;
== Сортирующие сети ==&lt;br /&gt;
* [[Сортирующие сети]]&lt;br /&gt;
* [[0-1 принцип | Проверка сети компараторов на то, что она сортирующая. 0-1 принцип]]&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;
* [[Лемма о рукопожатиях]]&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;
* [[k-связность]]&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;
* [[Теорема Хватала]]&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;
* [[Непланарность K5 и K3,3|Непланарность &amp;lt;tex&amp;gt;K_5&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;K_{3,3}&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;
* [[Двудольные графы и раскраска в 2 цвета]]&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;
* [[Построение компонент вершинной двусвязности]]&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;
* [[Алгоритм A*]]&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;
&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;
== Задача о потоке минимальной стоимости ==&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;
* [[Наивный алгоритм поиска подстроки в строке]]&lt;br /&gt;
* [[Поиск подстроки в строке с использованием хеширования. Алгоритм Рабина-Карпа]]&lt;br /&gt;
* [[Поиск наибольшей общей подстроки двух строк с использованием хеширования]]&lt;br /&gt;
* [[Префикс-функция]]&lt;br /&gt;
* [[Алгоритм Кнута-Морриса-Пратта]]&lt;br /&gt;
* [[Z-функция]]&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;
&lt;br /&gt;
== Задача о наименьшем общем предке ==&lt;br /&gt;
* [[Метод двоичного подъема]]&lt;br /&gt;
* [[Сведение задачи LCA к задаче RMQ]]&lt;br /&gt;
* [[Решение RMQ с помощью разреженной таблицы]]&lt;br /&gt;
* [[Алгоритм Фарака-Колтона и Бендера]] (решение +/-1 RMQ с помощью метода четверых русских)&lt;br /&gt;
* [[Сведение задачи RMQ к задаче LCA]]&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;
* [[Граф замен для двух матроидов]]&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;
* [[1precpmtnrifmax|&amp;lt;tex&amp;gt;1 \mid prec, pmtn, r_i \mid f_{\max}&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
* [[QpmtnCmax|&amp;lt;tex&amp;gt;Q|pmtn|C_{max}&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
* [[QpmtnriLmax|&amp;lt;tex&amp;gt;Q|pmtn, r_{i}|L_{max}&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
* [[P2precpi1Lmax|&amp;lt;tex&amp;gt;P2 \mid prec, p_i = 1 \mid L_{\max}&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
* [[O2Cmax|&amp;lt;tex&amp;gt;O2 \mid \mid C_{max}&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
* [[PpmtnriLmax|&amp;lt;tex&amp;gt;P \mid pmtn, r_i \mid L_{max}&amp;lt;/tex&amp;gt;]]&lt;/div&gt;</summary>
		<author><name>BoyCoder</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%9D%D0%9C_(%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_%D0%BB%D0%B5%D1%81%D0%B0_%D0%BA%D0%BE%D1%80%D0%BD%D0%B5%D0%B2%D1%8B%D1%85_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D0%B5%D0%B2)&amp;diff=24592</id>
		<title>СНМ (реализация с помощью леса корневых деревьев)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%9D%D0%9C_(%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_%D0%BB%D0%B5%D1%81%D0%B0_%D0%BA%D0%BE%D1%80%D0%BD%D0%B5%D0%B2%D1%8B%D1%85_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D0%B5%D0%B2)&amp;diff=24592"/>
				<updated>2012-06-09T14:06:21Z</updated>
		
		<summary type="html">&lt;p&gt;BoyCoder: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Реализация==&lt;br /&gt;
Каждое множество хранится в виде дерева. Элементы множества хранятся в узлах дерева. У каждого множества есть его представитель {{---}} один из элементов этого множества, он хранится в корне дерева. В каждом узле, кроме корня, хранится ссылка на &amp;quot;родителя&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
При объединении двух множеств, корень одного дерева подвешивается к другому (операция ''union''). Таким образом, чтобы определить, в каком множестве находится элемент достаточно пройтись по ссылкам по дереву вверх до корня (операция ''get'').&lt;br /&gt;
&lt;br /&gt;
Без использования дополнительных &amp;quot;улучшений&amp;quot;, такое дерево может выродиться в линейный список, где get будет работать за линейное время, и никакого выигрыша по сравнению с [[СНМ(наивные_реализации)|наивными реализацими]] не будет. Выигрыш в скорости можно получить, используя две эвристики: '''объединение по рангу''' (union by rank) и '''сжатие пути''' (path compression).&lt;br /&gt;
&lt;br /&gt;
===Объединение по рангу===&lt;br /&gt;
Эта эвристика аналогична [[СНМ(списки_с_весовой_эвристикой)|весовой эвристике у связных списков]]. Идея в том, чтобы при объединении подвешивать дерево с меньшей глубиной к дереву с большей. &lt;br /&gt;
&lt;br /&gt;
Вместо того, чтобы явно хранить высоту дерева, можно хранить его ранг, который по сути является некой верхней оценкой высоты дерева. У дерева, состоящего ровно из одного элемента ранг равен 1. При объединении дерево с меньшим рангом подвешивается к дереву с большим, и ранг объединенного дерева становится равным большему из этих двух рангов. Если ранги объединяемых деревьев равны, то не важно какое к какому дереву подвешивать, но ранг объединенного дерева следует делать большим на 1.&lt;br /&gt;
&lt;br /&gt;
===Сжатие пути===&lt;br /&gt;
Эта эвристика несколько модифицирует операцию ''get''. Операция get вызывается для элемента ''x'', проходит через несколько вершин и попадает в корень. Все пройденные в этом процессе вершины принадлежат тому же множеству, что и ''x''. Поэтому мы можем подвесить (изменить ссылки) эти вершины напрямую к корню дерева и, таким образом, уменьшить его высоту. При нерекурсивной реализации операция ''get'' становится двухпроходной.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
Для реализации СНМ будем поддерживать следующие массивы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p[x]&amp;lt;/tex&amp;gt; {{---}} массив &amp;quot;родителей&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;r[x]&amp;lt;/tex&amp;gt; {{---}} массив рангов.&lt;br /&gt;
====get====&lt;br /&gt;
 get(x)&lt;br /&gt;
    if p[x] != x&lt;br /&gt;
       p[x] = get(p[x])&lt;br /&gt;
    return p[x]&lt;br /&gt;
&lt;br /&gt;
====union====&lt;br /&gt;
 union(x, y)&lt;br /&gt;
    x = get(x)&lt;br /&gt;
    y = get(y)&lt;br /&gt;
    if x == y&lt;br /&gt;
       return;&lt;br /&gt;
    if r[x] == r[y]&lt;br /&gt;
       r[x]++&lt;br /&gt;
    if r[x] &amp;lt; r[y]&lt;br /&gt;
       p[x] = y&lt;br /&gt;
    else&lt;br /&gt;
       p[y] = x&lt;br /&gt;
&lt;br /&gt;
==Асимптотика==&lt;br /&gt;
:''см. также [[Анализ_реализации_с_ранговой_эвристикой|Анализ реализации с ранговой эвристикой]]''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|-&lt;br /&gt;
!Операция !! Истинное время !! Амортизированное время&lt;br /&gt;
|- style = &amp;quot;text-align = center&amp;quot;&lt;br /&gt;
| ''get''                  || &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;        ||  &amp;lt;tex&amp;gt;O(\alpha(m, n))&amp;lt;/tex&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| ''union''                || &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;            ||  &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
* m {{---}} общее количество операций&lt;br /&gt;
&lt;br /&gt;
* n {{---}} полное количество элементов&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;\alpha(m, n)&amp;lt;/tex&amp;gt; {{---}} функция, обратная к функции Аккермана (если &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; операций get и &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов).&lt;br /&gt;
&lt;br /&gt;
Докажем, что если глубина множества (т.е. его ранг) равна k, то в нем содержится как минимум &amp;lt;tex&amp;gt;2^k&amp;lt;/tex&amp;gt; элементов. Из этого свойства следует, что глубина множества с n элементами есть &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;, а значит и время работы операции get является логарифмическим.&lt;br /&gt;
&lt;br /&gt;
Будем доказывать данное свойство по индукции. Для k = 0, очевидно, в множестве содержится 1 вершина. Пусть для множеств ранга k - 1 свойство выполняется. Как следует из ранговой эвристики, множество ранга k может получиться только при подвешивании множества ранга k - 1 к множеству ранга k - 1. Но тогда из предположения индукции в новом множестве действительно будет &amp;lt;tex&amp;gt;2^k&amp;lt;/tex&amp;gt; вершин, что и требовалось доказать.&lt;br /&gt;
&lt;br /&gt;
===Функция Аккермана===&lt;br /&gt;
&lt;br /&gt;
Функция Аккермана определяется следующим рекуррентным соотношением для целых неотрицательных чисел &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A(m, n) = \begin{cases}&lt;br /&gt;
 2^n, &amp;amp; m = 1 \\&lt;br /&gt;
 2, &amp;amp; m &amp;gt; 1, n = 0 \\&lt;br /&gt;
 A(m - 1, A(m, n - 1)), &amp;amp; m &amp;gt; 1, n &amp;gt; 0&lt;br /&gt;
\end{cases} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таблица значений функции Аккермана:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|-&lt;br /&gt;
!&amp;lt;tex&amp;gt;m \backslash n&amp;lt;/tex&amp;gt; !! 0 !! 1 !! 2 !! 3 !! 4 !! 5&lt;br /&gt;
|- style = &amp;quot;text-align = center&amp;quot;&lt;br /&gt;
| 1 || 1 ||  2 || 4 || 8 || 16 || 32&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 2 || 4 || 16 || 65536 || &amp;lt;tex&amp;gt;2^{2^{16}}&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;2^{2^{2^{16}}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 2 || 16 || &amp;lt;tex&amp;gt;\underbrace{2^{2^{\cdot^{\cdot^{\cdot^2}}}}}_{17}&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\underbrace{2^{2^{\cdot^{\cdot^{\cdot^2}}}}}_{A(3, 2)}&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 2 || &amp;lt;tex&amp;gt;\underbrace{2^{2^{\cdot^{\cdot^{\cdot^2}}}}}_{17}&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Функция, обратная функции Аккермана &amp;lt;tex&amp;gt;\alpha(m, n)&amp;lt;/tex&amp;gt; равна минимальному &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; такому, что &amp;lt;tex&amp;gt;A \left (i, \left [\frac{m}{n} \right ] \right ) \geq \log n&amp;lt;/tex&amp;gt;. Как видно из таблицы значений для функции Аккермана, обратная функция для любых значений, которые могут возникнуть при решении прикладных задач, не превышает 4, то есть можно считать, что операция get выполняется за константное время.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Анализ реализации с ранговой эвристикой===&lt;br /&gt;
&lt;br /&gt;
Проведем анализ реализации с ранговой эвристикой.&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt; a &amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt; union  &amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt; b &amp;lt;/tex&amp;gt; операций  &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt; b &amp;gt; a &amp;lt;/tex&amp;gt;).&lt;br /&gt;
Не теряя общности, будем считать, что &amp;lt;tex&amp;gt; union &amp;lt;/tex&amp;gt; принимает в качестве аргументов представителей,&lt;br /&gt;
то есть &amp;lt;tex&amp;gt; union(v_1,v_2) &amp;lt;/tex&amp;gt; заменяем на  &amp;lt;tex&amp;gt; union(get(v_1),get(v_2)) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Оценим стоимость операции &amp;lt;tex&amp;gt; get(v) &amp;lt;/tex&amp;gt;.  &lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt; R(v) &amp;lt;/tex&amp;gt; — ранг вершины, &amp;lt;tex&amp;gt;P(v)&amp;lt;/tex&amp;gt; — представитель множества, содержащего &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&amp;lt;tex&amp;gt; L(v) &amp;lt;/tex&amp;gt; — отец вершины,&lt;br /&gt;
&amp;lt;tex&amp;gt; K(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;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; R(P(v)) &amp;gt; R(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Из принципа работы функции &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; следует:&lt;br /&gt;
#&amp;lt;tex&amp;gt; R(L(v))&amp;gt;R(v) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Между  &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; P(v) &amp;lt;/tex&amp;gt; существует путь вида: &amp;lt;tex&amp;gt; v \rightarrow L(v) \rightarrow L(L(v)) \rightarrow \dots \rightarrow P(v) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Записав неравенство из первого пункта вдоль пути из второго пункта, получаем требуемое.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение &lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; R(v) = i \Rightarrow K(v) \ge 2^i &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем по индукции: &lt;br /&gt;
&lt;br /&gt;
Для 0 равенство очевидно.&lt;br /&gt;
Ранг вершины станет равным &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; при объединении поддеревьев ранга &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt;, следовательно:&lt;br /&gt;
&amp;lt;tex&amp;gt;K(v) \ge K(v_1) + K(v_2) \ge 2^{i-1}+2^{i-1} \ge 2^i &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; R(v) \le \log_2a &amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Количество вершин ранга &amp;lt;tex&amp;gt; i \le {a \over 2^i} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Амортизационная стоимость &amp;lt;tex&amp;gt; get = O(\log^{*}a)  &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим некоторое число &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Разобьем наши ребра  на три класса:&lt;br /&gt;
&lt;br /&gt;
#Ведут в корень или в сына корня.&lt;br /&gt;
#&amp;lt;tex&amp;gt; R(P(v)) \ge x^{R(v)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Все остальные.&lt;br /&gt;
&lt;br /&gt;
Обозначим эти классы &amp;lt;tex&amp;gt; T_1, T_2, T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Амортизационная стоимость &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
S =  {\sum_{get} \limits} ({\sum_{v:v \in get,v \in T_1} \limits 1}&lt;br /&gt;
+&lt;br /&gt;
{\sum_{v:v \in get,v \in T_2} \limits 1} + {\sum_{v: \in get,v \in T_3} \limits 1}  ) /  b &lt;br /&gt;
&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;  {v \in get } &amp;lt;/tex&amp;gt; означает, что ребро, начало которого находится в &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, было пройдено во время выполнения текущего &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt;. &lt;br /&gt;
Ребро &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;  эквивалентно вершине, в которой оно начинается.&lt;br /&gt;
&lt;br /&gt;
В силу того, что &amp;lt;tex&amp;gt;{\sum_{v:v \in get,v \in T_1} \limits 1} = O(1) &amp;lt;/tex&amp;gt; получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
S = O(1) +  {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_2} \limits} 1/b+ {\sum_{get} \limits} ~  {\sum_{v:v \in get,v \in T_3} \limits} 1 / b&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Во время &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; после прохождения K ребер из второго класса &amp;lt;tex&amp;gt; R(v_1) \ge  x^{x^{.^{.^{.^{x^{R(v)}}}}}} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Из выше сказанного и первого следствия второго утверждения получаем, что:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; {\sum_{v:v \in get,v \in T_2} \limits}  \le \log^*_x(\log_2a) = O(\log^*a)&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы &amp;lt;tex&amp;gt; \log^*_x(\log_2a) &amp;lt;/tex&amp;gt; существовал необходимо, чтобы &amp;lt;tex&amp;gt; x &amp;gt; e ^{ 1 /e } \approx 1,44 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сумму&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits} ~  {\sum_{v:v \in get,v \in T_3} \limits} 1/b&lt;br /&gt;
 &amp;lt; &lt;br /&gt;
 {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_3} \limits} 1/a &lt;br /&gt;
&amp;lt;/tex&amp;gt;. &amp;lt;/center&amp;gt; &lt;br /&gt;
Из первого утверждения и в силу использования сжатия путей следует,&lt;br /&gt;
что &amp;lt;tex&amp;gt; R(P(x))&amp;lt;/tex&amp;gt; cтрого увеличивается при переходе по ребру из &amp;lt;tex&amp;gt; T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Как максимум через &amp;lt;tex&amp;gt; x^{R(k)} &amp;lt;/tex&amp;gt; переходов ребро перестанет появляться в классе &amp;lt;tex&amp;gt; T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/a = {\sum_v \limits ~\sum_{get: in ~ this ~ get ~ v \in T_3} \limits  } &lt;br /&gt;
  1/a \le \sum_v \limits x^{R(v)} /a&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Из второго следствия второго утверждения следует:&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; &lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/a \le  \sum_{Rank=0}^{\log_2a} \limits {ax^{Rank} \over 2^{Rank} a}&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При  &amp;lt;tex&amp;gt; x &amp;lt; 2~&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/a&lt;br /&gt;
\le&lt;br /&gt;
\sum_{Rank=0}^{\log_2a} \limits {x^{Rank} \over 2^{Rank}}&lt;br /&gt;
\le&lt;br /&gt;
\sum_{Rank=0}^\infty \limits {x^{Rank} \over 2^{Rank}}&lt;br /&gt;
\le&lt;br /&gt;
{ 2 \over 2-x } = O(1)&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&amp;lt;/center&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итак &amp;lt;tex&amp;gt; S = O(1) + O(\log^*x) + O(1) = O(\log^*x) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
В силу того, что интервал &amp;lt;tex&amp;gt; (1,45...2) &amp;lt;/tex&amp;gt; не пустой, теорема доказана. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
* [http://habrahabr.ru/blogs/algorithm/104772/ Система непересекающихся множеств {{---}} описание этой реализации на habrahabr.ru]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/Функция_Аккермана  Функция Аккермана {{---}} Википедия]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* Томас Кормен, Чарльз Лейзерсон, Рональд Ривест, Клиффорд Штайн. '''Алгоритмы. Построение и анализ''' —  Вильямс, 2010. - 1296с. — ISBN 978-5-8459-0857-4, 0-07-013151-1.   (стр 589)&lt;/div&gt;</summary>
		<author><name>BoyCoder</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%9D%D0%9C_(%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_%D0%BB%D0%B5%D1%81%D0%B0_%D0%BA%D0%BE%D1%80%D0%BD%D0%B5%D0%B2%D1%8B%D1%85_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D0%B5%D0%B2)&amp;diff=24504</id>
		<title>СНМ (реализация с помощью леса корневых деревьев)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%9D%D0%9C_(%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_%D0%BB%D0%B5%D1%81%D0%B0_%D0%BA%D0%BE%D1%80%D0%BD%D0%B5%D0%B2%D1%8B%D1%85_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D0%B5%D0%B2)&amp;diff=24504"/>
				<updated>2012-06-09T06:34:04Z</updated>
		
		<summary type="html">&lt;p&gt;BoyCoder: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Реализация==&lt;br /&gt;
Каждое множество хранится в виде дерева. Элементы множества хранятся в узлах дерева. У каждого множества есть его представитель {{---}} один из элементов этого множества, он хранится в корне дерева. В каждом узле, кроме корня, хранится ссылка на &amp;quot;родителя&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
При объединении двух множеств, корень одного дерева подвешивается к другому (операция ''union''). Таким образом, чтобы определить, в каком множестве находится элемент достаточно пройтись по ссылкам по дереву вверх до корня (операция ''get'').&lt;br /&gt;
&lt;br /&gt;
Без использования дополнительных &amp;quot;улучшений&amp;quot;, такое дерево может выродиться в линейный список, где get будет работать за линейное время, и никакого выигрыша по сравнению с [[СНМ(наивные_реализации)|наивными реализацими]] не будет. Выигрыш в скорости можно получить, используя две эвристики: '''объединение по рангу''' (union by rank) и '''сжатие пути''' (path compression).&lt;br /&gt;
&lt;br /&gt;
===Объединение по рангу===&lt;br /&gt;
Эта эвристика аналогична [[СНМ(списки_с_весовой_эвристикой)|весовой эвристике у связных списков]]. Идея в том, чтобы при объединении подвешивать дерево с меньшей глубиной к дереву с большей. &lt;br /&gt;
&lt;br /&gt;
Вместо того, чтобы явно хранить высоту дерева, можно хранить его ранг, который по сути является некой верхней оценкой высоты дерева. У дерева, состоящего ровно из одного элемента ранг равен 1. При объединении дерево с меньшим рангом подвешивается к дереву с большим, и ранг объединенного дерева становится равным большему из этих двух рангов. Если ранги объединяемых деревьев равны, то не важно какое к какому дереву подвешивать, но ранг объединенного дерева следует делать большим на 1.&lt;br /&gt;
&lt;br /&gt;
===Сжатие пути===&lt;br /&gt;
Эта эвристика несколько модифицирует операцию ''get''. Операция get вызывается для элемента ''x'', проходит через несколько вершин и попадает в корень. Все пройденные в этом процессе вершины принадлежат тому же множеству, что и ''x''. Поэтому мы можем подвесить (изменить ссылки) эти вершины напрямую к корню дерева и, таким образом, уменьшить его высоту. При нерекурсивной реализации операция ''get'' становится двухпроходной.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
Для реализации СНМ будем поддерживать следующие массивы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p[x]&amp;lt;/tex&amp;gt; {{---}} массив &amp;quot;родителей&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;r[x]&amp;lt;/tex&amp;gt; {{---}} массив рангов.&lt;br /&gt;
====get====&lt;br /&gt;
 get(x)&lt;br /&gt;
    if p[x] != x&lt;br /&gt;
       p[x] = get(p[x])&lt;br /&gt;
    return p[x]&lt;br /&gt;
&lt;br /&gt;
====union====&lt;br /&gt;
 union(x, y)&lt;br /&gt;
    x = get(x)&lt;br /&gt;
    y = get(y)&lt;br /&gt;
    if x == y&lt;br /&gt;
       return;&lt;br /&gt;
    if r[x] == r[y]&lt;br /&gt;
       r[x]++&lt;br /&gt;
    if r[x] &amp;lt; r[y]&lt;br /&gt;
       p[x] = y&lt;br /&gt;
    else&lt;br /&gt;
       p[y] = x&lt;br /&gt;
&lt;br /&gt;
==Асимптотика==&lt;br /&gt;
:''см. также [[Анализ_реализации_с_ранговой_эвристикой|Анализ реализации с ранговой эвристикой]]''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|-&lt;br /&gt;
!Операция !! Истинное время !! Амортизированное время&lt;br /&gt;
|- style = &amp;quot;text-align = center&amp;quot;&lt;br /&gt;
| ''get''                  || &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;        ||  &amp;lt;tex&amp;gt;O(\alpha(m, n))&amp;lt;/tex&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| ''union''                || &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;            ||  &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
* m {{---}} общее количество операций&lt;br /&gt;
&lt;br /&gt;
* n {{---}} полное количество элементов&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;\alpha(m, n)&amp;lt;/tex&amp;gt; {{---}} функция, обратная к функции Аккермана (если &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; операций get и &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов).&lt;br /&gt;
&lt;br /&gt;
Докажем, что если глубина множества (т.е. его ранг) равна k, то в нем содержится как минимум &amp;lt;tex&amp;gt;2^k&amp;lt;/tex&amp;gt; элементов. Из этого свойства следует, что глубина множества с n элементами есть &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;, а значит и время работы операции get является логарифмическим.&lt;br /&gt;
&lt;br /&gt;
Будем доказывать данное свойство по индукции. Для k = 0, очевидно, в множестве содержится 1 вершина. Пусть для множеств ранга k - 1 свойство выполняется. Как следует из ранговой эвристики, множество ранга k может получиться только при подвешивании множества ранга k - 1 к множеству ранга k - 1. Но тогда из предположения индукции в новом множестве действительно будет &amp;lt;tex&amp;gt;2^k&amp;lt;/tex&amp;gt; вершин, что и требовалось доказать.&lt;br /&gt;
&lt;br /&gt;
===Функция Аккермана===&lt;br /&gt;
&lt;br /&gt;
Функция Аккермана определяется следующим рекуррентным соотношением для целых неотрицательных чисел &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A(m, n) = \begin{cases}&lt;br /&gt;
 2^n, &amp;amp; m = 1 \\&lt;br /&gt;
 2, &amp;amp; m &amp;gt; 1, n = 0 \\&lt;br /&gt;
 A(m - 1, A(m, n - 1)), &amp;amp; m &amp;gt; 1, n &amp;gt; 0&lt;br /&gt;
\end{cases} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таблица значений функции Аккермана:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border = 1&lt;br /&gt;
|-&lt;br /&gt;
!&amp;lt;tex&amp;gt;m \backslash n&amp;lt;/tex&amp;gt; !! 0 !! 1 !! 2 !! 3 !! 4 !! 5&lt;br /&gt;
|- style = &amp;quot;text-align = center&amp;quot;&lt;br /&gt;
| 1 || 1 ||  2 || 4 || 8 || 16 || 32&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 2 || 4 || 16 || 65536 || &amp;lt;tex&amp;gt;2^{2^{16}}&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;2^{2^{2^{16}}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 2 || 16 || &amp;lt;tex&amp;gt;\underbrace{2^{2^{\cdot^{\cdot^{\cdot^2}}}}}_{17}&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\underbrace{2^{2^{\cdot^{\cdot^{\cdot^2}}}}}_{A(3, 2)}&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 2 || &amp;lt;tex&amp;gt;\underbrace{2^{2^{\cdot^{\cdot^{\cdot^2}}}}}_{17}&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Функция, обратная функции Аккермана &amp;lt;tex&amp;gt;\alpha(m, n)&amp;lt;/tex&amp;gt; равна минимальному &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; такому, что &amp;lt;tex&amp;gt;A \left (i, \left [\frac{m}{n} \right ] \right ) \geq \log n&amp;lt;/tex&amp;gt;. Как видно из таблицы значений для функции Аккермана, обратная функция для любых значений, которые могут возникнуть при решении прикладных задач, не превышает 4, то есть можно считать, что операция get выполняется за константное время.&lt;br /&gt;
&lt;br /&gt;
===Анализ реализации с ранговой эвристикой===&lt;br /&gt;
&lt;br /&gt;
Проведем анализ реализации с ранговой эвристикой.&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt; union  &amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt; операций  &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt; m &amp;gt; n &amp;lt;/tex&amp;gt;).&lt;br /&gt;
Не теряя общности, будем считать, что &amp;lt;tex&amp;gt; union &amp;lt;/tex&amp;gt; принимает в качестве аргументов представителей,&lt;br /&gt;
то есть &amp;lt;tex&amp;gt; union(v_1,v_2) &amp;lt;/tex&amp;gt; заменяем на  &amp;lt;tex&amp;gt; union(get(v_1),get(v_2)) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Оценим стоимость операции &amp;lt;tex&amp;gt; get(v) &amp;lt;/tex&amp;gt;.  &lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt; R(v) &amp;lt;/tex&amp;gt; — ранг вершины, &amp;lt;tex&amp;gt;P(v)&amp;lt;/tex&amp;gt; — представитель множества, содержащего &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&amp;lt;tex&amp;gt; L(v) &amp;lt;/tex&amp;gt; — отец вершины,&lt;br /&gt;
&amp;lt;tex&amp;gt; K(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;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; R(P(v)) &amp;gt; R(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Из принципа работы функции &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; следует:&lt;br /&gt;
#&amp;lt;tex&amp;gt; R(L(v))&amp;gt;R(v) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Между  &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; P(v) &amp;lt;/tex&amp;gt; существует путь вида: &amp;lt;tex&amp;gt; v \rightarrow L(v) \rightarrow L(L(v)) \rightarrow \dots \rightarrow P(v) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Записав неравенство из первого пункта вдоль пути из второго пункта, получаем требуемое.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение &lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; R(v) = i \Rightarrow K(v) \ge 2^i &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем по индукции: &lt;br /&gt;
&lt;br /&gt;
Для 0 равенство очевидно.&lt;br /&gt;
Ранг вершины станет равным &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; при объединении поддеревьев ранга &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt;, следовательно:&lt;br /&gt;
&amp;lt;tex&amp;gt;K(v) \ge K(v_1) + K(v_2) \ge 2^{i-1}+2^{i-1} \ge 2^i &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; R(v) \le \log_2(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Количество вершин ранга &amp;lt;tex&amp;gt; i \le {n \over 2^i} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Амортизационная стоимость &amp;lt;tex&amp;gt; get = O(\log^{*}(n))  &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим некоторое число &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Разобьем наши ребра  на три класса:&lt;br /&gt;
&lt;br /&gt;
#Ведут в корень или в сына корня.&lt;br /&gt;
#&amp;lt;tex&amp;gt; R(P(v)) \ge x^{R(v)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Все остальные.&lt;br /&gt;
&lt;br /&gt;
Обозначим эти классы &amp;lt;tex&amp;gt; T_1, T_2, T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Амортизационная стоимость &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
S =  {\sum_{get} \limits} ({\sum_{v:v \in get,v \in T_1} \limits 1}&lt;br /&gt;
+&lt;br /&gt;
{\sum_{v:v \in get,v \in T2} \limits 1} + {\sum_{v: \in get,v \in T_3} \limits 1}  ) /  m &lt;br /&gt;
&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;  {v \in get } &amp;lt;/tex&amp;gt; означает, что ребро, начало которого находится в &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, было пройдено во время выполнения текущего &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt;. &lt;br /&gt;
Ребро &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;  эквивалентно вершине, в которой оно начинается.&lt;br /&gt;
&lt;br /&gt;
В силу того, что &amp;lt;tex&amp;gt;{\sum_{v:v \in get,v \in T_1} \limits 1} = O(1) &amp;lt;/tex&amp;gt; получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
S = O(1) +  {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_2} \limits} 1/m+ {\sum_{get} \limits} ~  {\sum_{v:v \in get,v \in T_3} \limits} 1 / m&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Во время &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; после прохождения K ребер из второго класса &amp;lt;tex&amp;gt; R(v_1) \ge  x^{x^{.^{.^{.^{x^{R(v)}}}}}} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Из выше сказанного и первого следствия второго утверждения получаем, что:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; {\sum_{v:v \in get,v \in T_2} \limits}  \le \log^*_x(\log_2(n)) = O(\log^*(n))&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы &amp;lt;tex&amp;gt; \log^*_x(\log_2(n)) &amp;lt;/tex&amp;gt; существовал необходимо, чтобы &amp;lt;tex&amp;gt; x &amp;gt; e ^{ 1 /e } \approx 1,44 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сумму&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits} ~  {\sum_{v:v \in get,v \in T_3} \limits} 1~/m&lt;br /&gt;
 &amp;lt; &lt;br /&gt;
 {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_3} \limits} 1/n &lt;br /&gt;
&amp;lt;/tex&amp;gt;. &amp;lt;/center&amp;gt; &lt;br /&gt;
Из первого утверждения и в силу использования сжатия путей следует,&lt;br /&gt;
что &amp;lt;tex&amp;gt; R(P(x))&amp;lt;/tex&amp;gt; cтрого увеличивается при переходе по ребру из &amp;lt;tex&amp;gt; T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Как максимум через &amp;lt;tex&amp;gt; x^{R(k)} &amp;lt;/tex&amp;gt; переходов ребро перестанет появляться в классе &amp;lt;tex&amp;gt; T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/n = {\sum_v \limits ~\sum_{get: in ~ this ~ get ~ v \in T_3} \limits  } &lt;br /&gt;
  1/n \le \sum_v \limits x^{R(v)} /n&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Из второго следствия второго утверждения следует:&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; &lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/n \le  \sum_{Rank=0}^{\log_2(n)} \limits {nx^{Rank} \over 2^{Rank} n}&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При  &amp;lt;tex&amp;gt; x &amp;lt; 2~&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T3} \limits} 1/n&lt;br /&gt;
\le&lt;br /&gt;
\sum_{Rank=0}^{\log_2(n)} \limits {x^{Rank} \over 2^{Rank}}&lt;br /&gt;
\le&lt;br /&gt;
\sum_{Rank=0}^\infty \limits {x^{Rank} \over 2^{Rank}}&lt;br /&gt;
\le&lt;br /&gt;
{ 2 \over 2-x } = O(1)&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&amp;lt;/center&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итак &amp;lt;tex&amp;gt; S = O(1) + O(\log^*(x)) + O(1) = O(\log^*(x)) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
В силу того, что интервал &amp;lt;tex&amp;gt; (1,45...2) &amp;lt;/tex&amp;gt; не пустой, теорема доказана. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
* [http://habrahabr.ru/blogs/algorithm/104772/ Система непересекающихся множеств {{---}} описание этой реализации на habrahabr.ru]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/Функция_Аккермана  Функция Аккермана {{---}} Википедия]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* Томас Кормен, Чарльз Лейзерсон, Рональд Ривест, Клиффорд Штайн. '''Алгоритмы. Построение и анализ''' —  Вильямс, 2010. - 1296с. — ISBN 978-5-8459-0857-4, 0-07-013151-1.   (стр 589)&lt;/div&gt;</summary>
		<author><name>BoyCoder</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D1%80%D0%B0%D0%BD%D0%B3%D0%BE%D0%B2%D0%BE%D0%B9_%D1%8D%D0%B2%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%BE%D0%B9&amp;diff=24085</id>
		<title>Анализ реализации с ранговой эвристикой</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D1%80%D0%B0%D0%BD%D0%B3%D0%BE%D0%B2%D0%BE%D0%B9_%D1%8D%D0%B2%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%BE%D0%B9&amp;diff=24085"/>
				<updated>2012-06-06T09:21:49Z</updated>
		
		<summary type="html">&lt;p&gt;BoyCoder: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Пусть  &amp;lt;tex&amp;gt; union(v_1,v_2) &amp;lt;/tex&amp;gt; — процедура объединения двух множеств, содержащих &amp;lt;tex&amp;gt; v_1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; v_2 &amp;lt;/tex&amp;gt;,&lt;br /&gt;
а &amp;lt;tex&amp;gt; get(v) &amp;lt;/tex&amp;gt; — поиск представителя множества, содержащего &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt; union  &amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt; операций  &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt; m &amp;gt; n &amp;lt;/tex&amp;gt;).&lt;br /&gt;
Не теряя общности, будем считать, что &amp;lt;tex&amp;gt; union &amp;lt;/tex&amp;gt; принимает в качестве аргументов представителей,&lt;br /&gt;
то есть &amp;lt;tex&amp;gt; union(v_1,v_2) &amp;lt;/tex&amp;gt; заменяем на  &amp;lt;tex&amp;gt; union(get(v_1),get(v_2)) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Оценим стоимость операции &amp;lt;tex&amp;gt; get(v) &amp;lt;/tex&amp;gt;.  &lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt; R(v) &amp;lt;/tex&amp;gt; — ранг вершины, &amp;lt;tex&amp;gt;P(v)&amp;lt;/tex&amp;gt; — представитель множества, содержащего &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&amp;lt;tex&amp;gt; L(v) &amp;lt;/tex&amp;gt; — отец вершины,&lt;br /&gt;
&amp;lt;tex&amp;gt; K(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;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; R(P(v)) &amp;gt; R(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Из принципа работы функции &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; следует:&lt;br /&gt;
#&amp;lt;tex&amp;gt; R(L(v))&amp;gt;R(v) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Между  &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; P(v) &amp;lt;/tex&amp;gt; существует путь вида: &amp;lt;tex&amp;gt; v \rightarrow L(v) \rightarrow L(L(v)) \rightarrow \dots \rightarrow P(v) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Записав неравенство из первого пункта вдоль пути из второго пункта, получаем требуемое.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение &lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; R(v) = i \Rightarrow K(v) \ge 2^i &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем по индукции: &lt;br /&gt;
&lt;br /&gt;
Для 0 равенство очевидно.&lt;br /&gt;
Ранг вершины станет равным &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; при объединении поддеревьев ранга &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt;, следовательно:&lt;br /&gt;
&amp;lt;tex&amp;gt;K(v) \ge K(v_1) + K(v_2) \ge 2^{i-1}+2^{i-1} \ge 2^i &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; R(v) \le \log_2(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Количество вершин ранга &amp;lt;tex&amp;gt; i \le {n \over 2^i} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Амортизационная стоимость &amp;lt;tex&amp;gt; get = O(\log^{*}(n))  &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим некоторое число &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Разобьем наши ребра  на три класса:&lt;br /&gt;
&lt;br /&gt;
#Ведут в корень или в сына корня.&lt;br /&gt;
#&amp;lt;tex&amp;gt; R(P(v)) \ge x^{R(v)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Все остальные.&lt;br /&gt;
&lt;br /&gt;
Обозначим эти классы &amp;lt;tex&amp;gt; T_1, T_2, T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Амортизационная стоимость &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
S =  {\sum_{get} \limits} ({\sum_{v:v \in get,v \in T_1} \limits 1}&lt;br /&gt;
+&lt;br /&gt;
{\sum_{v:v \in get,v \in T2} \limits 1} + {\sum_{v: \in get,v \in T_3} \limits 1}  ) /  m &lt;br /&gt;
&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;  {v \in get } &amp;lt;/tex&amp;gt; означает, что ребро, начало которого находится в &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, было пройдено во время выполнения текущего &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt;. &lt;br /&gt;
Ребро &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;  эквивалентно вершине, в которой оно начинается.&lt;br /&gt;
&lt;br /&gt;
В силу того, что &amp;lt;tex&amp;gt;{\sum_{v:v \in get,v \in T_1} \limits 1} = O(1) &amp;lt;/tex&amp;gt; получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
S = O(1) +  {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_2} \limits} 1/m+ {\sum_{get} \limits} ~  {\sum_{v:v \in get,v \in T_3} \limits} 1 / m&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Во время &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; после прохождения K ребер из второго класса &amp;lt;tex&amp;gt; R(v_1) \ge  x^{x^{.^{.^{.^{x^{R(v)}}}}}} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Из выше сказанного и первого следствия второго утверждения получаем, что:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; {\sum_{v:v \in get,v \in T_2} \limits}  \le \log^*_x(\log_2(n)) = O(\log^*(n))&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы &amp;lt;tex&amp;gt; \log^*_x(\log_2(n)) &amp;lt;/tex&amp;gt; существовал необходимо, чтобы &amp;lt;tex&amp;gt; x &amp;gt; e ^{ 1 /e } \approx 1,44 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сумму&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits} ~  {\sum_{v:v \in get,v \in T_3} \limits} 1~/m&lt;br /&gt;
 &amp;lt; &lt;br /&gt;
 {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_3} \limits} 1/n &lt;br /&gt;
&amp;lt;/tex&amp;gt;. &amp;lt;/center&amp;gt; &lt;br /&gt;
Из первого утверждения и в силу использования сжатия путей следует,&lt;br /&gt;
что &amp;lt;tex&amp;gt; R(P(x))&amp;lt;/tex&amp;gt; cтрого увеличивается при переходе по ребру из &amp;lt;tex&amp;gt; T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Как максимум через &amp;lt;tex&amp;gt; x^{R(k)} &amp;lt;/tex&amp;gt; переходов ребро перестанет появляться в классе &amp;lt;tex&amp;gt; T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/n = {\sum_v \limits ~\sum_{get: in ~ this ~ get ~ v \in T_3} \limits  } &lt;br /&gt;
  1/n \le \sum_v \limits x^{R(v)} /n&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Из второго следствия второго утверждения следует:&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; &lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/n \le  \sum_{Rank=0}^{\log_2(n)} \limits {nx^{Rank} \over 2^{Rank} n}&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При  &amp;lt;tex&amp;gt; x &amp;lt; 2~&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T3} \limits} 1/n&lt;br /&gt;
\le&lt;br /&gt;
\sum_{Rank=0}^{\log_2(n)} \limits {x^{Rank} \over 2^{Rank}}&lt;br /&gt;
\le&lt;br /&gt;
\sum_{Rank=0}^\infty \limits {x^{Rank} \over 2^{Rank}}&lt;br /&gt;
\le&lt;br /&gt;
{ 2 \over 2-x } = O(1)&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&amp;lt;/center&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итак &amp;lt;tex&amp;gt; S = O(1) + O(\log^*(x)) + O(1) = O(\log^*(x)) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
В силу того, что интервал &amp;lt;tex&amp;gt; (1,45...2) &amp;lt;/tex&amp;gt; не пустой, теорема доказана. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Iterated_logarithm Wikipedia -Iterated logarithm]&lt;/div&gt;</summary>
		<author><name>BoyCoder</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D1%80%D0%B0%D0%BD%D0%B3%D0%BE%D0%B2%D0%BE%D0%B9_%D1%8D%D0%B2%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%BE%D0%B9&amp;diff=24084</id>
		<title>Анализ реализации с ранговой эвристикой</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D1%80%D0%B0%D0%BD%D0%B3%D0%BE%D0%B2%D0%BE%D0%B9_%D1%8D%D0%B2%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%BE%D0%B9&amp;diff=24084"/>
				<updated>2012-06-06T09:17:10Z</updated>
		
		<summary type="html">&lt;p&gt;BoyCoder: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Пусть  &amp;lt;tex&amp;gt; union(v_1,v_2) &amp;lt;/tex&amp;gt; — процедура объединения двух множеств, содержащих &amp;lt;tex&amp;gt; v_1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; v_2 &amp;lt;/tex&amp;gt;,&lt;br /&gt;
а &amp;lt;tex&amp;gt; get(v) &amp;lt;/tex&amp;gt; — поиск представителя множества, содержащего &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt; union  &amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt; операций  &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt; m &amp;gt; n &amp;lt;/tex&amp;gt;).&lt;br /&gt;
Не теряя общности, будем считать, что &amp;lt;tex&amp;gt; union &amp;lt;/tex&amp;gt; принимает в качестве аргументов представителей,&lt;br /&gt;
то есть &amp;lt;tex&amp;gt; union(v_1,v_2) &amp;lt;/tex&amp;gt; заменяем на  &amp;lt;tex&amp;gt; union(get(v_1),get(v_2)) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Оценим стоимость операции &amp;lt;tex&amp;gt; get(v) &amp;lt;/tex&amp;gt;.  &lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt; R(v) &amp;lt;/tex&amp;gt; — ранг вершины, &amp;lt;tex&amp;gt;P(v)&amp;lt;/tex&amp;gt; — представитель множества, содержащего &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&amp;lt;tex&amp;gt; L(v) &amp;lt;/tex&amp;gt; — отец вершины,&lt;br /&gt;
&amp;lt;tex&amp;gt; K(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;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; R(P(v)) &amp;gt; R(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Из принципа работы функции &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; следует:&lt;br /&gt;
#&amp;lt;tex&amp;gt; R(L(v))&amp;gt;R(v) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Между  &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; P(v) &amp;lt;/tex&amp;gt; существует путь вида: &amp;lt;tex&amp;gt; v \rightarrow L(v) \rightarrow L(L(v)) \rightarrow \dots \rightarrow P(v) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Записав неравенство из первого пункта вдоль пути из второго пункта, получаем требуемое.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение &lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; R(v) = i \Rightarrow K(v) \ge 2^i &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем по индукции: &lt;br /&gt;
&lt;br /&gt;
Для 0 равенство очевидно.&lt;br /&gt;
Ранг вершины станет равным &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; при объединении поддеревьев ранга &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt;, следовательно:&lt;br /&gt;
&amp;lt;tex&amp;gt;K(v) \ge K(v_1) + K(v_2) \ge 2^{i-1}+2^{i-1} \ge 2^i &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; R(v) \le \log_2(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Количество вершин ранга &amp;lt;tex&amp;gt; i \le {n \over 2^i} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Амортизационная стоимость &amp;lt;tex&amp;gt; get = O(\log^{*}(n))  &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим некоторое число &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Разобьем наши ребра  на три класса:&lt;br /&gt;
&lt;br /&gt;
#Ведут в корень или в сына корня.&lt;br /&gt;
#&amp;lt;tex&amp;gt; R(P(v)) \ge x^{R(v)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Все остальные.&lt;br /&gt;
&lt;br /&gt;
Обозначим эти классы &amp;lt;tex&amp;gt; T_1, T_2, T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Амортизационная стоимость &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
S =  {\sum_{get} \limits} ({\sum_{v:v \in get,v \in T_1} \limits 1}&lt;br /&gt;
+&lt;br /&gt;
{\sum_{v:v \in get,v \in T2} \limits 1} + {\sum_{v: \in get,v \in T_3} \limits 1}  ) /  m &lt;br /&gt;
&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;  {v \in get } &amp;lt;/tex&amp;gt; означает, что ребро, начало которого находится в &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, было пройдено во время выполнения текущего &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt;. &lt;br /&gt;
Ребро &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;  эквивалентно вершине, в которой оно начинается.&lt;br /&gt;
&lt;br /&gt;
В силу того, что &amp;lt;tex&amp;gt;{\sum_{v:v \in get,v \in T_1} \limits 1} = O(1) &amp;lt;/tex&amp;gt; получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
S = O(1) +  {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_2} \limits} 1/m+ {\sum_{get} \limits} ~  {\sum_{v:v \in get,v \in T_3} \limits} 1 / m&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Во время &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; после прохождения K ребер из второго класса &amp;lt;tex&amp;gt; R(v_1) \ge  x^{x^{.^{.^{.^{x^{R(v)}}}}}} &amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Из выше сказанного и первого следствия второго утверждения получаем, что:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; {\sum_{v:v \in get,v \in T_2} \limits}  \le \log^*_x(\log_2(n)) = O(\log^*(n))&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы &amp;lt;tex&amp;gt; \log^*_x(\log_2(n)) &amp;lt;/tex&amp;gt; существовал необходимо, чтобы &amp;lt;tex&amp;gt; x &amp;gt; e ^{ 1 /e } \approx 1,44 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сумму&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits} ~  {\sum_{v:v \in get,v \in T_3} \limits} 1~/m&lt;br /&gt;
 &amp;lt; &lt;br /&gt;
 {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_3} \limits} 1/n &lt;br /&gt;
&amp;lt;/tex&amp;gt;. &amp;lt;/center&amp;gt; &lt;br /&gt;
Из первого утверждения и в силу использования сжатия путей следует,&lt;br /&gt;
что &amp;lt;tex&amp;gt; R(P(x))&amp;lt;/tex&amp;gt; cтрого увеличивается при переходе по ребру из &amp;lt;tex&amp;gt; T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Как максимум через &amp;lt;tex&amp;gt; x^{R(k)} &amp;lt;/tex&amp;gt; переходов ребро перестанет появляться в классе &amp;lt;tex&amp;gt; T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/n = {\sum_v \limits ~\sum_{get: in ~ this ~ get ~ v \in T_3} \limits  } &lt;br /&gt;
  1/n \le \sum_v \limits x^{R(v)} /n&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Из второго следствия второго утверждения следует&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; &lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/n \le  \sum_{Rank=0}^{\log_2(n)} \limits {nx^{Rank} \over 2^{Rank} n}&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При  &amp;lt;tex&amp;gt; x &amp;lt; 2~&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T3} \limits} 1/n&lt;br /&gt;
\le&lt;br /&gt;
\sum_{Rank=0}^{\log_2(n)} \limits {x^{Rank} \over 2^{Rank}}&lt;br /&gt;
\le&lt;br /&gt;
\sum_{Rank=0}^\infty \limits {x^{Rank} \over 2^{Rank}}&lt;br /&gt;
\le&lt;br /&gt;
{ 2 \over 2-x } = O(1)&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&amp;lt;/center&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итак &amp;lt;tex&amp;gt; S = O(1) + O(\log^*(x)) + O(1) = O(\log^*(x)) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
В силу того, что интервал &amp;lt;tex&amp;gt; (1,45...2) &amp;lt;/tex&amp;gt; не пустой, теорема доказана. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Iterated_logarithm Wikipedia -Iterated logarithm]&lt;/div&gt;</summary>
		<author><name>BoyCoder</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D1%80%D0%B0%D0%BD%D0%B3%D0%BE%D0%B2%D0%BE%D0%B9_%D1%8D%D0%B2%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%BE%D0%B9&amp;diff=24083</id>
		<title>Анализ реализации с ранговой эвристикой</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D1%80%D0%B0%D0%BD%D0%B3%D0%BE%D0%B2%D0%BE%D0%B9_%D1%8D%D0%B2%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%BE%D0%B9&amp;diff=24083"/>
				<updated>2012-06-06T09:16:12Z</updated>
		
		<summary type="html">&lt;p&gt;BoyCoder: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Пусть  &amp;lt;tex&amp;gt; union(v_1,v_2) &amp;lt;/tex&amp;gt; — процедура объединения двух множеств, содержащих &amp;lt;tex&amp;gt; v_1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; v_2 &amp;lt;/tex&amp;gt;,&lt;br /&gt;
а &amp;lt;tex&amp;gt; get(v) &amp;lt;/tex&amp;gt; — поиск представителя множества, содержащего &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt; union  &amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt; операций  &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt; m &amp;gt; n &amp;lt;/tex&amp;gt;).&lt;br /&gt;
Не теряя общности, будем считать, что &amp;lt;tex&amp;gt; union &amp;lt;/tex&amp;gt; принимает в качестве аргументов представителей,&lt;br /&gt;
то есть &amp;lt;tex&amp;gt; union(v_1,v_2) &amp;lt;/tex&amp;gt; заменяем на  &amp;lt;tex&amp;gt; union(get(v_1),get(v_2)) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Оценим стоимость операции &amp;lt;tex&amp;gt; get(v) &amp;lt;/tex&amp;gt;.  &lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt; R(v) &amp;lt;/tex&amp;gt; — ранг вершины, &amp;lt;tex&amp;gt;P(v)&amp;lt;/tex&amp;gt; — представитель множества, содержащего &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&amp;lt;tex&amp;gt; L(v) &amp;lt;/tex&amp;gt; — отец вершины,&lt;br /&gt;
&amp;lt;tex&amp;gt; K(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;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; R(P(v)) &amp;gt; R(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Из принципа работы функции &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; следует:&lt;br /&gt;
#&amp;lt;tex&amp;gt; R(L(v))&amp;gt;R(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
#Между  &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; P(v) &amp;lt;/tex&amp;gt; существует путь вида: &amp;lt;tex&amp;gt; v \rightarrow L(v) \rightarrow L(L(v)) \rightarrow \dots \rightarrow P(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
Записав неравенство из первого пункта вдоль пути из второго пункта, получаем требуемое.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение &lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; R(v) = i \Rightarrow K(v) \ge 2^i &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем по индукции: &lt;br /&gt;
&lt;br /&gt;
Для 0 равенство очевидно.&lt;br /&gt;
Ранг вершины станет равным &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; при объединении поддеревьев ранга &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt;, следовательно:&lt;br /&gt;
&amp;lt;tex&amp;gt;K(v) \ge K(v_1) + K(v_2) \ge 2^{i-1}+2^{i-1} \ge 2^i &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; R(v) \le \log_2(n) &amp;lt;/tex&amp;gt;&lt;br /&gt;
#Количество вершин ранга &amp;lt;tex&amp;gt; i \le {n \over 2^i} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Амортизационная стоимость &amp;lt;tex&amp;gt; get = O(\log^{*}(n))  &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим некоторое число &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Разобьем наши ребра  на три класса:&lt;br /&gt;
&lt;br /&gt;
#Ведут в корень или в сына корня.&lt;br /&gt;
#&amp;lt;tex&amp;gt; R(P(v)) \ge x^{R(v)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Все остальные.&lt;br /&gt;
&lt;br /&gt;
Обозначим эти классы &amp;lt;tex&amp;gt; T_1, T_2, T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Амортизационная стоимость &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
S =  {\sum_{get} \limits} ({\sum_{v:v \in get,v \in T_1} \limits 1}&lt;br /&gt;
+&lt;br /&gt;
{\sum_{v:v \in get,v \in T2} \limits 1} + {\sum_{v: \in get,v \in T_3} \limits 1}  ) /  m &lt;br /&gt;
&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;  {v \in get } &amp;lt;/tex&amp;gt; означает, что ребро, начало которого находится в &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, было пройдено во время выполнения текущего &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt;. &lt;br /&gt;
Ребро &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;  эквивалентно вершине, в которой оно начинается.&lt;br /&gt;
&lt;br /&gt;
В силу того, что &amp;lt;tex&amp;gt;{\sum_{v:v \in get,v \in T_1} \limits 1} = O(1) &amp;lt;/tex&amp;gt; получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
S = O(1) +  {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_2} \limits} 1/m+ {\sum_{get} \limits} ~  {\sum_{v:v \in get,v \in T_3} \limits} 1 / m&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Во время &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; после прохождения K ребер из второго класса &amp;lt;tex&amp;gt; R(v_1) \ge  x^{x^{.^{.^{.^{x^{R(v)}}}}}} &amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Из выше сказанного и первого следствия второго утверждения получаем, что:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; {\sum_{v:v \in get,v \in T_2} \limits}  \le \log^*_x(\log_2(n)) = O(\log^*(n))&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы &amp;lt;tex&amp;gt; \log^*_x(\log_2(n)) &amp;lt;/tex&amp;gt; существовал необходимо, чтобы &amp;lt;tex&amp;gt; x &amp;gt; e ^{ 1 /e } \approx 1,44 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сумму&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits} ~  {\sum_{v:v \in get,v \in T_3} \limits} 1~/m&lt;br /&gt;
 &amp;lt; &lt;br /&gt;
 {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_3} \limits} 1/n &lt;br /&gt;
&amp;lt;/tex&amp;gt;. &amp;lt;/center&amp;gt; &lt;br /&gt;
Из первого утверждения и в силу использования сжатия путей следует,&lt;br /&gt;
что &amp;lt;tex&amp;gt; R(P(x))&amp;lt;/tex&amp;gt; cтрого увеличивается при переходе по ребру из &amp;lt;tex&amp;gt; T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Как максимум через &amp;lt;tex&amp;gt; x^{R(k)} &amp;lt;/tex&amp;gt; переходов ребро перестанет появляться в классе &amp;lt;tex&amp;gt; T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/n = {\sum_v \limits ~\sum_{get: in ~ this ~ get ~ v \in T_3} \limits  } &lt;br /&gt;
  1/n \le \sum_v \limits x^{R(v)} /n&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Из второго следствия второго утверждения следует&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; &lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/n \le  \sum_{Rank=0}^{\log_2(n)} \limits {nx^{Rank} \over 2^{Rank} n}&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При  &amp;lt;tex&amp;gt; x &amp;lt; 2~&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T3} \limits} 1/n&lt;br /&gt;
\le&lt;br /&gt;
\sum_{Rank=0}^{\log_2(n)} \limits {x^{Rank} \over 2^{Rank}}&lt;br /&gt;
\le&lt;br /&gt;
\sum_{Rank=0}^\infty \limits {x^{Rank} \over 2^{Rank}}&lt;br /&gt;
\le&lt;br /&gt;
{ 2 \over 2-x } = O(1)&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&amp;lt;/center&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итак &amp;lt;tex&amp;gt; S = O(1) + O(\log^*(x)) + O(1) = O(\log^*(x)) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
В силу того, что интервал &amp;lt;tex&amp;gt; (1,45...2) &amp;lt;/tex&amp;gt; не пустой, теорема доказана. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Iterated_logarithm Wikipedia -Iterated logarithm]&lt;/div&gt;</summary>
		<author><name>BoyCoder</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D1%80%D0%B0%D0%BD%D0%B3%D0%BE%D0%B2%D0%BE%D0%B9_%D1%8D%D0%B2%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%BE%D0%B9&amp;diff=24082</id>
		<title>Анализ реализации с ранговой эвристикой</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D1%80%D0%B0%D0%BD%D0%B3%D0%BE%D0%B2%D0%BE%D0%B9_%D1%8D%D0%B2%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%BE%D0%B9&amp;diff=24082"/>
				<updated>2012-06-06T09:15:17Z</updated>
		
		<summary type="html">&lt;p&gt;BoyCoder: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Пусть  &amp;lt;tex&amp;gt; union(v_1,v_2) &amp;lt;/tex&amp;gt; — процедура объединения двух множеств, содержащих &amp;lt;tex&amp;gt; v_1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; v_2 &amp;lt;/tex&amp;gt;,&lt;br /&gt;
а &amp;lt;tex&amp;gt; get(v) &amp;lt;/tex&amp;gt; — поиск представителя множества, содержащего &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt; union  &amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt; операций  &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt; m &amp;gt; n &amp;lt;/tex&amp;gt;).&lt;br /&gt;
Не теряя общности, будем считать, что &amp;lt;tex&amp;gt; union &amp;lt;/tex&amp;gt; принимает в качестве аргументов представителей,&lt;br /&gt;
то есть &amp;lt;tex&amp;gt; union(v_1,v_2) &amp;lt;/tex&amp;gt; заменяем на  &amp;lt;tex&amp;gt; union(get(v_1),get(v_2)) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Оценим стоимость операции &amp;lt;tex&amp;gt; get(v) &amp;lt;/tex&amp;gt;.  &lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt; R(v) &amp;lt;/tex&amp;gt; — ранг вершины, &amp;lt;tex&amp;gt;P(v)&amp;lt;/tex&amp;gt; — представитель множества, содержащего &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&amp;lt;tex&amp;gt; L(v) &amp;lt;/tex&amp;gt; — отец вершины,&lt;br /&gt;
&amp;lt;tex&amp;gt; K(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;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; R(P(v)) &amp;gt; R(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Из принципа работы функции &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; следует:&lt;br /&gt;
#&amp;lt;tex&amp;gt; R(L(v))&amp;gt;R(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
#Между  &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; P(v) &amp;lt;/tex&amp;gt; существует путь вида: &amp;lt;tex&amp;gt; v \rightarrow L(v) \rightarrow L(L(v)) \rightarrow \dots \rightarrow P(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
Записав неравенство из первого пункта вдоль пути из второго пункта, получаем требуемое.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение &lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; R(v) = i \Rightarrow K(v) \ge 2^i &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем по индукции: &lt;br /&gt;
&lt;br /&gt;
Для 0 равенство очевидно.&lt;br /&gt;
Ранг вершины станет равным &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; при объединении поддеревьев ранга &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt;, следовательно:&lt;br /&gt;
&amp;lt;tex&amp;gt;K(v) \ge K(v_1) + K(v_2) \ge 2^{i-1}+2^{i-1} \ge 2^i &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; R(v) \le \log_2(n) &amp;lt;/tex&amp;gt;&lt;br /&gt;
#Количество вершин ранга &amp;lt;tex&amp;gt; i \le {n \over 2^i} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Амортизационная стоимость &amp;lt;tex&amp;gt; get = O(\log^{*}(n))  &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим некоторое число &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Разобьем наши ребра  на три класса:&lt;br /&gt;
&lt;br /&gt;
#Ведут в корень или в сына корня.&lt;br /&gt;
#&amp;lt;tex&amp;gt; R(P(v)) \ge x^{R(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
#Все остальные.&lt;br /&gt;
&lt;br /&gt;
Обозначим эти классы &amp;lt;tex&amp;gt; T_1, T_2, T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Амортизационная стоимость &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
S =  {\sum_{get} \limits} ({\sum_{v:v \in get,v \in T_1} \limits 1}&lt;br /&gt;
+&lt;br /&gt;
{\sum_{v:v \in get,v \in T2} \limits 1} + {\sum_{v: \in get,v \in T_3} \limits 1}  ) /  m &lt;br /&gt;
&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;  {v \in get } &amp;lt;/tex&amp;gt; означает, что ребро, начало которого находится в &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, было пройдено во время выполнения текущего &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt;. &lt;br /&gt;
Ребро &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;  эквивалентно вершине, в которой оно начинается.&lt;br /&gt;
&lt;br /&gt;
В силу того, что &amp;lt;tex&amp;gt;{\sum_{v:v \in get,v \in T_1} \limits 1} = O(1) &amp;lt;/tex&amp;gt; получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
S = O(1) +  {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_2} \limits} 1/m+ {\sum_{get} \limits} ~  {\sum_{v:v \in get,v \in T_3} \limits} 1 / m&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Во время &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; после прохождения K ребер из второго класса &amp;lt;tex&amp;gt; R(v_1) \ge  x^{x^{.^{.^{.^{x^{R(v)}}}}}} &amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Из выше сказанного и первого следствия второго утверждения получаем, что:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; {\sum_{v:v \in get,v \in T_2} \limits}  \le \log^*_x(\log_2(n)) = O(\log^*(n))&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы &amp;lt;tex&amp;gt; \log^*_x(\log_2(n)) &amp;lt;/tex&amp;gt; существовал необходимо, чтобы &amp;lt;tex&amp;gt; x &amp;gt; e ^{ 1 /e } \approx 1,44 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сумму&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits} ~  {\sum_{v:v \in get,v \in T_3} \limits} 1~/m&lt;br /&gt;
 &amp;lt; &lt;br /&gt;
 {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_3} \limits} 1/n &lt;br /&gt;
&amp;lt;/tex&amp;gt;. &amp;lt;/center&amp;gt; &lt;br /&gt;
Из первого утверждения и в силу использования сжатия путей следует,&lt;br /&gt;
что &amp;lt;tex&amp;gt; R(P(x))&amp;lt;/tex&amp;gt; cтрого увеличивается при переходе по ребру из &amp;lt;tex&amp;gt; T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Как максимум через &amp;lt;tex&amp;gt; x^{R(k)} &amp;lt;/tex&amp;gt; переходов ребро перестанет появляться в классе &amp;lt;tex&amp;gt; T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/n = {\sum_v \limits ~\sum_{get: in ~ this ~ get ~ v \in T_3} \limits  } &lt;br /&gt;
  1/n \le \sum_v \limits x^{R(v)} /n&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Из второго следствия второго утверждения следует&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; &lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/n \le  \sum_{Rank=0}^{\log_2(n)} \limits {nx^{Rank} \over 2^{Rank} n}&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При  &amp;lt;tex&amp;gt; x &amp;lt; 2~&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T3} \limits} 1/n&lt;br /&gt;
\le&lt;br /&gt;
\sum_{Rank=0}^{\log_2(n)} \limits {x^{Rank} \over 2^{Rank}}&lt;br /&gt;
\le&lt;br /&gt;
\sum_{Rank=0}^\infty \limits {x^{Rank} \over 2^{Rank}}&lt;br /&gt;
\le&lt;br /&gt;
{ 2 \over 2-x } = O(1)&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&amp;lt;/center&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итак &amp;lt;tex&amp;gt; S = O(1) + O(\log^*(x)) + O(1) = O(\log^*(x)) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
В силу того, что интервал &amp;lt;tex&amp;gt; (1,45...2) &amp;lt;/tex&amp;gt; не пустой, теорема доказана. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Iterated_logarithm Wikipedia -Iterated logarithm]&lt;/div&gt;</summary>
		<author><name>BoyCoder</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D1%80%D0%B0%D0%BD%D0%B3%D0%BE%D0%B2%D0%BE%D0%B9_%D1%8D%D0%B2%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%BE%D0%B9&amp;diff=24081</id>
		<title>Анализ реализации с ранговой эвристикой</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D1%80%D0%B0%D0%BD%D0%B3%D0%BE%D0%B2%D0%BE%D0%B9_%D1%8D%D0%B2%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%BE%D0%B9&amp;diff=24081"/>
				<updated>2012-06-06T09:10:20Z</updated>
		
		<summary type="html">&lt;p&gt;BoyCoder: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Пусть  &amp;lt;tex&amp;gt; union(v_1,v_2) &amp;lt;/tex&amp;gt; — процедура объединения двух множеств, содержащих &amp;lt;tex&amp;gt; v_1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; v_2 &amp;lt;/tex&amp;gt;,&lt;br /&gt;
а &amp;lt;tex&amp;gt; get(v) &amp;lt;/tex&amp;gt; — поиск представителя множества, содержащего &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt; union  &amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt; операций  &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt; m &amp;gt; n &amp;lt;/tex&amp;gt;).&lt;br /&gt;
Не теряя общности, будем считать, что &amp;lt;tex&amp;gt; union &amp;lt;/tex&amp;gt; принимает в качестве аргументов представителей,&lt;br /&gt;
то есть &amp;lt;tex&amp;gt; union(v_1,v_2) &amp;lt;/tex&amp;gt; заменяем на  &amp;lt;tex&amp;gt; union(get(v_1),get(v_2)) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Оценим стоимость операции &amp;lt;tex&amp;gt; get(v) &amp;lt;/tex&amp;gt;.  &lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt; R(v) &amp;lt;/tex&amp;gt; — ранг вершины, &amp;lt;tex&amp;gt;P(v)&amp;lt;/tex&amp;gt; — представитель множества, содержащего &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&amp;lt;tex&amp;gt; L(v) &amp;lt;/tex&amp;gt; — отец вершины,&lt;br /&gt;
&amp;lt;tex&amp;gt; K(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;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; R(P(v)) &amp;gt; R(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Из принципа работы функции &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; следует:&lt;br /&gt;
#&amp;lt;tex&amp;gt; R(L(v))&amp;gt;R(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
#Между  &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; P(v) &amp;lt;/tex&amp;gt; существует путь вида: &amp;lt;tex&amp;gt; v \rightarrow L(v) \rightarrow L(L(v)) \rightarrow \dots \rightarrow P(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
Записав неравенство из первого пункта вдоль пути из второго пункта, получаем требуемое.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение &lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; R(v) = i \Rightarrow K(v) \ge 2^i &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем по индукции: &lt;br /&gt;
&lt;br /&gt;
Для 0 равенство очевидно.&lt;br /&gt;
Ранг вершины станет равным &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; при объединении поддеревьев ранга &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt;, следовательно:&lt;br /&gt;
&amp;lt;tex&amp;gt;K(v) \ge K(v_1) + K(v_2) \ge 2^{i-1}+2^{i-1} \ge 2^i &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; R(v) \le \log_2(n) &amp;lt;/tex&amp;gt;&lt;br /&gt;
#Количество вершин ранга &amp;lt;tex&amp;gt; i \le {n \over 2^i} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Амортизационная стоимость &amp;lt;tex&amp;gt; get = O(\log^{*}(n))  &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим некоторое число &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Разобьем наши ребра  на три класса:&lt;br /&gt;
&lt;br /&gt;
#Ведут в корень или в сына корня.&lt;br /&gt;
#&amp;lt;tex&amp;gt; R(P(v)) \ge x^{R(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
#Все остальные.&lt;br /&gt;
&lt;br /&gt;
Обозначим эти классы &amp;lt;tex&amp;gt; T_1, T_2, T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Амортизационная стоимость &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
S =  {\sum_{get} \limits} ({\sum_{v:v \in get,v \in T_1} \limits 1}&lt;br /&gt;
+&lt;br /&gt;
{\sum_{v:v \in get,v \in T2} \limits 1} + {\sum_{v: \in get,v \in T_3} \limits 1}  ) /  m &lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;  {v \in get } &amp;lt;/tex&amp;gt; означает, что ребро, начало которого находится в &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, было пройдено во время выполнения текущего &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt;. &lt;br /&gt;
Ребро &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;  эквивалентно вершине, в которой оно начинается.&lt;br /&gt;
&lt;br /&gt;
В силу того, что &amp;lt;tex&amp;gt;{\sum_{v:v \in get,v \in T_1} \limits 1} = O(1) &amp;lt;/tex&amp;gt; получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
S = O(1) +  {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_2} \limits} 1/m+ {\sum_{get} \limits} ~  {\sum_{v:v \in get,v \in T_3} \limits} 1 / m&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Во время &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; после прохождения K ребер из второго класса &amp;lt;tex&amp;gt; R(v_1) \ge  x^{x^{.^{.^{.^{x^{R(v)}}}}}} &amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Из выше сказанного и первого следствия второго утверждения получаем, что:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; {\sum_{v:v \in get,v \in T_2} \limits}  \le \log^*_x(\log_2(n)) = O(\log^*(n))&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы &amp;lt;tex&amp;gt; \log^*_x(\log_2(n)) &amp;lt;/tex&amp;gt; существовал необходимо, чтобы &amp;lt;tex&amp;gt; x &amp;gt; e ^{ 1 /e } \approx 1,44 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сумму&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits} ~  {\sum_{v:v \in get,v \in T_3} \limits} 1~/m&lt;br /&gt;
 &amp;lt; &lt;br /&gt;
 {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_3} \limits} 1/n &lt;br /&gt;
&amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt; &lt;br /&gt;
Из первого утверждения и в силу использования сжатия путей следует,&lt;br /&gt;
что &amp;lt;tex&amp;gt; R(P(x))&amp;lt;/tex&amp;gt; cтрого увеличивается при переходе по ребру из &amp;lt;tex&amp;gt; T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Как максимум через &amp;lt;tex&amp;gt; x^{R(k)} &amp;lt;/tex&amp;gt; переходов ребро перестанет появляться в классе &amp;lt;tex&amp;gt; T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/n = {\sum_v \limits ~\sum_{get: in ~ this ~ get ~ v \in T_3} \limits  } &lt;br /&gt;
  1/n \le \sum_v \limits x^{R(v)} /n&lt;br /&gt;
&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Из второго следствия второго утверждения следует&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; &lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/n \le  \sum_{Rank=0}^{\log_2(n)} \limits {nx^{Rank} \over 2^{Rank} n}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При  &amp;lt;tex&amp;gt; x &amp;lt; 2~&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T3} \limits} 1/n&lt;br /&gt;
\le&lt;br /&gt;
\sum_{Rank=0}^{\log_2(n)} \limits {x^{Rank} \over 2^{Rank}}&lt;br /&gt;
\le&lt;br /&gt;
\sum_{Rank=0}^\infty \limits {x^{Rank} \over 2^{Rank}}&lt;br /&gt;
\le&lt;br /&gt;
{ 2 \over 2-x } = O(1)&lt;br /&gt;
&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итак &amp;lt;tex&amp;gt; S = O(1) + O(\log^*(x)) + O(1) = O(\log^*(x)) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
В силу того, что интервал &amp;lt;tex&amp;gt; (1,45...2) &amp;lt;/tex&amp;gt; не пустой, теорема доказана. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Iterated_logarithm Wikipedia -Iterated logarithm]&lt;/div&gt;</summary>
		<author><name>BoyCoder</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D1%80%D0%B0%D0%BD%D0%B3%D0%BE%D0%B2%D0%BE%D0%B9_%D1%8D%D0%B2%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%BE%D0%B9&amp;diff=24080</id>
		<title>Анализ реализации с ранговой эвристикой</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D1%80%D0%B0%D0%BD%D0%B3%D0%BE%D0%B2%D0%BE%D0%B9_%D1%8D%D0%B2%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%BE%D0%B9&amp;diff=24080"/>
				<updated>2012-06-06T09:02:28Z</updated>
		
		<summary type="html">&lt;p&gt;BoyCoder: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Пусть  &amp;lt;tex&amp;gt; union(v_1,v_2) &amp;lt;/tex&amp;gt; — процедура объединения двух множеств, содержащих &amp;lt;tex&amp;gt; v_1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; v_2 &amp;lt;/tex&amp;gt;,&lt;br /&gt;
а &amp;lt;tex&amp;gt; get(v) &amp;lt;/tex&amp;gt; — поиск представителя множества, содержащего &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt; union  &amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt; операций  &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt; m &amp;gt; n &amp;lt;/tex&amp;gt;).&lt;br /&gt;
Не теряя общности, будем считать, что &amp;lt;tex&amp;gt; union &amp;lt;/tex&amp;gt; принимает в качестве аргументов представителей,&lt;br /&gt;
то есть &amp;lt;tex&amp;gt; union(v_1,v_2) &amp;lt;/tex&amp;gt; заменяем на  &amp;lt;tex&amp;gt; union(get(v_1),get(v_2)) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Оценим стоимость операции &amp;lt;tex&amp;gt; get(v) &amp;lt;/tex&amp;gt;.  &lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt; R(v) &amp;lt;/tex&amp;gt; — ранг вершины, &amp;lt;tex&amp;gt;P(v)&amp;lt;/tex&amp;gt; — представитель множества, содержащего &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&amp;lt;tex&amp;gt; L(v) &amp;lt;/tex&amp;gt; — отец вершины,&lt;br /&gt;
&amp;lt;tex&amp;gt; K(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;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; R(P(v)) &amp;gt; R(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Из принципа работы функции &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; следует:&lt;br /&gt;
#&amp;lt;tex&amp;gt; R(L(v))&amp;gt;R(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
#Между  &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; P(v) &amp;lt;/tex&amp;gt; существует путь вида: &amp;lt;tex&amp;gt; v \rightarrow L(v) \rightarrow L(L(v)) \rightarrow \dots \rightarrow P(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
Записав неравенство из первого пункта вдоль пути из второго пункта, получаем требуемое.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение &lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; R(v) = i \Rightarrow K(v) \ge 2^i &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем по индукции: &lt;br /&gt;
&lt;br /&gt;
Для 0 равенство очевидно.&lt;br /&gt;
Ранг вершины станет равным &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; при объединении поддеревьев ранга &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt;, следовательно:&lt;br /&gt;
&amp;lt;tex&amp;gt;K(v) \ge K(v_1) + K(v_2) \ge 2^{i-1}+2^{i-1} \ge 2^i &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; R(v) \le \log_2(n) &amp;lt;/tex&amp;gt;&lt;br /&gt;
#Количество вершин ранга &amp;lt;tex&amp;gt; i \le {n \over 2^i} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Амортизационная стоимость &amp;lt;tex&amp;gt; get = O(\log^{*}(n))  &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим некоторое число &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Разобьем наши ребра  на три класса:&lt;br /&gt;
&lt;br /&gt;
#Ведут в корень или в сына корня.&lt;br /&gt;
#&amp;lt;tex&amp;gt; R(P(v)) \ge x^{R(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
#Все остальные.&lt;br /&gt;
&lt;br /&gt;
Обозначим эти классы &amp;lt;tex&amp;gt; T_1, T_2, T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Амортизационная стоимость &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
S =  {\sum_{get} \limits} ({\sum_{v:v \in get,v \in T_1} \limits 1}&lt;br /&gt;
+&lt;br /&gt;
{\sum_{v:v \in get,v \in T2} \limits 1} + {\sum_{v: \in get,v \in T_3} \limits 1}  ) /  m &lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;  {v \in get } &amp;lt;/tex&amp;gt; означает, что ребро, начало которого находится в &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, было пройдено во время выполнения текущего &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt;. &lt;br /&gt;
Ребро &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;  эквивалентно вершине, в которой оно начинается.&lt;br /&gt;
&lt;br /&gt;
В силу того, что &amp;lt;tex&amp;gt;{\sum_{v:v \in get,v \in T_1} \limits 1} = O(1) &amp;lt;/tex&amp;gt; получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
S = O(1) +  {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_2} \limits} 1/m+ {\sum_{get} \limits} ~  {\sum_{v:v \in get,v \in T_3} \limits} 1 / m&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Во время &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; после прохождения K ребер из второго класса &amp;lt;tex&amp;gt; R(v_1) \ge  x^{x^{.^{.^{.^{x^{R(v)}}}}}} &amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Из выше сказанного и первого следствия второго утверждения получаем, что:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; {\sum_{v:v \in get,v \in T_2} \limits}  \le \log^*_x(\log_2(n)) = O(\log^*(n))&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы &amp;lt;tex&amp;gt; \log^*_x(\log_2(n)) &amp;lt;/tex&amp;gt; существовал необходимо, чтобы &amp;lt;tex&amp;gt; x &amp;gt; e ^{ 1 /e } \approx 1,44 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сумму&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits} ~  {\sum_{v:v \in get,v \in T_3} \limits} 1~/m&lt;br /&gt;
 &amp;lt; &lt;br /&gt;
 {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_3} \limits} 1/n &lt;br /&gt;
&amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt; &lt;br /&gt;
Из первого утверждения и в силу использования сжатия путей следует,&lt;br /&gt;
что &amp;lt;tex&amp;gt; R(P(x))&amp;lt;/tex&amp;gt; cтрого увеличивается при переходе по ребру из &amp;lt;tex&amp;gt; T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Как максимум через &amp;lt;tex&amp;gt; x^{R(k)} &amp;lt;/tex&amp;gt; переходов ребро перестанет появляться в классе &amp;lt;tex&amp;gt; T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/n = {\sum_v \limits ~\sum_{get: in ~ this ~ get ~ v \in T_3} \limits  } &lt;br /&gt;
  1/n \le \sum_v \limits x^{R(v)} /n&lt;br /&gt;
&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Из второго следствия второго утверждения следует&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; &lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/n \le  \sum_{Rank=0}^{log_{2}(n)} \limits {nx^{Rank} \over 2^{Rank} n}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При  &amp;lt;tex&amp;gt; x &amp;lt; 2~&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T3} \limits} 1/n&lt;br /&gt;
\le&lt;br /&gt;
\sum_{Rank=0}^{log_{2}(n)} \limits {x^{Rank} \over 2^{Rank}}&lt;br /&gt;
\le&lt;br /&gt;
\sum_{Rank=0}^\infty \limits {x^{Rank} \over 2^{Rank}}&lt;br /&gt;
\le&lt;br /&gt;
{ 2 \over 2-x } = O(1)&lt;br /&gt;
&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итак &amp;lt;tex&amp;gt; S = O(1) + O(\log^*(x)) + O(1) = O(\log^*(x)) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
В силу того, что интервал &amp;lt;tex&amp;gt; (1,45...2) &amp;lt;/tex&amp;gt; не пустой, теорема доказана. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Iterated_logarithm Wikipedia -Iterated logarithm]&lt;/div&gt;</summary>
		<author><name>BoyCoder</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D1%80%D0%B0%D0%BD%D0%B3%D0%BE%D0%B2%D0%BE%D0%B9_%D1%8D%D0%B2%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%BE%D0%B9&amp;diff=24050</id>
		<title>Анализ реализации с ранговой эвристикой</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D1%80%D0%B0%D0%BD%D0%B3%D0%BE%D0%B2%D0%BE%D0%B9_%D1%8D%D0%B2%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%BE%D0%B9&amp;diff=24050"/>
				<updated>2012-06-05T11:41:26Z</updated>
		
		<summary type="html">&lt;p&gt;BoyCoder: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Пусть  &amp;lt;tex&amp;gt; union(v_1,v_2) &amp;lt;/tex&amp;gt; — процедура объединения двух множеств, содержащих &amp;lt;tex&amp;gt; v_1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; v_2 &amp;lt;/tex&amp;gt;,&lt;br /&gt;
а &amp;lt;tex&amp;gt; get(v) &amp;lt;/tex&amp;gt; — поиск представителя множества, содержащего &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt; union  &amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt; операций  &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt; m &amp;gt; n &amp;lt;/tex&amp;gt;).&lt;br /&gt;
Не теряя общности, будем считать, что &amp;lt;tex&amp;gt; union &amp;lt;/tex&amp;gt; принимает в качестве аргументов представителей,&lt;br /&gt;
то есть &amp;lt;tex&amp;gt; union(v_1,v_2) &amp;lt;/tex&amp;gt; заменяем на  &amp;lt;tex&amp;gt; union(get(v_1),get(v_2)) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Оценим стоимость операции &amp;lt;tex&amp;gt; get(v) &amp;lt;/tex&amp;gt;.  &lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt; R(v) &amp;lt;/tex&amp;gt; — ранг вершины, &amp;lt;tex&amp;gt;P(v)&amp;lt;/tex&amp;gt; — представитель множества, содержащего &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&amp;lt;tex&amp;gt; L(v) &amp;lt;/tex&amp;gt; — отец вершины,&lt;br /&gt;
&amp;lt;tex&amp;gt; K(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;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; R(P(v)) &amp;gt; R(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Из принципа работы функции &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; следует:&lt;br /&gt;
#&amp;lt;tex&amp;gt; R(L(v))&amp;gt;R(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
#Между  &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; P(v) &amp;lt;/tex&amp;gt; существует путь вида: &amp;lt;tex&amp;gt; v \rightarrow L(v) \rightarrow L(L(v)) \rightarrow \dots \rightarrow P(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
Записав неравенство из первого пункта вдоль пути из второго пункта, получаем требуемое.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение &lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; R(v) = i \Rightarrow K(v) \ge 2^i &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем по индукции: &lt;br /&gt;
&lt;br /&gt;
Для 0 равенство очевидно.&lt;br /&gt;
Ранг вершины станет равным &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; при объединении поддеревьев ранга &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt;, следовательно:&lt;br /&gt;
&amp;lt;tex&amp;gt;K(v) \ge K(v_1) + K(v_2) \ge 2^{i-1}+2^{i-1} \ge 2^i &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; R(v) \le \log_2(n) &amp;lt;/tex&amp;gt;&lt;br /&gt;
#Количество вершин ранга &amp;lt;tex&amp;gt; i \le {n \over 2^i} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Амортизационная стоимость &amp;lt;tex&amp;gt; get = O(\log^{*}(n))  &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим некоторое число &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Разобьем наши ребра  на три класса:&lt;br /&gt;
&lt;br /&gt;
#Ведут в корень или в сына корня.&lt;br /&gt;
#&amp;lt;tex&amp;gt; R(P(v)) \ge x^{R(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
#Все остальные.&lt;br /&gt;
&lt;br /&gt;
Обозначим эти классы &amp;lt;tex&amp;gt; T_1, T_2, T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Амортизационная стоимость &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
S =  {\sum_{get} \limits} ({\sum_{v:v \in get,v \in T_1} \limits 1}&lt;br /&gt;
+&lt;br /&gt;
{\sum_{v:v \in get,v \in T2} \limits 1} + {\sum_{v: \in get,v \in T_3} \limits 1}  ) /  m &lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;  {v \in get } &amp;lt;/tex&amp;gt; означает, что ребро, начало которого находится в &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, было пройдено во время выполнения текущего &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt;. &lt;br /&gt;
Ребро &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;  эквивалентно вершине, в которой оно начинается.&lt;br /&gt;
&lt;br /&gt;
В силу того, что &amp;lt;tex&amp;gt;{\sum_{v:v \in get,v \in T_1} \limits 1} = O(1) &amp;lt;/tex&amp;gt; получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
S = O(1) +  {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_2} \limits} 1/m+ {\sum_{get} \limits} ~  {\sum_{v:v \in get,v \in T_3} \limits} 1 / m&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Во время &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; после прохождения K ребер из второго класса &amp;lt;tex&amp;gt; R(v_1) \ge  x^{x^{.^{.^{.^{x^{R(v)}}}}}} &amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Из выше сказанного и первого следствия второго утверждения получаем, что:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; {\sum_{v:v \in get,v \in T_2} \limits}  \le \log^*_x(\log_2(n)) = O(\log^*(n))&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы &amp;lt;tex&amp;gt; \log^*_x &amp;lt;/tex&amp;gt; существовал необходимо, чтобы &amp;lt;tex&amp;gt; x &amp;gt; e ^{ 1 /e } \approx 1,44 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сумму&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits} ~  {\sum_{v:v \in get,v \in T_3} \limits} 1~/m&lt;br /&gt;
 &amp;lt; &lt;br /&gt;
 {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_3} \limits} 1/n &lt;br /&gt;
&amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt; &lt;br /&gt;
Из первого утверждения и в силу использования сжатия путей следует,&lt;br /&gt;
что &amp;lt;tex&amp;gt; R(P(x))&amp;lt;/tex&amp;gt; cтрого увеличивается при переходе по ребру из &amp;lt;tex&amp;gt; T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Как максимум через &amp;lt;tex&amp;gt; x^{R(k)} &amp;lt;/tex&amp;gt; переходов ребро перестанет появляться в классе &amp;lt;tex&amp;gt; T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/n = {\sum_v \limits ~\sum_{get: in ~ this ~ get ~ v \in T_3} \limits  } &lt;br /&gt;
  1/n \le \sum_v \limits x^{R(v)} /n&lt;br /&gt;
&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Из второго следствия второго утверждения следует&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; &lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/n \le  \sum_{Rank=0}^{log_{2}(n)} \limits {nx^{Rank} \over 2^{Rank} n}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При  &amp;lt;tex&amp;gt; x &amp;lt; 2~&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T3} \limits} 1/n&lt;br /&gt;
\le&lt;br /&gt;
\sum_{Rank=0}^{log_{2}(n)} \limits {x^{Rank} \over 2^{Rank}}&lt;br /&gt;
\le&lt;br /&gt;
\sum_{Rank=0}^\infty \limits {x^{Rank} \over 2^{Rank}}&lt;br /&gt;
\le&lt;br /&gt;
{ 2 \over 2-x } = O(1)&lt;br /&gt;
&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;.   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итак &amp;lt;tex&amp;gt; S = O(1) + O(\log^*(x)) + O(1) = O(\log^*(x)) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
В силу того, что интервал &amp;lt;tex&amp;gt; (1,45...2) &amp;lt;/tex&amp;gt; не пустой, теорема доказана. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Iterated_logarithm Wikipedia -Iterated logarithm]&lt;/div&gt;</summary>
		<author><name>BoyCoder</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D1%80%D0%B0%D0%BD%D0%B3%D0%BE%D0%B2%D0%BE%D0%B9_%D1%8D%D0%B2%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%BE%D0%B9&amp;diff=24048</id>
		<title>Анализ реализации с ранговой эвристикой</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D1%80%D0%B0%D0%BD%D0%B3%D0%BE%D0%B2%D0%BE%D0%B9_%D1%8D%D0%B2%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%BE%D0%B9&amp;diff=24048"/>
				<updated>2012-06-05T11:30:33Z</updated>
		
		<summary type="html">&lt;p&gt;BoyCoder: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Пусть  &amp;lt;tex&amp;gt; union(v_1,v_2) &amp;lt;/tex&amp;gt; — процедура объединения двух множеств, содержащих &amp;lt;tex&amp;gt; v_1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; v_2 &amp;lt;/tex&amp;gt;,&lt;br /&gt;
а &amp;lt;tex&amp;gt; get(v) &amp;lt;/tex&amp;gt; — поиск представителя множества, содержащего &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt; union  &amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt; операций  &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt; m &amp;gt; n &amp;lt;/tex&amp;gt;).&lt;br /&gt;
Не теряя общности, будем считать, что &amp;lt;tex&amp;gt; union &amp;lt;/tex&amp;gt; принимает в качестве аргументов представителей,&lt;br /&gt;
то есть &amp;lt;tex&amp;gt; union(v_1,v_2) &amp;lt;/tex&amp;gt; заменяем на  &amp;lt;tex&amp;gt; union(get(v_1),get(v_2)) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Оценим стоимость операции &amp;lt;tex&amp;gt; get(v) &amp;lt;/tex&amp;gt;.  &lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt; R(v) &amp;lt;/tex&amp;gt; — ранг вершины, &amp;lt;tex&amp;gt;P(v)&amp;lt;/tex&amp;gt; — представитель множества, содержащего &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&amp;lt;tex&amp;gt; L(v) &amp;lt;/tex&amp;gt; — отец вершины,&lt;br /&gt;
&amp;lt;tex&amp;gt; K(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;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; R(P(v)) &amp;gt; R(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Из принципа работы функции &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; следует:&lt;br /&gt;
#&amp;lt;tex&amp;gt; R(L(v))&amp;gt;R(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
#Между  &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; P(v) &amp;lt;/tex&amp;gt; существует путь вида: &amp;lt;tex&amp;gt; v \rightarrow L(v) \rightarrow L(L(v)) \rightarrow \dots \rightarrow P(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
Записав неравенство из первого пункта вдоль пути из второго пункта, получаем требуемое.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение &lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; R(v) = i \Rightarrow K(v) \ge 2^i &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем по индукции: &lt;br /&gt;
&lt;br /&gt;
Для 0 равенство очевидно.&lt;br /&gt;
Ранг вершины станет равным &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; при объединении поддеревьев ранга &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt;, следовательно:&lt;br /&gt;
&amp;lt;tex&amp;gt;K(v) \ge K(v_1) + K(v_2) \ge 2^{i-1}+2^{i-1} \ge 2^i &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; R(v) \le \log_2(n) &amp;lt;/tex&amp;gt;&lt;br /&gt;
#Количество вершин ранга &amp;lt;tex&amp;gt; i \le {n \over 2^i} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Амортизационная стоимость &amp;lt;tex&amp;gt; get = O(\log^{*}(n))  &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим некоторое число &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Разобьем наши ребра  на три класса:&lt;br /&gt;
&lt;br /&gt;
#Ведут в корень или в сына корня.&lt;br /&gt;
#&amp;lt;tex&amp;gt; R(P(v)) \ge x^{R(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
#Все остальные.&lt;br /&gt;
&lt;br /&gt;
Обозначим эти классы &amp;lt;tex&amp;gt; T_1, T_2, T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Амортизационная стоимость &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
S =  {\sum_{get} \limits} ({\sum_{v:v \in get,v \in T_1} \limits 1}&lt;br /&gt;
+&lt;br /&gt;
{\sum_{v:v \in get,v \in T2} \limits 1} + {\sum_{v: \in get,v \in T_3} \limits 1}  ) /  m &lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;  {v \in get } &amp;lt;/tex&amp;gt; означает, что ребро, начало которого находится в &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, было пройдено во время выполнения текущего &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt;. &lt;br /&gt;
Ребро &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;  эквивалентно вершине, в которой оно начинается.&lt;br /&gt;
&lt;br /&gt;
В силу того, что &amp;lt;tex&amp;gt;{\sum_{v:v \in get,v \in T_1} \limits 1} = O(1) &amp;lt;/tex&amp;gt; получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
S = O(1) +  {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_2} \limits} 1/m+ {\sum_{get} \limits} ~  {\sum_{v:v \in get,v \in T_3} \limits} 1 / m&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Во время &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; после прохождения K ребер из второго класса &amp;lt;tex&amp;gt; R(v_1) \ge  x^{x^{.^{.^{.^{x^{R(v)}}}}}} &amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Из выше сказанного и первого следствия второго утверждения получаем, что:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; {\sum_{v:v \in get,v \in T_2} \limits}  \le \log^*_x(\log_2(n)) = O(\log^*(n))&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы &amp;lt;tex&amp;gt; \log^*_x &amp;lt;/tex&amp;gt; существовал необходимо, чтобы &amp;lt;tex&amp;gt; x &amp;gt; e ^{ 1 /e } \approx 1,44 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сумму&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits} ~  {\sum_{v:v \in get,v \in T_3} \limits} 1~/m&lt;br /&gt;
 &amp;lt; &lt;br /&gt;
 {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_3} \limits} 1/n &lt;br /&gt;
&amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt; &lt;br /&gt;
Из первого утверждения и в силу использования сжатия путей следует,&lt;br /&gt;
что &amp;lt;tex&amp;gt; R(P(x))&amp;lt;/tex&amp;gt; cтрого увеличивается при переходе по ребру из &amp;lt;tex&amp;gt;Т_3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Как максимум через &amp;lt;tex&amp;gt; x^{R(k)} &amp;lt;/tex&amp;gt; переходов ребро перестанет появляться в классе &amp;lt;tex&amp;gt;Т_3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/n = {\sum_v \limits ~\sum_{get: in ~ this ~ get ~ v \in T_3} \limits  } &lt;br /&gt;
  1/n \le \sum_v \limits x^{R(v)} /n&lt;br /&gt;
&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Из второго следствия второго утверждения следует&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; &lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/n \le  \sum_{Rank=0}^{log_{2}(n)} \limits {nx^{Rank} \over 2^{Rank} n}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При  &amp;lt;tex&amp;gt; x &amp;lt; 2~&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T3} \limits} 1/n&lt;br /&gt;
\le&lt;br /&gt;
\sum_{Rank=0}^{log_{2}(n)} \limits {x^{Rank} \over 2^{Rank}}&lt;br /&gt;
\le&lt;br /&gt;
\sum_{Rank=0}^\infty \limits {x^{Rank} \over 2^{Rank}}&lt;br /&gt;
\le&lt;br /&gt;
{ 2 \over 2-x } = O(1)&lt;br /&gt;
&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;.   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итак &amp;lt;tex&amp;gt; S = O(1) + O(\log^*(x)) + O(1) = O(\log^*(x)) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
В силу того, что интервал &amp;lt;tex&amp;gt; (1,45...2) &amp;lt;/tex&amp;gt; не пустой, теорема доказана. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Iterated_logarithm Wikipedia -Iterated logarithm]&lt;/div&gt;</summary>
		<author><name>BoyCoder</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D1%80%D0%B0%D0%BD%D0%B3%D0%BE%D0%B2%D0%BE%D0%B9_%D1%8D%D0%B2%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%BE%D0%B9&amp;diff=24046</id>
		<title>Анализ реализации с ранговой эвристикой</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D1%80%D0%B0%D0%BD%D0%B3%D0%BE%D0%B2%D0%BE%D0%B9_%D1%8D%D0%B2%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%BE%D0%B9&amp;diff=24046"/>
				<updated>2012-06-05T11:28:38Z</updated>
		
		<summary type="html">&lt;p&gt;BoyCoder: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Пусть  &amp;lt;tex&amp;gt; union(v_1,v_2) &amp;lt;/tex&amp;gt; — процедура объединения двух множеств, содержащих &amp;lt;tex&amp;gt; v_1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; v_2 &amp;lt;/tex&amp;gt;,&lt;br /&gt;
а &amp;lt;tex&amp;gt; get(v) &amp;lt;/tex&amp;gt; — поиск представителя множества, содержащего &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt; union  &amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt; операций  &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt; m &amp;gt; n &amp;lt;/tex&amp;gt;).&lt;br /&gt;
Не теряя общности, будем считать, что &amp;lt;tex&amp;gt; union &amp;lt;/tex&amp;gt; принимает в качестве аргументов представителей,&lt;br /&gt;
то есть &amp;lt;tex&amp;gt; union(v_1,v_2) &amp;lt;/tex&amp;gt; заменяем на  &amp;lt;tex&amp;gt; union(get(v_1),get(v_2)) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Оценим стоимость операции &amp;lt;tex&amp;gt; get(v) &amp;lt;/tex&amp;gt;.  &lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt; R(v) &amp;lt;/tex&amp;gt; — ранг вершины, &amp;lt;tex&amp;gt;P(v)&amp;lt;/tex&amp;gt; — представитель множества, содержащего &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&amp;lt;tex&amp;gt; L(v) &amp;lt;/tex&amp;gt; — отец вершины,&lt;br /&gt;
&amp;lt;tex&amp;gt; K(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;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; R(P(v)) &amp;gt; R(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Из принципа работы функции &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; следует:&lt;br /&gt;
#&amp;lt;tex&amp;gt; R(L(v))&amp;gt;R(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
#Между  &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; P(v) &amp;lt;/tex&amp;gt; существует путь вида: &amp;lt;tex&amp;gt; v \rightarrow L(v) \rightarrow L(L(v)) \rightarrow \dots \rightarrow P(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
Записав неравенство из первого пункта вдоль пути из второго пункта получаем требуемое.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение &lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; R(v) = i \Rightarrow K(v) \ge 2^i &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем по индукции: &lt;br /&gt;
&lt;br /&gt;
Для 0 равенство очевидно.&lt;br /&gt;
Ранг вершины станет равным &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; при объединении поддеревьев ранга &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt;, следовательно:&lt;br /&gt;
&amp;lt;tex&amp;gt;K(v) \ge K(v_1) + K(v_2) \ge 2^{i-1}+2^{i-1} \ge 2^i &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; R(v) \le \log_2(n) &amp;lt;/tex&amp;gt;&lt;br /&gt;
#Количество вершин ранга &amp;lt;tex&amp;gt; i \le {n \over 2^i} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Амортизационная стоимость &amp;lt;tex&amp;gt; get = O(\log^{*}(n))  &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим некоторое число &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Разобьем наши ребра  на три класса:&lt;br /&gt;
&lt;br /&gt;
#Ведут в корень или в сына корня.&lt;br /&gt;
#&amp;lt;tex&amp;gt; R(P(v)) \ge x^{R(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
#Все остальные.&lt;br /&gt;
&lt;br /&gt;
Обозначим эти классы &amp;lt;tex&amp;gt; T_1, T_2, T_3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Амортизационная стоимость &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
S =  {\sum_{get} \limits} ({\sum_{v:v \in get,v \in T_1} \limits 1}&lt;br /&gt;
+&lt;br /&gt;
{\sum_{v:v \in get,v \in T2} \limits 1} + {\sum_{v: \in get,v \in T_3} \limits 1}  ) /  m &lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;  {v \in get } &amp;lt;/tex&amp;gt; означает, что ребро, начало которого находится в &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, было пройдено во время выполнения текущего &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt;. &lt;br /&gt;
Ребро &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;  эквивалентно вершине, в которой оно начинается.&lt;br /&gt;
&lt;br /&gt;
В силу того, что &amp;lt;tex&amp;gt;{\sum_{v:v \in get,v \in T_1} \limits 1} = O(1) &amp;lt;/tex&amp;gt; получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
S = O(1) +  {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_2} \limits} 1/m+ {\sum_{get} \limits} ~  {\sum_{v:v \in get,v \in T_3} \limits} 1 / m&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Во время &amp;lt;tex&amp;gt; get &amp;lt;/tex&amp;gt; после прохождения K ребер из второго класса &amp;lt;tex&amp;gt; R(v_1) \ge  x^{x^{.^{.^{.^{x^{R(v)}}}}}} &amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Из выше сказанного и первого следствия второго утверждения получаем, что:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; {\sum_{v:v \in get,v \in T_2} \limits}  \le \log^*_x(\log_2(n)) = O(\log^*(n))&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы &amp;lt;tex&amp;gt; \log^*_x &amp;lt;/tex&amp;gt; существовал необходимо, чтобы &amp;lt;tex&amp;gt; x &amp;gt; e ^{ 1 /e } \approx 1,44 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сумму&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits} ~  {\sum_{v:v \in get,v \in T_3} \limits} 1~/m&lt;br /&gt;
 &amp;lt; &lt;br /&gt;
 {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_3} \limits} 1/n &lt;br /&gt;
&amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt; &lt;br /&gt;
Из первого утверждения и в силу использования сжатия путей следует,&lt;br /&gt;
что &amp;lt;tex&amp;gt; R(P(x))&amp;lt;/tex&amp;gt; cтрого увеличивается при переходе по ребру из &amp;lt;tex&amp;gt;Т_3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Как максимум через &amp;lt;tex&amp;gt; x^{R(k)} &amp;lt;/tex&amp;gt; переходов ребро перестанет появляться в классе &amp;lt;tex&amp;gt;Т_3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/n = {\sum_v \limits ~\sum_{get: in ~ this ~ get ~ v \in T_3} \limits  } &lt;br /&gt;
  1/n \le \sum_v \limits x^{R(v)} /n&lt;br /&gt;
&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Из второго следствия второго утверждения следует&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; &lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T_3} \limits} 1/n \le  \sum_{Rank=0}^{log_{2}(n)} \limits {nx^{Rank} \over 2^{Rank} n}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При  &amp;lt;tex&amp;gt; x &amp;lt; 2~&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;&lt;br /&gt;
{\sum_{get} \limits}~  {\sum_{v:v \in get,v \in T3} \limits} 1/n&lt;br /&gt;
\le&lt;br /&gt;
\sum_{Rank=0}^{log_{2}(n)} \limits {x^{Rank} \over 2^{Rank}}&lt;br /&gt;
\le&lt;br /&gt;
\sum_{Rank=0}^\infty \limits {x^{Rank} \over 2^{Rank}}&lt;br /&gt;
\le&lt;br /&gt;
{ 2 \over 2-x } = O(1)&lt;br /&gt;
&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;.   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итак &amp;lt;tex&amp;gt; S = O(1) + O(\log^*(x)) + O(1) = O(\log^*(x)) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
В силу того, что интервал &amp;lt;tex&amp;gt; (1,45...2) &amp;lt;/tex&amp;gt; не пустой, теорема доказана. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Iterated_logarithm Wikipedia -Iterated logarithm]&lt;/div&gt;</summary>
		<author><name>BoyCoder</name></author>	</entry>

	</feed>