Изменения

Перейти к: навигация, поиск

СНМ (реализация с помощью леса корневых деревьев)

160 байт добавлено, 19:50, 16 апреля 2015
Нет описания правки
<tex>r[x]</tex> {{---}} массив рангов.
===='''get'''==== '''get'''(x) '''if ''' p[x] != x
p[x] = get(p[x])
'''return ''' p[x]
===='''union'''==== '''union'''(x, y)
x = get(x)
y = get(y)
'''if ''' x == y '''return;''' '''if ''' r[x] == r[y]
r[x]++
'''if ''' r[x] < r[y]
p[x] = y
'''else'''
p[y] = x
| ''<tex>\mathrm{union}</tex>'' || <tex>\mathrm{O(1)}</tex> || <tex>\mathrm{O(1)}</tex>
|}
* Где <tex>m </tex> {{---}} общее количество операций * , <tex>n </tex> {{---}} полное количество элементов * , <tex>\mathrm{\alpha(m, n)}</tex> {{---}} функция, обратная к функции Аккермана (если <tex>m</tex> операций get и <tex>n</tex> элементов).
Докажем, что если глубина множества (т.е. его ранг) равна <tex>k</tex>, то в нем содержится как минимум <tex>2^k</tex> элементов. Из этого свойства следует, что глубина множества с <tex>n</tex> элементами есть <tex>\mathrm{O(\log n)}</tex>, а значит и время работы операции <tex>\mathrm{get}</tex> является логарифмическим.
|}
Функция, обратная функции Аккермана <tex>\mathrm{\alpha(m, n)}</tex>, равна минимальному <tex>i</tex> такому, что <tex>\mathrm{A \left (i, \left [\frac{m}{n} \right ] \right )} \geq geqslant \log n</tex>. Как видно из таблицы значений для функции Аккермана, обратная функция для любых значений, которые могут возникнуть при решении прикладных задач, не превышает 4, то есть можно считать, что операция get выполняется за константное время.
===Анализ реализации с ранговой эвристикой===
Проведем анализ реализации с ранговой эвристикой, будем доказывать более слабую оценку (итерированный логарифм <tex>\mathrm(\lglog^*n)</tex>).
Рассмотрим <tex> a </tex> операций <tex> \mathrm{union} </tex> и <tex> b </tex> операций <tex> \mathrm{get} </tex> (<tex> b > a </tex>).
Не теряя общности, будем считать, что <tex> union </tex> принимает в качестве аргументов представителей,
то есть <tex> \mathrm{union(v_1,v_2)} </tex> заменяем на <tex> \mathrm{union(get(v_1),get(v_2))} </tex>.
 
<tex>^*</tex><tex>\mathrm(\log^*n)</tex> — минимальное число логарифмирований <tex>n</tex>, необходимое для получения значения, не превосходящего <tex>1</tex>
Оценим стоимость операции <tex> \mathrm{get(v)} </tex>.
<tex> \mathrm{L(v)} </tex> — отец вершины,
<tex> \mathrm{K(v)} </tex> — количество вершин в поддереве, корнем которого является <tex> v </tex>.
*<tex>\mathrm(\lg*n)</tex> - минимальное число логарифмирований <tex>n</tex>, необходимое для получения значения, не превосходящего <tex>1</tex>
{{Утверждение
Из последнего утверждения следует:
#<tex> \mathrm{R(v)} \le leqslant \log_2a </tex>.#Количество вершин ранга <tex> i \le leqslant {a \over 2^i} </tex>.
{{Теорема
Из выше сказанного и первого следствия второго утверждения получаем, что:
<center>
<tex> {\sum_{v:v \in \mathrm{get},v \in T_2} \limits} \le leqslant \mathrm{\log^*_x(\log_2a)} = \mathrm{O(\log^*a)}
</tex>.
</center>
<center><tex>
{\sum_{\mathrm{get}} \limits}~ {\sum_{v:v \in \mathrm{get},v \in T_3} \limits} 1/a = {\sum_v \limits ~\sum_{\mathrm{get}: in ~ this ~ \mathrm{get} ~ v \in T_3} \limits }
1/a \le leqslant \sum_v \limits x^{\mathrm{R(v)}} /a
</tex>.</center>
Из второго следствия второго утверждения следует:
<center> <tex>
{\sum_{\mathrm{get}} \limits}~ {\sum_{v:v \in \mathrm{get},v \in T_3} \limits} 1/a \le leqslant \sum_{Rank=0}^{\log_2a} \limits {ax^{Rank} \over 2^{Rank} a}
</tex>.</center>
<center><tex>
{\sum_{\mathrm{get}} \limits}~ {\sum_{v:v \in \mathrm{get},v \in T_3} \limits} 1/a
\leleqslant
\sum_{Rank=0}^{\log_2a} \limits {x^{Rank} \over 2^{Rank}}
\leleqslant
\sum_{Rank=0}^\infty \limits {x^{Rank} \over 2^{Rank}}
\leleqslant
{ 2 \over 2-x } = \mathrm{O(1)}
</tex>.</center>
17
правок

Навигация