на стр 6, лекции 3, Очевидно "Ck <= модуль(Gk(е))*b(k+1)" (1) - , подскажите что значит "модуль" и почему это очевидно... |
Разделенные множества
Примеры использования разделенных множеств
Пример 1.
Рассмотрим задачу выделения компонент связности
неориентированного графа. Напомним, что компонентой связности называется
максимальное по включению подмножество вершин графа такое, что любые две
его вершины связаны цепью. Полагаем, что вершины графа пронумерованы
числами и каждое ребро представлено парой (
) номеров вершин. Предполагаем также, что множество ребер не пусто.
Алгоритм выделения компонент связности неориентированного графа

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

Пример 2.
Рассмотрим неориентированный связный граф без петель,
ребрам которого приписаны в качестве весов положительные вещественные числа.
Требуется построить остовное дерево, накрывающее все вершины графа и имеющее
минимальный суммарный вес входящих в него ребер. Итак, пусть заданный
граф имеет множество
вершин, пронумерованных
числами
,
и множество
ребер. Каждому ребру
из
множества
поставлена в соответствие пара
его концевых вершин
и число
— его вес. Для решения
этой задачи были предложены различные алгоритмы. Мы рассмотрим алгоритм,
который разработал Крускал.
Алгоритм Крускала

Заметим, что в процессе работы алгоритма в множестве будут
находиться ребра, составляющие ациклический подграф исходного графа,
являющийся лесом, состоящим из некоторого числа деревьев. Отсутствие
циклов гарантируется проверкой "Если
" в
пункте 6 описанного алгоритма. Фактически при
происходит
объединение двух поддеревьев в одно дерево с помощью ребра
,
найденного на шаге 3.
Если исходный граф связен, как сказано в постановке задачи, то построенное
с помощью такого алгоритма множество будет, очевидно,
представлять дерево, накрывающее все вершины исходного графа. Доказательство того, что
суммарный вес входящих в него ребер будет минимальным, можно найти в
разделе "Графы".
В алгоритме естественным образом используется структура разделенных
множеств. Обратим внимание на операцию поиска в множестве
ребра
с минимальным весом. Эффективность этой операции во многом зависит
от выбора структуры данных для хранения множества
. Приемы
эффективного выполнения этой операции рассмотрены в разделе "Приоритетные
очереди".
Представление разделенных множеств с помощью массива
Пусть — множество, из элементов
которого будет строиться коллекция разделенных подмножеств. Одним из очевидных
способов представления коллекции является представление ее с помощью
массива. При таком способе для каждого элемента
в соответствующей (
-й) ячейке массива помещаем имя (канонический элемент) того
подмножества, которому принадлежит элемент
. Если
элемент
не принадлежит ни одному из подмножеств коллекции, то в
-ю ячейку
записываем 0.
Реализация операций с помощью массива
Обозначим через массив длины
,
с помощью которого будем представлять
коллекцию. Пустая коллекция представляется массивом, заполненным нулями.
Операция СОЗДАТЬ ( ) осуществляется записью элемента
в ячейку с номером
. Время выполнения операции —
.
Операция ОБЪЕДИНИТЬ ( ) осуществляется следующим
образом. Просматриваются элементы массива
, и в те ячейки,
в которых было записано имя
, заносится новое имя —
.
Следовательно, именем вновь образованного подмножества будет
,
а
перестанет быть именем какого-либо подмножества. Очевидно,
время выполнения этой операции —
.
Операция НАЙТИ ( ) выдает в качестве
содержимое элемента с номером
в массиве
. Время
выполнения операции —
.
При такой реализации разделенных множеств, очевидно, что время
выполнения произвольных операций, среди которых
операций
ОБЪЕДИНИТЬ, есть величина
.