- •Элементарные алгоритмы для работы с графами
- •Работа алгоритма[править | править вики-текст]
- •Неформальное описание[править | править вики-текст]
- •Формальное описание[править | править вики-текст]
- •Алгоритм поиска в глубину[править | править вики-текст]
- •Нерекурсивные варианты[править | править вики-текст]
- •Общая идея
- •[Править]Пошаговое представление
- •[Править]Реализация
- •[Править]Время работы
- •[Править]Цвета вершин
- •Топологическая сортировка и сильно связные компоненты
- •↑ Пример ориентированного неотсортированного графа, к которому применима топологическая сортировка
- •Пример работы алгоритма[править | править вики-текст]
- •Алгоритмы[править | править вики-текст]
- •Минимальные остовные деревья (мst)
- •Введение
- •Постановка задачи
- •Кратчайшие пути
- •Давайте придумаем что-нибудь простое
- •А если я педант?
- •Задача о максимальном потоке
- •[Править]Определение потока
- •[Править]Пример
- •Увеличивающие пути. Теорема Бержа
- •Алгоритм Эдмондса. Сжатие цветков
- •Эффективная реализация
- •Оптимизация: предварительное построение паросочетания
- •Случай двудольного графа
- •Дальнейшая оптимизация
- •[Править]Реализация
- •[Править]Оценка производительности
- •[Править]Пример несходящегося алгоритма
- •[Править]Оценка быстродействия
- •[Править]Литература
- •Максимальные паросочетания[править | править вики-текст]
- •Описание алгоритма Необходимые определения
- •Теорема Бержа
- •Алгоритм Куна
- •Время работы
- •Реализация
- •Улучшенная реализация
- •[Править]Постановка задачи
- •[Править]Решение
- •[Править]Псевдокод
- •Префиксы и суффиксы строки
- •Прямые переходы
- •[Править]Суффиксные ссылки
- •Основные определения и описание структуры[править | править вики-текст]
- •Свойства суффиксных деревьев[править | править вики-текст]
- •Требования суффиксного дерева к памяти[править | править вики-текст]
- •[Править]Недостатки
- •Метод хеширования
- •[Править]Алгоритм
- •[Править]Псевдокод
- •[Править]Время работы
- •[Править]Надёжность
- •Автоматные модели в программировании
- •[Править]Переходы между состояниями [править]Прямые переходы
- •[Править]Суффиксные ссылки
- •[Править]Псевдокод
- •[Править]Пример использования
- •[Править]Псевдокод
- •[Править]Пример
- •[Править]Время работы
- •[Править]Эффективный алгоритм
- •[Править]Псевдокод
- •[Править]Время работы
- •[Править]Построение префикс-функции по z-функции [править]Постановка задачи
- •[Править]Описание алгоритма
- •Приближенные алгоритмы решения np-трудных задач
Элементарные алгоритмы для работы с графами
Основные определения (ориентированный/неориентированный граф, входящая/исходящая степень вершины, инцидентность ребра вершине, петли, кратные ребра и т.п.)
Ориентированный граф (кратко орграф) — (мульти) граф, рёбрам которого присвоено направление. Направленные рёбра именуются также дугами, а в некоторых источниках и просто рёбрами.
неориентированный граф (кратко орграф) — (мульти) граф, рёбрам которого не присвоено направление.
Степень
вершины (англ. degree,
также валентность, англ. valency)
в теории
графов —
количество рёбер графа
, инцидентных вершине
.
При подсчёте степени ребро-петля учитывается
дважды.[1] Степень
вершины обозначается как
Входящая степень вершины v это количество ребер вида (i, v), то есть количество ребер которые «входят» в v. Исходящая степень вершины v это количество ребер вида (v , i), то есть количество ребер которые «выходят» из v
Кратные рёбра — несколько рёбер, инцидентных одной и той же паре вершин. Встречаются в мультиграфах.
Петля — ребро, начало и конец которого находятся в одной и той же вершине.
Списки смежности (структура, объем памяти, время доступа к ребру, для каких графов эффективнее)
Данный способ представления больше подходит для разреженных графов, то есть графов у которых количество рёбер гораздо меньше чем количество вершин в квадрате (|E| << |V|2). В данном представлении используется массив Adj содержащий |V| списков. В каждом списке Adj[v] содержатся все вершины u, так что между v и u есть ребро. Память требуемая для представления равна O (|E| + |V|) что является лучшим показателем чем матрица смежности для разреженных графов. Главный недостаток этого способа представления в том, что нет быстрого способа проверить существует ли ребро (u, v).
Матрица смежности (структура, объем памяти, время доступа к ребру, для каких графов эффективнее)
Матрица смежности — один из способов представления графа в виде матрицы.
Матрица смежности графа G с конечным числом вершин n (пронумерованных числами от 1 до n) — это квадратная матрица A размера n, в которой значение элемента aij равно числу рёбер из i-й вершины графа в j-ю вершину.
Использование
матрицы смежности предпочтительно
только в случае
неразреженных графов,
с большим числом рёбер, так как она
требует хранения по одному биту данных
для каждого элемента. Если граф разрежён,
то большая часть памяти напрасно будет
тратиться на хранение нулей, зато в
случае неразреженных графов матрица
смежности достаточно компактно
представляет граф в памяти, используя
примерно
бит
памяти,
что может быть на порядок лучше списков
смежности.
Время доступа O(n)
Поиск в ширину (алгоритм, время работы, поиск кратчайшего пути в невзвешенном графе)
Работа алгоритма[править | править вики-текст]
Поиск
в ширину работает путём последовательного
просмотра отдельных уровней графа,
начиная с узла-источника
.
Рассмотрим
все рёбра
,
выходящие из узла
.
Если очередной узел
является
целевым узлом, то поиск завершается; в
противном случае узел
добавляется
в очередь.
После того, как будут проверены все
рёбра, выходящие из узла
,
из очереди извлекается следующий узел
,
и процесс повторяется.
