Материал: курсовой проект алгоритм прима

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

2.2Разработка псевдокода

Алгоритм Прима.

На рисунке 2 представлен псевдокод алгоритма Прима. На входе матрица смежности cost[i][j] размером n/n.

Рисунок 2 – Псевдокод реализации алгоритма Прима через матрицу смежностей

На выходе мы имеем минимальное остовное дерево N и суммарный вес каркаса mincost.

Алгоритм Крускала. На рисунке 3 представлен псевдокод алгоритма Крускала. На входе матрица смежности cost[i][j] размером n/n.

Рисунок 3 – Псевдокод реализации алгоритма Крускала через матрицу смежностей

На выходе мы имеем минимальное остовное дерево.

2.3 Визуализация алгоритма

Проиллюстрируем алгоритм Прима графе. На рисунке 1 представлен исходный звешенный связный неориентированный граф. Выберем вершину A в качестве начальной. Среди ребер, инцидентных вершине A, выбираем ребро A,D наименьшего веса и включаем его в остовное дерево T. Вершина D инцидентна ребрам (D,B), (D,E), (D,F). В остов включаем ребро (D,F). Ребро (A,B), имеет меньший вес чем ребро (F,E), с силу данного обстоятельства, нам необходимо вернуться в вершину A и включить в дерево ребро (A,B).Далее проходим по незадействованным вершинам и включаем в остов ребра (B,E), (E,C), (E,G). В результате мы получаем минимальное остовное дерево – рисунок 5.

Рисунок 4 – Исходный  взвешенный связный неориентированный граф.

Рисунок 5 – Минимально остовное дерево исходного графа.

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

Анализ алгоритма Прима

Время выполнения программы, имеет порядок O(n).

Асимптотика алгоритма зависит от способа хранения графа и способа хранения вершин, не входящих в дерево. Если приоритетная очередь Q реализована как обычный массив d, то Extract.Min(Q) выполняется за O(n), а стоимость операции d[u] ← w(v, u) составляет O(1). Если Q  представляет собой бинарную пирамиду, то стоимость Extract.Min(Q) снижается до O(logn), а стоимость d[u] ← w(v, u) возрастает до O(logn). При использовании фибоначчиевых пирамид операция Extract.Min(Q)  выполняется за O(logn)d[u] ← w(v, u) за O(1). Что наглядно продемонстрированно в таблице 1.

Таблица 1 зависимость асимптотики от способа реализации алгоритма

Способ представления графа и приоритетной очереди

Асимптотика

Массив d, списки смежности (матрица смежности)

O(V2)

Бинарная пирамида, списки смежности

O((V+E) log V) = O(E log V)

Фибоначчиева пирамида, списки смежности

O(E+V log V)

4.Тестирование программ реализации алгоритмов

4.1 Тестирование правильности

В таблице 2 приведён протокол тестирования правильности работы программы, по алгоритму Прима. В входных данных вводится матрица смежности, в выходных данных ожидается получить суммарный вес контура и минимальное остовное дерево.

Таблица 2 протокол тестирования правильности

п/п

Входные данные

Выходные данные

Тест

Ожидаемый результат

Действительный результат

Cost[4][4]

_mincost

МОД

_mincost

МОД

1

0 5 9 12

11 0 4 0

1 0 0 11

14 9 0 0

20

Ребро 1:(1 2) вес:5

Ребро 2:(2 3) вес:4

Ребро 3:(3 4) вес:11

20

Ребро 1:(1 2) вес:5

Ребро 2:(2 3) вес:4

Ребро 3:(3 4) вес:11

+

2

0 14 12 12

6 0 2 12

10 11 0 8

12 1 5 0

21

Ребро 1:(1 3) вес:12

Ребро 2:(3 4) вес:8

Ребро 3:(4 2) вес:1

21

Ребро 1:(1 3) вес:12

Ребро 2:(3 4) вес:8

Ребро 3:(4 2) вес:1

+

В таблице 3 приведён протокол тестирования правильности работы программы по алгоритму Крускала. В входных данных вводится матрица смежности, в выходных данных ожидается получить минимальное остовное дерево.

Таблица 3 протокол тестирования правильности

п/п

Входные данные

Выходные данные

Тест

Ожидаемый результат

Действительный результат

Cost[4][4]

МОД

МОД

1

0 5 9 12

11 0 4 0

1 0 0 11

14 9 0 0

Ребро 1 –> 2

Ребро2–> 3

Ребро 3–> 4

Ребро 1 –> 2

Ребро2–> 3

Ребро 3–> 4

+

2

0 14 12 12

6 0 2 12

10 11 0 8

12 1 5 0

Ребро 1 –> 3

Ребро3–> 4

Ребро 4–> 2

Ребро 1 –> 3

Ребро3–> 4

Ребро 4–> 2

+

4.2 Анализ по времени

Анализ по времени проводится функцией clock() из стандартной библиотеки <time.h>. Длины ребер задаем с помощью функции rand() из той же библиотеки <time.h>, длины этих ребер будут варьироваться от 0 до 15. Ниже на рисунке 7 представлена диаграмма роста функции f(t)=N, где t – время работы программы, а N – количество вершин. Жирным выделен график роста функции алгоритма Прима, а тонким выделен график роста функции алгоритма Крускала.

Рисунок 6 – Диаграмма роста функции

Заключение

В ходе реализации алгоритма, были применены теоретические и практические знания полученные за период обучения.

Теория графов применяется во многих областях человеческой деятельности для формализации информации и выявления скрытых закономерностей. На примере задачи оминимальном остовом дереве можно видеть, что теоретико-графовые алгоритмы легко и в виде, удобном для восприятия, переводятся на декларативные языки, при этом эффективность реализации лишь в некоторых случаях уступает реализациям на императивных языках программирования. Также можно отметить, что все инструкции программы направлены исключительно на решение задачи, отсутствуют операции приведения типов, присваивания и т.п., что значительно сокращает количество возможных ошибок. Т.о., декларативные языки программирования являются мощным и удобным инструментом решения задач.

Источник: https://files.student-it.ru/previewfile/5143