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

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

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

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

Предыдущую реализацию разделенных множеств можно усовершенствовать следующим образом. Операцию ОБЪЕДИНИТЬ можно выполнить так, чтобы высота дерева, соответствующего объединению двух множеств, была как можно меньше. А именно, корень большего по высоте дерева сделать родителем корня другого дерева. Назовем такую реализацию операции ОБЪЕДИНИТЬ объединением по рангу. В качестве ранга в данном случае берется высота соответствующего дерева.

Реализация операций с использованием рангов вершин

Для такой реализации разделенных множеств необходимо хранить с каждым узлом x дополнительно еще одну величину — высоту поддерева, корнем которого является узел x. Будем называть ее высотой, или рангом, узла x. Остальные операции нужно настроить на корректную работу с этим полем. Будем хранить высоту каждого узла x в ячейке h[x] массива h.

Операция СОЗДАТЬ ( x ) назначает в качестве родителя узла x тот же самый x, а высотой узла x считает 0. Таким образом, время выполнения данной операции есть O(1). В результате выполнения операции СОЗДАТЬ ( x ) образуется новое дерево, изображенное на рис. 3.6. Число, расположенное рядом с узлом, обозначает его высоту. Описанные действия реализуются с помощью операторов

\formula{
p[x]:= x;\ h[x]:= 0;
}


Рис. 3.6.

Операция ОБЪЕДИНИТЬ ( x, y ) назначает корень большего по высоте дерева родителем корня другого дерева. Если деревья имеют одинаковую высоту, то узел y назначается родителем узла x, после чего значение высоты узла y увеличивается на единицу. Заметим, что x и y должны быть до выполнения операции корнями соответствующих деревьев. Именем вновь образованного подмножества будет имя того из объединяемых подмножеств, у которого корень имел большую высоту, а имя другого из объединяемых подмножеств перестанет быть именем какого-либо из подмножеств. Очевидно, время выполнения этой операции есть константа. Выполнить описанные действия можно с помощью следующей процедуры:

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

На рис. 3.7 и рис. 3.8 показано применение операции ОБЪЕДИНИТЬ (3,6) к коллекции, изображенной на рис. 3.3, с учетом высот объединяемых поддеревьев. Рядом с кружочками, изображающими узлы, показаны их высоты. Так как h(3) = 2 > h(6) = 1, то родителем узла 6 становится узел 3.

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


Рис. 3.7.

Рис. 3.8.

Очевидно, что время выполнения данной операции, как и ранее, пропорционально длине пути из узла x в корень соответствующего дерева. Однако длина такого пути в данном случае может быть оценена иначе. Для оценки длины этого пути докажем следующие леммы:

Лемма 1. В результате выполнения любой последовательности операций из набора \{ СОЗДАТЬ, ОБЪЕДИНИТЬ, НАЙТИ \} над пустой коллекцией разделенных множеств для любого узла x выполняется неравенство n[x]\ge
2^{h(x)}, где n[x] — количество узлов в поддереве с корнем x, h[x] — высота узла x.

Доказательство Очевидно, перед первым применением операции ОБЪЕДИНИТЬ для любого узла x имели n[x] =
1, h[x] = 0 и, следовательно, n[x] \ge 2^{h(x)}. Операции СОЗДАТЬ и НАЙТИ не могут нарушить доказываемого неравенства, поэтому доказательство можно провести индукцией по количеству применений операции ОБЪЕДИНИТЬ.

Предположим, что перед очередным применением операции ОБЪЕДИНИТЬ ( x,y ) доказываемое неравенство все еще остается верным, тогда если высота узла x меньше высоты узла y, то дерево, полученное с помощью ОБЪЕДИНИТЬ ( x, y ), имеет корень y, а высоты узлов x и y не изменились. Количество узлов в дереве с корнем x не изменилось, а количество узлов в дереве с корнем y увеличилось. Таким образом, как для узлов x, y, так и для всех остальных неравенство сохраняется. Случай, когда высота узла x больше высоты узла y, аналогичен рассмотренному.

Если же высоты деревьев с корнями x и y до выполнения операции были одинаковы ( h[x] = h[y] = h), то узел y становится родителем узла x, высота узла y увеличивается на 1, а высота узла x не изменяется. Пусть после выполнения операции величины h[x], h[y], n[x], n[y] становятся равными соответственно h'[x], h'[y], n'[x], n'[y], тогда имеем h'[y] = h [y] + 1, h'[x] =
h[x], n'[x] = n[x], n'[y] = n[y] + n[x]. По предположению индукции, имеем n[y] \ge 2^{h[y]} и n[x] \ge 2^{h[x]}. Следовательно, после выполнения рассматриваемой операции для узлов x и y имеем соотношения

\eqa*{
n'[x] & = n[x] \ge 2^{h[x]} = 2^{h' [x]}\q  \t{и }\\
n'[y] & = n[y] + n[x] \ge 2^{h [y]} + 2^{h [x]} = 2^{h + 1} = 2^{h' [y]}.
}
Таким образом, утверждение леммы остается верным и в этом случае.

Лемма 2. Если за время работы, начавшейся с пустой коллекции, операция СОЗДАТЬ применялась n раз, то для любого h \ge
0 число k узлов высоты h удовлетворяет неравенству k \le n/2^h.

Доказательство Пусть x_1,x_2\dts x_k — все узлы высоты h, тогда по лемме 1 при i \!=\! 1, 2\dts
k справедливы неравенства {n[x_i] \!\ge\! 2^h}. Таким образом,

\eq*{
n \ge n[x_1] + n[x_2] + ... + n[x_k] \ge k2^h,
}
откуда и следует требуемое неравенство k \le n/2^h.

Следствие 3. В результате выполнения любой последовательности операций из набора \{ СОЗДАТЬ, ОБЪЕДИНИТЬ, НАЙТИ \} над пустой коллекцией разделенных множеств для любого узла x имеет место неравенство h[x] \le \log n.

Доказательство Дерево максимальной высоты образуется, очевидно, лишь тогда, когда все n элементов объединяются в одно множество. Для такого дерева количество k узлов максимальной высоты h равно 1, по лемме 2 имеем 1 = k \le n/2^h, откуда 2^h \le n и, следовательно, h \le \log n.

Следствие 4. Время выполнения операции НАЙТИ есть O(\log n).

Следствие 5. При реализации разделенных множеств с использованием рангов время выполнения m операций ОБЪЕДИНИТЬ и / или НАЙТИ есть величина O(m\cdot \log n).

Замечание При реализации операции объединения подмножеств в качестве ранга узла можно использовать количество узлов в поддереве с корнем в данном узле. Утверждение леммы 1 будет справедливым и в этом случае, следовательно, сохранятся и оценки времени выполнения операций.

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

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