Алгоритм Прима
В данной статье я бы хотел объяснить работу алгоритма Прима. Алгоритм используется для нахождения минимального остовного дерева. Сам алгоритм очень прост, в статье хотел бы поделиться своей реализации на языке Go.
Начальные термины
- Граф — это структура данных в которой хранятся вершины и связи между ними. Удобнее всего представлять графы в виде матрицы смежности.
- Матрица смежности — эта квадратная матрица, размер матрицы равен количеству вершин в графе. В ней хранится информация о соседях вершин графа.
- Минимальное остовное дерево — это поиск минимального количества ребер, чтобы из одной любой вершины графа попасть в любую другую вершину графа. Не стоит забывать про отсутствие циклов в дереве.
- Приоритетная очередь — по структура данных, внутри которой, в отличие от обычной очереди элементы отсортирированы по приоритету (в нашем случае по весу). Элементы с наивысшим приоритетом извлекаются первыми.
Описание работы алгоритма
- Структура Graph: Структура содержит внутри себя двумерный срез (матрица смежности).
- NewGraph: Конструктор для создания Graph.
- AddEdge: Функция для добавления соседей вершины.
Структура Graph
Для реализации приоритетной очереди мы используем структуру данных под названием куча (heap) из пакета стандартной библиотеки container/heap. Для этого нам нужно реализовать методы Len(), Less(), Swap(), Push(), Pop().
Реализация PriorityQueue
Начальные условия:
- Срез вершин unvisited, в котором хранятся все вершины.
- Приоритетная очередь, которая отвечает за поиск соседа с минимальным весом.
- Матрица смежности, в которой мы записываем получившееся минимальное остовное дерево.
Шаг 1: Из слайса unvisited выбираем случайную вершину. У этой вершины просматриваем всех соседей и выбираем соседа с минимальным весом ребра. Добавляем выбранную вершину в слайс visited.
Шаг 2 и последующие: У вершин из слайса unvisited просматриваем всех соседей и выбираем соседа с минимальным весом ребра. Добавляем выбранную вершину в слайс visited.Проделываем шаги до тех пор, пока слайс unvisited не окажется пустым.
Результатом работы алгоритма является остовное дерево минимальной стоимости, а точнее её матрица смежности.
Алгоритм Прима
Полное и подробное описание работы алгоритма можно найти в моем GitHub.
Если вам нравится, как и о чем я пишу – то буду благодарен за подписку на мой ТГ-канал Go Alive (так вы точно не пропустите новые статьи).