Анализ реализации с ранговой эвристикой — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 1: Строка 1:
Пусть  union(v1,v2) - процедура слития двух множеств содержащих v1,v2, а get(v) - поиск корня поддерева содержащего x. Рассмотрим n операций union и m операций get. Для удобства и без потери общности будем считать что у нас union принимает в качестве аргументов корни поддеревьев и (m>n), то есть (union(v1,v2) заменяем на union(get(v1),get(v2)). Тогда нам надо оценить стоимость операции get(v).   
+
Пусть  <tex> union(v1,v2) </tex> - процедура слития двух множеств содержащих <tex> v1 </tex>,<tex> v2 </tex>, а <tex> get(v) </tex> - поиск корня поддерева содержащего <tex> v </tex>. Рассмотрим <tex> n </tex> операций <tex> union </tex> и <tex> m </tex> операций <tex> get </tex>. Для удобства и без потери общности будем считать <tex>  union </tex> принимает в качестве аргументов корни поддеревьев и <tex> m > n </tex>, то есть <tex> union(v1,v2) </tex> заменяем на <tex> union(get(v1),get(v2)) </tex>.
Обозначим <tex>R(v)</tex> - ранг вершины,<tex>P(v)</tex> - отец вершины,<tex>L(v) </tex> - самый первый отец вершины.  
+
 
 +
Тогда нам надо оценить стоимость операции <tex> get(v) </tex>.   
 +
Обозначим <tex>R(v)</tex> - ранг вершины,<tex>P(v)</tex> - отец вершины,<tex>L(v) </tex> - самый первый отец вершины, <tex> K(v) </tex> - количество вершин в поддерева корнем которого является <tex>
 +
v </tex>  
  
 
{{Утверждение
 
{{Утверждение
Строка 8: Строка 11:
 
Из  того как работает функция get следует:
 
Из  того как работает функция get следует:
 
1.<tex> R(L(v))>R(v) </tex>
 
1.<tex> R(L(v))>R(v) </tex>
 +
 
2. Между  <tex> v </tex> и <tex> P(v) </tex> существует путь вида : <tex> v -> L(v) -> L(L(v)) ... ->P(v) </tex>
 
2. Между  <tex> v </tex> и <tex> P(v) </tex> существует путь вида : <tex> v -> L(v) -> L(L(v)) ... ->P(v) </tex>
 
Записав неравенство  из первого пункта  вдоль пути из второго  пункта следует что <tex> R(P(v))>R(v) </tex>   
 
Записав неравенство  из первого пункта  вдоль пути из второго  пункта следует что <tex> R(P(v))>R(v) </tex>   
 +
}}
 +
 +
{{Утверждение
 +
|statement=
 +
<tex>  R(v)=i => K(v) >=2^i </tex>
 +
|proof=
 +
Докажем по индукции:
 +
Для 0 равенство очевидное.
 +
Ранг вершины стает равным <tex> i </tex> при сливании поддеревьев ранга i-1, отсюда следует:
 +
<tex>K(v)>=K(v1)+K(v2)>=2^(i-1)+2^(i-1)>=2^i </tex>.
 +
 
}}
 
}}

Версия 00:07, 8 марта 2011

Пусть [math] union(v1,v2) [/math] - процедура слития двух множеств содержащих [math] v1 [/math],[math] v2 [/math], а [math] get(v) [/math] - поиск корня поддерева содержащего [math] v [/math]. Рассмотрим [math] n [/math] операций [math] union [/math] и [math] m [/math] операций [math] get [/math]. Для удобства и без потери общности будем считать [math] union [/math] принимает в качестве аргументов корни поддеревьев и [math] m \gt n [/math], то есть [math] union(v1,v2) [/math] заменяем на [math] union(get(v1),get(v2)) [/math].

Тогда нам надо оценить стоимость операции [math] get(v) [/math]. Обозначим [math]R(v)[/math] - ранг вершины,[math]P(v)[/math] - отец вершины,[math]L(v) [/math] - самый первый отец вершины, [math] K(v) [/math] - количество вершин в поддерева корнем которого является [math] v [/math]

Утверждение:
[math] R(P(v))\gt R(v) [/math]
[math]\triangleright[/math]

Из того как работает функция get следует: 1.[math] R(L(v))\gt R(v) [/math]

2. Между [math] v [/math] и [math] P(v) [/math] существует путь вида : [math] v -\gt L(v) -\gt L(L(v)) ... -\gt P(v) [/math]

Записав неравенство из первого пункта вдоль пути из второго пункта следует что [math] R(P(v))\gt R(v) [/math]
[math]\triangleleft[/math]
Утверждение:
[math] R(v)=i =\gt K(v) \gt =2^i [/math]
[math]\triangleright[/math]

Докажем по индукции: Для 0 равенство очевидное. Ранг вершины стает равным [math] i [/math] при сливании поддеревьев ранга i-1, отсюда следует:

[math]K(v)\gt =K(v1)+K(v2)\gt =2^(i-1)+2^(i-1)\gt =2^i [/math].
[math]\triangleleft[/math]