на стр 6, лекции 3, Очевидно "Ck <= модуль(Gk(е))*b(k+1)" (1) - , подскажите что значит "модуль" и почему это очевидно... |
Разделенные множества
Представление разделенных множеств с использованием рангов вершин
Предыдущую реализацию разделенных множеств можно усовершенствовать следующим образом. Операцию ОБЪЕДИНИТЬ можно выполнить так, чтобы высота дерева, соответствующего объединению двух множеств, была как можно меньше. А именно, корень большего по высоте дерева сделать родителем корня другого дерева. Назовем такую реализацию операции ОБЪЕДИНИТЬ объединением по рангу. В качестве ранга в данном случае берется высота соответствующего дерева.
Реализация операций с использованием рангов вершин
Для такой реализации разделенных множеств необходимо хранить с каждым
узлом дополнительно еще одну величину — высоту поддерева,
корнем которого является узел
. Будем называть ее высотой, или рангом,
узла
. Остальные операции нужно настроить на корректную работу с
этим полем. Будем хранить высоту каждого узла
в
ячейке
массива
.
Операция СОЗДАТЬ ( ) назначает в качестве родителя
узла
тот
же самый
, а высотой узла
считает 0. Таким образом,
время выполнения данной операции есть
. В результате выполнения
операции СОЗДАТЬ (
) образуется новое дерево, изображенное
на рис. 3.6.
Число, расположенное рядом с узлом, обозначает его высоту. Описанные
действия реализуются с помощью операторов
Операция ОБЪЕДИНИТЬ
( ) назначает корень большего
по высоте дерева родителем корня другого дерева. Если деревья имеют
одинаковую высоту, то узел
назначается родителем
узла
,
после чего значение высоты узла
увеличивается на единицу.
Заметим, что
и
должны быть до выполнения операции корнями
соответствующих деревьев. Именем вновь образованного подмножества будет
имя того из объединяемых подмножеств, у которого корень имел большую
высоту, а имя другого из объединяемых подмножеств перестанет быть именем
какого-либо из подмножеств. Очевидно, время выполнения этой операции есть
константа. Выполнить описанные действия можно с помощью следующей
процедуры:
![\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;
}](/sites/default/files/tex_cache/1336ee41e1d3bba45fe91cb76f96dcf1.png)
На рис. 3.7 и рис. 3.8 показано применение
операции ОБЪЕДИНИТЬ к коллекции,
изображенной на рис. 3.3, с учетом высот объединяемых поддеревьев. Рядом
с кружочками, изображающими узлы, показаны их высоты.
Так как
, то родителем узла 6 становится
узел 3.
Операция НАЙТИ ( ) осуществляется, как
и в предыдущей реализации, продвижением по указателям на родителей
от узла
до корня дерева. В качестве
берется
найденный корень.
Очевидно, что время выполнения данной операции, как и ранее,
пропорционально длине пути из узла в корень соответствующего
дерева. Однако длина такого пути в данном случае может быть оценена иначе.
Для оценки длины этого пути докажем следующие леммы:
Лемма 1.
В результате выполнения любой последовательности операций
из набора СОЗДАТЬ, ОБЪЕДИНИТЬ, НАЙТИ
над пустой
коллекцией разделенных
множеств для любого узла
выполняется неравенство
,
где
— количество узлов в поддереве
с корнем
— высота узла
.
Доказательство
Очевидно, перед первым применением операции
ОБЪЕДИНИТЬ для любого узла имели
,
и, следовательно,
.
Операции СОЗДАТЬ и НАЙТИ не могут нарушить доказываемого неравенства,
поэтому доказательство можно провести индукцией по количеству применений
операции ОБЪЕДИНИТЬ.
Предположим, что перед очередным применением операции ОБЪЕДИНИТЬ
( ) доказываемое неравенство все еще остается верным, тогда если
высота узла
меньше высоты узла
, то дерево,
полученное с помощью ОБЪЕДИНИТЬ (
), имеет корень
, а высоты
узлов
и
не изменились. Количество узлов в дереве
с корнем
не изменилось, а количество узлов в дереве с
корнем
увеличилось. Таким образом, как для
узлов
,
, так и для всех
остальных неравенство сохраняется. Случай, когда высота
узла
больше высоты узла
, аналогичен
рассмотренному.
Если же высоты деревьев с корнями и
до
выполнения операции были одинаковы (
, то
узел
становится родителем
узла
, высота узла
увеличивается на 1, а высота
узла
не изменяется. Пусть после
выполнения операции
величины
,
,
,
становятся
равными соответственно
,
,
,
,
тогда имеем
,
,
,
. По
предположению индукции, имеем
и
.
Следовательно, после выполнения рассматриваемой
операции для узлов
и
имеем соотношения
![\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]}.
}](/sites/default/files/tex_cache/4d4592abaab93209ee72644cd10c01ad.png)
Лемма 2.
Если за время работы, начавшейся с пустой коллекции,
операция СОЗДАТЬ применялась раз, то для любого
число
узлов высоты
удовлетворяет
неравенству
.
Доказательство
Пусть — все
узлы высоты
, тогда по лемме 1 при
справедливы неравенства
. Таким образом,
![\eq*{
n \ge n[x_1] + n[x_2] + ... + n[x_k] \ge k2^h,
}](/sites/default/files/tex_cache/202274b81e52606aea5d83fe4c35c836.png)

Следствие 3.
В результате выполнения любой последовательности
операций из набора СОЗДАТЬ, ОБЪЕДИНИТЬ, НАЙТИ
над
пустой коллекцией разделенных множеств для любого узла
имеет место
неравенство
.
Доказательство
Дерево максимальной высоты образуется, очевидно,
лишь тогда, когда все элементов объединяются в одно множество.
Для такого дерева количество
узлов максимальной
высоты
равно 1,
по лемме 2 имеем
, откуда
и,
следовательно,
.
Следствие 4.
Время выполнения операции НАЙТИ есть .
Следствие 5.
При реализации разделенных множеств с использованием
рангов время выполнения операций ОБЪЕДИНИТЬ и
или
НАЙТИ есть величина
.
Замечание При реализации операции объединения подмножеств в качестве ранга узла можно использовать количество узлов в поддереве с корнем в данном узле. Утверждение леммы 1 будет справедливым и в этом случае, следовательно, сохранятся и оценки времени выполнения операций.