Анализ реализации с ранговой эвристикой — различия между версиями
Rybak (обсуждение | вклад) |
Rybak (обсуждение | вклад) |
||
| Строка 1: | Строка 1: | ||
| − | Пусть <tex> union( | + | Пусть <tex> union(v_1,v_2) </tex> — процедура объединения двух множеств содержащих <tex> v_1 </tex> и <tex> v_2 </tex>, |
| + | а <tex> get(v) </tex> — поиск представителя множества, содержащего <tex> v </tex>. | ||
| + | Рассмотрим <tex> n </tex> операций <tex> union </tex> и <tex> m </tex> операций <tex> get </tex> (<tex> m > n </tex>). | ||
| + | Не теряя общности, будем считать, что <tex> union </tex> принимает в качестве аргументов представителей, | ||
| + | то есть <tex> union(v_1,v_2) </tex> заменяем на <tex> union(get(v_1),get(v_2)) </tex>. | ||
| − | + | Оценим стоимость операции <tex> get(v) </tex>. | |
| − | Обозначим <tex>R(v)</tex> | + | Обозначим <tex>R(v)</tex> — ранг вершины, <tex>P(v)</tex> — отец вершины, <tex>L(v) </tex> — самый первый отец вершины, |
| − | v </tex> | + | <tex> K(v) </tex> — количество вершин в поддерева корнем которого является <tex> v </tex> |
{{Утверждение | {{Утверждение | ||
|statement= | |statement= | ||
| − | <tex> R(P(v))>R(v) </tex> | + | <tex> R(P(v)) > R(v) </tex> |
|proof= | |proof= | ||
| − | Из | + | Из принципа работы функции <tex> get </tex> следует: |
| − | + | #<tex> R(L(v))>R(v) </tex> | |
| − | + | #Между <tex> v </tex> и <tex> P(v) </tex> существует путь вида: <tex> v \rightarrow L(v) \rightarrow L(L(v)) \rightarrow \dots \rightarrow P(v) </tex> | |
| − | + | Записав неравенство из первого пункта вдоль пути из второго пункта получаем требуемое. | |
| − | Записав неравенство | ||
}} | }} | ||
{{Утверждение | {{Утверждение | ||
|statement= | |statement= | ||
| − | <tex> | + | <tex> R(v) = i \Rightarrow K(v) \ge 2^i </tex> |
|proof= | |proof= | ||
Докажем по индукции: | Докажем по индукции: | ||
| − | Для 0 равенство | + | |
| − | Ранг вершины стает равным <tex> i </tex> при | + | Для 0 равенство очевидно. |
| − | <tex>K(v) \ge K( | + | Ранг вершины стает равным <tex> i </tex> при объединении поддеревьев ранга <tex>i-1</tex>, отсюда следует: |
| − | + | <tex>K(v) \ge K(v_1) + K(v_2) \ge 2^{i-1}+2^{i-1} \ge 2^i </tex>. | |
}} | }} | ||
| − | |||
Из второго утверждения следует: | Из второго утверждения следует: | ||
| − | + | #<tex> R(v) \le \log_2(n) </tex> | |
| − | + | #Количество вершин ранга <tex> i \le {n \over 2^i} </tex> | |
| − | |||
| − | |||
{{Теорема | {{Теорема | ||
| Строка 39: | Строка 39: | ||
Амортизационная стоимость <tex> get = O(\log^{*}(n)) </tex> | Амортизационная стоимость <tex> get = O(\log^{*}(n)) </tex> | ||
|proof= | |proof= | ||
| − | Рассмотрим некоторое число <tex> x </tex> . | + | Рассмотрим некоторое число <tex> x </tex>. |
Разобьем наши ребра на три класса: | Разобьем наши ребра на три класса: | ||
| − | + | #Ведут в корень или в сына корня. | |
| − | + | #<tex> R(P(v)) \ge x^{R(v)}</tex> | |
| − | + | #Все остальные. | |
| − | Обозначим эти классы <tex> | + | Обозначим эти классы <tex> T_1, T_2, T_3 </tex>. |
Амортизированная стоимость | Амортизированная стоимость | ||
| − | <center><tex> | + | <center> |
| − | S= {\sum_{get} \limits} ({\sum_{v:v \in get,v \in | + | <tex> |
| − | </tex></center> | + | S = {\sum_{get} \limits} ({\sum_{v:v \in get,v \in T_1} \limits 1} |
| − | где <tex> {v \in get } </tex> означает что ребро | + | + |
| − | Ребро <tex> v </tex> эквивалентно вершине в которой оно начинается. | + | {\sum_{v:v \in get,v \in T2} \limits 1} + {\sum_{v: \in get,v \in T_3} \limits 1} ) / m |
| + | </tex> | ||
| + | </center> | ||
| + | где <tex> {v \in get } </tex> означает что ребро начало которого находится в <tex> v </tex> было пройдено во время выполнения текущего <tex> get </tex>. | ||
| + | Ребро <tex> v </tex> эквивалентно вершине, в которой оно начинается. | ||
| + | |||
| + | В силу того, что <tex>{\sum_{v:v \in get,v \in T_1} \limits 1} = O(1) </tex> получаем: | ||
| − | + | <center> | |
| − | + | <tex> | |
| + | 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 | ||
| + | </tex> | ||
| + | </center> | ||
| − | Во время <tex> get </tex> после прохождения K ребер из второго класса <tex> R( | + | Во время <tex> get </tex> после прохождения K ребер из второго класса <tex> R(v_1) \ge x^{x^{.^{.^{.^{x^{R(v)}}}}}} </tex> |
| − | Из выше сказанного и первого следствия второго утверждения получаем что:<center> <tex> {\sum_{v:v \in get,v \in | + | Из выше сказанного и первого следствия второго утверждения получаем что: |
| + | <center> | ||
| + | <tex> {\sum_{v:v \in get,v \in T_2} \limits} \le \log^*_x(\log_2(n)) = O(\log^*(n)) | ||
| + | </tex> | ||
| + | </center> | ||
Для того, чтобы <tex> \log^*_x </tex> существовал необходимо, чтобы <tex> x > e ^{ 1 /e } \approx 1,44 </tex> | Для того, чтобы <tex> \log^*_x </tex> существовал необходимо, чтобы <tex> x > e ^{ 1 /e } \approx 1,44 </tex> | ||
| − | Рассмотрим сумму<center> <tex>{\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in | + | Рассмотрим сумму |
| − | Из первого утверждения и | + | <center> <tex> |
| + | {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_3} \limits} 1~/m | ||
| + | < | ||
| + | {\sum_{get} \limits} ~ {\sum_{v:v \in get,v \in T_3} \limits} 1/n | ||
| + | </tex> </center> | ||
| + | Из первого утверждения и всилу использования сжатия путей следует, что <tex> R(P(x))</tex> cтрого увеличивается при переходе по ребру из Т_3. | ||
| − | Как максимум через <tex> x^{R(k)} </tex> переходов ребро перестанет появляться в классе | + | Как максимум через <tex> x^{R(k)} </tex> переходов ребро перестанет появляться в классе Т_3. |
| − | <center><tex> | + | <center><tex> |
| + | {\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 } | ||
| + | 1/n \le \sum_v \limits x^{R(v)} /n | ||
| + | </tex></center> | ||
Из второго следствия второго утверждения следует | Из второго следствия второго утверждения следует | ||
| − | <center> <tex> {\sum_{get} \limits}~ {\sum_{v:v \in get,v \in | + | <center> <tex> |
| + | {\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} | ||
| + | </tex></center> | ||
| − | При <tex> x < 2~</tex> :<center> <tex>{\sum_{get} \limits}~ {\sum_{v:v \in get,v \in T3} \limits} 1/n \le | + | При <tex> x < 2~</tex> : |
| + | <center> <tex> | ||
| + | {\sum_{get} \limits}~ {\sum_{v:v \in get,v \in T3} \limits} 1/n | ||
| + | \le | ||
| + | \sum_{Rank=0}^{log_{2}(n)} \limits {x^{Rank} \over 2^{Rank}} | ||
| + | \le | ||
| + | \sum_{Rank=0}^\infty \limits {x^{Rank} \over 2^{Rank}} | ||
| + | \le | ||
| + | { 2 \over 2-x } = O(1) | ||
| + | </tex></center>. | ||
| − | + | Итак <tex> S=O(1)+O(\log^*(x))+O(1)=O(\log^*(x)) </tex>. | |
В силу того что интервал <tex> (1,45...2) </tex> не пустой теорема доказана. | В силу того что интервал <tex> (1,45...2) </tex> не пустой теорема доказана. | ||
}} | }} | ||
Версия 05:58, 30 июня 2011
Пусть — процедура объединения двух множеств содержащих и , а — поиск представителя множества, содержащего . Рассмотрим операций и операций (). Не теряя общности, будем считать, что принимает в качестве аргументов представителей, то есть заменяем на .
Оценим стоимость операции . Обозначим — ранг вершины, — отец вершины, — самый первый отец вершины, — количество вершин в поддерева корнем которого является
| Утверждение: |
|
Из принципа работы функции следует:
|
| Утверждение: |
|
Докажем по индукции: Для 0 равенство очевидно. Ранг вершины стает равным при объединении поддеревьев ранга , отсюда следует: . |
Из второго утверждения следует:
- Количество вершин ранга
| Теорема: |
Амортизационная стоимость |
| Доказательство: |
|
Рассмотрим некоторое число . Разобьем наши ребра на три класса:
Обозначим эти классы . Амортизированная стоимость
где означает что ребро начало которого находится в было пройдено во время выполнения текущего . Ребро эквивалентно вершине, в которой оно начинается. В силу того, что получаем:
Во время после прохождения K ребер из второго класса Из выше сказанного и первого следствия второго утверждения получаем что:
Для того, чтобы существовал необходимо, чтобы
Из первого утверждения и всилу использования сжатия путей следует, что cтрого увеличивается при переходе по ребру из Т_3. Как максимум через переходов ребро перестанет появляться в классе Т_3. Из второго следствия второго утверждения следует При :
|