Опубликован: 26.09.2006 | Доступ: свободный | Студентов: 1801 / 486 | Оценка: 4.25 / 4.12 | Длительность: 17:09:00
ISBN: 978-5-9556-0066-6
Специальности: Программист, Математик
Лекция 3:

Разделенные множества

< Лекция 2 || Лекция 3: 123456 || Лекция 4 >

Представление разделенных множеств с использованием рангов вершин и сжатия путей

Предыдущий способ реализации разделенных множеств можно еще улучшить за счет усовершенствования реализации операции НАЙТИ,( x{,}y ). Она теперь будет выполняться в два прохода. При первом проходе находится корень y того дерева, которому принадлежит x. При втором проходе из x в y все встреченные узлы делаются непосредственными потомками узла y. Этот прием, как мы увидим ниже, намного уменьшает время выполнения последующих операций НАЙТИ.

Реализация операций. Рассматриваемая реализация не требует новых полей данных по сравнению с предыдущим случаем. Как и прежде, для каждого узла i будем хранить указатель p[i] на его родителя и ранг r[i], который теперь не обязательно будет равен высоте дерева с корнем i. Он будет равен этой высоте, если не использовать операцию НАЙТИ.

Операция СОЗДАТЬ ( x ) выполняется с помощью операторов

\formula{
\t begin p[x]:= x;\ r[x] := 0\
\t end;
}

В качестве родителя узла x берется тот же самый x, а его рангом считаем 0. Таким образом, время выполнения операции есть константа.

Операция ОБЪЕДИНИТЬ ( x, y ) выполняется как и прежде, разница лишь в том, что вместо массива h используется массив r. Время выполнения операции — константа.

\formula{
\t{procedure ОБЪЕДИНИТЬ} (x,
y);\\
\tbegin\\
\mbox{}\q if\ (r[x] < r[y])\
then\ p[x] := y\
\t else\ \t if (r[x] > r[y])\ \t then\ p[y] := x\\
\mbox{}\q\t else \{p[x] := y;\ r[y]
:= r[y] + 1\} \\
\t end;
}

Операция НАЙТИ (x,
y), как уже говорилось, выполняется в два прохода. При первом проходе мы идем от узла x к его родителю, потом к родителю его родителя и так далее, пока не достигнем корня у дерева, содержащего узел x. При втором проходе из x в y все встреченные на этом пути узлы делаются непосредственными потомками узла y. Будем называть это "сжатием путей". Очевидно, как и раньше, время выполнения одной такой операции есть O(\log n). Но ниже будет доказано, что время выполнения m таких операций на самом деле меньше, чем O(m \cdot \log n). Заметим, что при выполнении этой операции ранги узлов не изменяются.

\formula{
\t{procedure НАЙТИ}\ (x,y);\\
\t begin \\
\mbox{}\q z:= x;\ \t while\ (p[x]
\ne x)\ \t do\ x:= p[x];\\
\mbox{}\q y:= x;\ \t while\ (p[z]
\ne z)\ \t do\ \{z1:= z;\
z:= p[z];\ p[z1]:= y\} \\
\t end;
}

Анализ трудоемкости

Для анализа трудоемкости выполнения операций нам потребуются две функции. Одна из них, b(n), является суперэкспонентой и определяется следующим образом:

\eq*{
b(0) = 0,\q b(n) = 2^{b(n-1)}\q \t{при } n > 0.
}

Вторая — суперлогарифм \log^\ast n, по основанию 2, определяемая соотношением

\eq*{
\log^\ast n = \max\{k: b(k) \le n\}.
}

Суперлогарифм является в некотором смысле обратной функцией к суперэкспоненте, \log^\ast (b(n)) = n. Значения функций \log^\ast n и b(n) при нескольких значениях аргументов приведены в следующих таблицах:

n 0 1 2 3 4 5 6
b(n) 0 1 2 4 16 65536 2^{65536}

n 0 1 2 3 4 5 \dots 15 16 \dots 65535 65536 \dots 2^{65536}-1
\log^\ast n 0 1 2 2 3 3 \dots 3 4 \dots 4 5 \dots 5

Ребро (x, p(x)) при текущем состоянии коллекции назовем корневым, если p(x) — корень и p(x) = x (петля); назовем его прикорневым, если p(x) — корень и p(x) \ne
x, в противном случае — внутренним.

Отметим следующие свойства коллекции на множестве из n элементов. Прикорневое ребро может превратиться во внутреннее, а корневое — в прикорневое только при выполнении операции ОБЪЕДИНИТЬ.

Внутреннее ребро (x, y) при первом же выполнении операции НАЙТИ, "проходящей через него", исчезает, но вместо него появляется прикорневое ребро (x, y'), при этом r(y') > r(y), следовательно, внутреннее ребро "участвует в поиске" не более одного раза.

Если при выполнении очередной операции ОБЪЕДИНИТЬ (x,y) узел y становится родителем узла x, то после ее выполнения справедливо неравенство r(y) > r(x).

При выполнении операции НАЙТИ ранги узлов не изменяются, но узлы могут менять своих родителей, то есть меняется структура леса.

Если перед выполнением операции НАЙТИ узел x был родителем узла y, а после выполнения этой операции родителем узла y стал узел x' \ne x, то выполняется неравенство r(x) <
r(x'). Следовательно, даже после изменения леса в результате выполнения операции НАЙТИ ранги вдоль любого пути от листа к корню будут строго возрастать.

При выполнении операции ОБЪЕДИНИТЬ ранг любого некорневого элемента не изменяется, а ранг корня либо сохраняется, либо увеличивается на 1.

< Лекция 2 || Лекция 3: 123456 || Лекция 4 >
Антон Сиротинкин
Антон Сиротинкин

на стр 6, лекции 3, Очевидно "Ck <= модуль(Gk(е))*b(k+1)" (1) - , подскажите что значит "модуль" и почему это очевидно...