Нижегородский государственный университет им. Н.И.Лобачевского
Опубликован: 27.09.2006 | Доступ: свободный | Студентов: 3535 / 125 | Оценка: 4.44 / 4.11 | Длительность: 13:45:00
Специальности: Программист, Математик
Лекция 13:

Оптимальные каркасы

< Лекция 12 || Лекция 13: 123 || Лекция 14 >

Оценим время работы алгоритма Прима. Цикл while в строке 4 повторяется один раз для каждой вершины графа, кроме стартовой. Внутри этого цикла есть еще скрытый цикл в строке 5, где ищется ребро наименьшего веса среди всех ребер, соединяющих вершины из множества U с вершинами, не принадлежащими U. Допустим, что этот поиск производится самым бесхитростным образом, т.е. просматриваются все пары вершин (x,y) с x\in U, y\notin U. Если |U|=k, то имеется k(n-k) таких пар. Так как k меняется от 1 до n-1, то всего получаем

\suml_{k=1}^{n-1}k(n-k)=n\suml_{k=1}^{n-1}k-\suml_{k=1}^{n-1}k^{2}
=\frac{n^{2} (n-1)}{2} -\frac{(n-1)n(2n-1)}{6}
=\frac{n^{3} -n}{6}

пар, которые нужно рассмотреть. Таким образом, трудоемкость алгоритма будет O(n^{3}).

Небольшое усовершенствование позволяет на порядок ускорить этот алгоритм. Допустим, что для каждой вершины y из множества \overline{U}=V-U известна такая вершина b(y)\in U, что w(b(y),y)=\min_{x\in U} w(x,y). Тогда при |U|=k необходимо будет выбрать ребро наименьшего веса среди n-k ребер, а общее число анализируемых ребер будет равно

\suml_{k=1}^{n-1}(n-k)=\frac{n(n-1)}{2}. ( 1)

В этом случае, однако, необходимы дополнительные действия для обновления таблицы значений функции b при добавлении одной вершины к дереву, т.е. при переносе одной вершины из множества \overline{U} в множество U. Сначала, когда множество U состоит из единственной вершины a, полагаем b(x)=a для всех x\in \overline{U}. В дальнейшем эти значения могут меняться. Допустим, на некотором шаге к дереву присоединяется вершина y. Тогда для каждой вершины z\in \overline{U} либо сохраняется старое значение b(z), либо устанавливается новое b(z)=y, в зависимости от того, какое из ребер (b(z),z) и (y,z) имеет меньший вес. Иначе говоря, для модификации функции b достаточно в алгоритме 10 после строки 8 (и внутри цикла while ) добавить следующее:

  1. for z\in
\ol{U} do
  2. if w(b(z),z)>w(y,z) then b(z):=y

При |U|=k цикл в строке 9 повторяется n-k раз. Таким образом, дополнительное время, необходимое для обслуживания таблицы b, тоже оценивается сверху квадратичной функцией от n и общая оценка трудоемкости усовершенствованного алгоритма Прима будет O(n^{2} ).

Другой путь к усовершенствованию алгоритма Прима подсказывает следующее замечание. При выборе подходящего ребра (в строке 5 алгоритма 10) можно рассматривать не все пары (x,y)\in U\textimes \overline{U}, а только те, которые являются ребрами графа. Если граф разреженный, т.е. содержит намного меньше ребер, чем полный граф, то это может значительно ускорить решение задачи. Дополнительный выигрыш можно получить, если использовать приоритетную очередь для хранения множества ребер, подлежащих исследованию.

< Лекция 12 || Лекция 13: 123 || Лекция 14 >
Петр Петров
Петр Петров

произведение графов К(2)*О(4) фактически 4 отдельных графа К(2)?

Александр Лаврентьев
Александр Лаврентьев

много инструкций вида if - then - else

Например Procedure DFS(a) опишите каким образом следует понимать вложенность инструкций. Как в языке С ? 

т.е. следующее 

if (...) then (...)

if (...) then (...)

else(...)

 

раскрывается как 

if (...) then (...)

if (...) then (...)

         else(...)

или так :

if (...) then

 {  (...)

     if (...) then (...)

              else(...)

}

обьясните пожалуйста.

 

 

Дмитрий Крюков
Дмитрий Крюков
Россия, Москва
Андрей Посохов
Андрей Посохов
Россия, Санкт-Петербург