Участник:Обидин Дмитрий

Материал из Letopisi.Ru — «Время вернуться домой»
(Различия между версиями)
Перейти к: навигация, поиск
Строка 1: Строка 1:
  
Предлагаю вашему вниманию граф "Использования изоленты"
+
10 Графовых алгоритмов
 +
 
 +
Графы превратились в невероятно сильное средство моделирования и получения данных из соцсетей, веб-страниц и ссылок, а также определения местоположения и маршрутов в GPS. Любой набор объектов, которые связаны друг с другом, можно сейчас представить с помощью графа.
 +
 
 +
В статье опишем 10 основных графовых алгоритмов, которые становятся очень полезными для анализа, а также области их применения.
 +
 
 +
Начнём с того, что приведём определение графа.
 +
 
 +
Что такое граф?
 +
Граф состоит из конечного множества вершин (узлов) и набора рёбер, соединяющих эти вершины. Две вершины считаются смежными, если они соединены друг с другом одним и тем же ребром.
 +
 
 +
Порядок: число вершин в графе.
 +
Размер: число рёбер в графе.
 +
Степень вершины: число рёбер, инцидентных вершине.
 +
Изолированная вершина: вершина, которая не связана ни с одной другой вершиной графа.
 +
Петля: ребро, вершины которого совпадают.
 +
Ориентированный граф: граф, в котором все рёбра имеют направление, определяющее начальную и конечную вершину.
 +
Неориентированный граф: граф с рёбрами, которые не имеют направления.
 +
Взвешенный граф: рёбра такого графа имеют определённый вес.
 +
Невзвешенный граф: рёбра такого графа не имеют никаких весов.
 +
 
 +
1. Поиск в ширину
 +
 
 +
Обход или поиск  —  это одна из фундаментальных операций, выполняемых на графах. Поиск в ширину начинается с определённой вершины, затем исследуются все её соседи на данной глубине и происходит переход к вершинам следующего уровня. В графах, в отличие от деревьев, могут быть циклы  —  пути, в которых первая и последняя вершины совпадают. Поэтому необходимо отслеживать посещённые алгоритмом вершины. При реализации алгоритма поиска в ширину используется структура данных «очередь».
 +
 
 +
.
 +
 
 +
Применяется для:
 +
определения кратчайших путей и минимальных остовных деревьев;
 +
индексации веб-страниц поисковыми ботами;
 +
поиска в соцсетях;
 +
нахождения доступных соседних узлов в одноуровневых сетях, таких как BitTorrent.
 +
 
 +
Поиск в глубину начинается с определённой вершины, затем уходит как можно дальше вдоль каждой ветви и возвращается обратно. Здесь тоже необходимо отслеживать посещённые алгоритмом вершины. Для того, чтобы стало возможным возвращение обратно, при реализации алгоритма поиска в глубину используется структура данных «стек».
 +
 
 +
Применяется:
 +
для нахождения пути между двумя вершинами;
 +
для обнаружения циклов на графе;
 +
в топологической сортировке;
 +
в головоломках с единственным решением (например, лабиринтах).
 +
 
 +
3. Кратчайший путь
 +
Кратчайший путь от одной вершины графа к другой  —  это путь, при котором сумма весов рёбер, его составляющих, должна быть минимальна.
 +
 
 +
На рисунке 4 показан кратчайший путь на графе от вершины 1 до вершины 6.
 +
 
 +
Алгоритмы нахождения кратчайшего пути:
 +
Алгоритм Дейкстры.
 +
Алгоритм Беллмана-Форда.
 +
Применяются в:
 +
картографических сервисах типа Google maps или Apple maps для прокладки маршрутов и определения местоположения;
 +
сетях для решения проблемы минимальной задержки пути;
 +
абстрактных автоматах для определения через переход между различными состояниями возможных вариантов достижения некоторого целевого состояния, например минимально возможного количества ходов, необходимого для победы в игре.
 +
 
 +
4. Обнаружение циклов
 +
 
 +
Цикл  —  это путь, в котором первая и последняя вершины графа совпадают. То есть путь, начинающийся и завершающийся в одной и той же вершине, называется циклом. Обнаружение циклов  —  это процесс выявления таких циклов.
 +
 
 +
Алгоритмы обнаружения цикла:
 +
Алгоритм Флойда.
 +
Алгоритм Брента.
 +
Применяются:
 +
в распределённых алгоритмах, использующих сообщения;
 +
для обработки крупных графов с использованием распределённой системы обработки в кластере;
 +
для обнаружения взаимоблокировок в системах с параллельным выполнением;
 +
в криптографических приложениях для выявления ключей сообщения, которые могут соответствовать одному и тому же зашифрованному значению.
 +
 
 +
5. Минимальное остовное дерево
 +
 
 +
Минимальное остовное дерево  —  это подмножество рёбер графа, которое соединяет все вершины, имеющие минимальную сумму весов рёбер, и без циклов.
 +
 
 +
Алгоритмы поиска минимального остовного дерева:
 +
Алгоритм Прима.
 +
Алгоритм Крускала.
 +
Применяются:
 +
для создания деревьев для распределения данных в компьютерных сетях;
 +
в кластерном анализе с использованием графов;
 +
при сегментации изображений;
 +
при социально-географическом районировании, когда смежные регионы объединяются.
 +
 
 +
6. Сильно связные компоненты
 +
 
 +
Граф считается сильно связным, если все вершины в графе достижимы из всех остальных вершин.
 +
 
 +
Алгоритмы поиска сильных компонент связности:
 +
Алгоритм Косараджу.
 +
Алгоритм Тарьяна.
 +
Применяются:
 +
для вычисления декомпозиции Далмейджа-Мендельсона, которая представляет собой разделение вершин двудольного графа на подмножества;
 +
в соцсетях для поиска групп сильно связанных между собой людей и выдачи рекомендаций на основе общих интересов.
 +
 
 +
7. Топологическая сортировка
 +
 
 +
Топологическая сортировка графа  —  это такое линейное упорядочение его вершин, в котором для каждого направленного ребра, например (u, v), вершина u предшествует вершине v.
 +
 
 +
Алгоритмы поиска топологической сортировки:
 +
Алгоритм Кана.
 +
Алгоритм на основе поиска в глубину.
 +
Применяются:
 +
при планировании выполнения команд;
 +
при сериализации данных;
 +
определения порядка выполняемых при компиляции задач в Makefiles;
 +
для разрешения зависимостей символов в компоновщиках.
 +
 
 +
8. Раскраска графов
 +
 
 +
При раскраске графов элементам графа присваиваются цвета с учётом определённых условий. Раскраска вершин  —  наиболее часто используемый метод окраски графов. При этом вершины графа окрашиваются с использованием k цветов, а любым двум соседним вершинам должны соответствовать разные цвета. Другие методы окраски  —  раскраска рёбер и раскраска граней.
 +
 
 +
Хроматическое число графа  —  это наименьшее количество цветов, необходимых для окрашивания графа.
 +
Алгоритмы с раскраской графов:
 +
Алгоритмы, использующие поиск в ширину или поиск в глубину.
 +
Жадная раскраска.
 +
Применяются для:
 +
составления расписаний;
 +
назначения радиочастот мобильных сетей;
 +
моделирования и решения головоломок типа судоку;
 +
проверки того, является ли граф двудольным;
 +
раскрашивания географических карт стран или штатов, на которых соседние страны или штаты имеют разные цвета.
 +
 
 +
9. Максимальный поток
 +
Можно смоделировать граф в виде сети потоков с весами рёбер в качестве пропускной способности этих потоков. В задаче максимального потока требуется найти такой путь потока, который может обеспечить максимально интенсивность потока.
 +
 
 +
Алгоритмы нахождения максимального потока:
 +
Алгоритм Форда-Фулкерсона.
 +
Алгоритм Эдмондса-Карпа.
 +
Алгоритм Диница.
 +
Применяются:
 +
в авиакомпаниях для составления полётного расписания экипажей;
 +
при сегментации изображений для определения фона и переднего плана изображения.
 +
 
 +
10. Паросочетания
 +
 
 +
Паросочетание на графе  —  это набор рёбер, которые не имеют общих вершин (т.е. хотя бы двух рёбер, не имеющих общей вершины). Паросочетание называется максимальным, если оно содержит максимально возможное число рёбер, сочетающихся с как можно большим количеством вершин.
 +
 
 +
Алгоритмы нахождения паросочетаний:
 +
Алгоритм Хопкрофта-Карпа.
 +
Венгерский алгоритм.
 +
Алгоритм сжатия цветков.
 +
Применяются:
 +
в подборе пары для жениха или невесты (задача о стабильных браках);
 +
для определения вершинного покрытия;
 +
в теории транспорта для решения задачи распределения ресурсов и оптимизации перевозок.
 +
 
 +
Примеры графов
 
<graphviz>
 
<graphviz>
 
digraph G {
 
digraph G {

Версия 10:19, 22 декабря 2020

10 Графовых алгоритмов

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

В статье опишем 10 основных графовых алгоритмов, которые становятся очень полезными для анализа, а также области их применения.

Начнём с того, что приведём определение графа.

Что такое граф? Граф состоит из конечного множества вершин (узлов) и набора рёбер, соединяющих эти вершины. Две вершины считаются смежными, если они соединены друг с другом одним и тем же ребром.

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

1. Поиск в ширину

Обход или поиск  —  это одна из фундаментальных операций, выполняемых на графах. Поиск в ширину начинается с определённой вершины, затем исследуются все её соседи на данной глубине и происходит переход к вершинам следующего уровня. В графах, в отличие от деревьев, могут быть циклы  —  пути, в которых первая и последняя вершины совпадают. Поэтому необходимо отслеживать посещённые алгоритмом вершины. При реализации алгоритма поиска в ширину используется структура данных «очередь».

.

Применяется для: определения кратчайших путей и минимальных остовных деревьев; индексации веб-страниц поисковыми ботами; поиска в соцсетях; нахождения доступных соседних узлов в одноуровневых сетях, таких как BitTorrent.

Поиск в глубину начинается с определённой вершины, затем уходит как можно дальше вдоль каждой ветви и возвращается обратно. Здесь тоже необходимо отслеживать посещённые алгоритмом вершины. Для того, чтобы стало возможным возвращение обратно, при реализации алгоритма поиска в глубину используется структура данных «стек».

Применяется: для нахождения пути между двумя вершинами; для обнаружения циклов на графе; в топологической сортировке; в головоломках с единственным решением (например, лабиринтах).

3. Кратчайший путь Кратчайший путь от одной вершины графа к другой  —  это путь, при котором сумма весов рёбер, его составляющих, должна быть минимальна.

На рисунке 4 показан кратчайший путь на графе от вершины 1 до вершины 6.

Алгоритмы нахождения кратчайшего пути: Алгоритм Дейкстры. Алгоритм Беллмана-Форда. Применяются в: картографических сервисах типа Google maps или Apple maps для прокладки маршрутов и определения местоположения; сетях для решения проблемы минимальной задержки пути; абстрактных автоматах для определения через переход между различными состояниями возможных вариантов достижения некоторого целевого состояния, например минимально возможного количества ходов, необходимого для победы в игре.

4. Обнаружение циклов

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

Алгоритмы обнаружения цикла: Алгоритм Флойда. Алгоритм Брента. Применяются: в распределённых алгоритмах, использующих сообщения; для обработки крупных графов с использованием распределённой системы обработки в кластере; для обнаружения взаимоблокировок в системах с параллельным выполнением; в криптографических приложениях для выявления ключей сообщения, которые могут соответствовать одному и тому же зашифрованному значению.

5. Минимальное остовное дерево

Минимальное остовное дерево  —  это подмножество рёбер графа, которое соединяет все вершины, имеющие минимальную сумму весов рёбер, и без циклов.

Алгоритмы поиска минимального остовного дерева: Алгоритм Прима. Алгоритм Крускала. Применяются: для создания деревьев для распределения данных в компьютерных сетях; в кластерном анализе с использованием графов; при сегментации изображений; при социально-географическом районировании, когда смежные регионы объединяются.

6. Сильно связные компоненты

Граф считается сильно связным, если все вершины в графе достижимы из всех остальных вершин.

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

7. Топологическая сортировка

Топологическая сортировка графа  —  это такое линейное упорядочение его вершин, в котором для каждого направленного ребра, например (u, v), вершина u предшествует вершине v.

Алгоритмы поиска топологической сортировки: Алгоритм Кана. Алгоритм на основе поиска в глубину. Применяются: при планировании выполнения команд; при сериализации данных; определения порядка выполняемых при компиляции задач в Makefiles; для разрешения зависимостей символов в компоновщиках.

8. Раскраска графов

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

Хроматическое число графа  —  это наименьшее количество цветов, необходимых для окрашивания графа. Алгоритмы с раскраской графов: Алгоритмы, использующие поиск в ширину или поиск в глубину. Жадная раскраска. Применяются для: составления расписаний; назначения радиочастот мобильных сетей; моделирования и решения головоломок типа судоку; проверки того, является ли граф двудольным; раскрашивания географических карт стран или штатов, на которых соседние страны или штаты имеют разные цвета.

9. Максимальный поток Можно смоделировать граф в виде сети потоков с весами рёбер в качестве пропускной способности этих потоков. В задаче максимального потока требуется найти такой путь потока, который может обеспечить максимально интенсивность потока.

Алгоритмы нахождения максимального потока: Алгоритм Форда-Фулкерсона. Алгоритм Эдмондса-Карпа. Алгоритм Диница. Применяются: в авиакомпаниях для составления полётного расписания экипажей; при сегментации изображений для определения фона и переднего плана изображения.

10. Паросочетания

Паросочетание на графе  —  это набор рёбер, которые не имеют общих вершин (т.е. хотя бы двух рёбер, не имеющих общей вершины). Паросочетание называется максимальным, если оно содержит максимально возможное число рёбер, сочетающихся с как можно большим количеством вершин.

Алгоритмы нахождения паросочетаний: Алгоритм Хопкрофта-Карпа. Венгерский алгоритм. Алгоритм сжатия цветков. Применяются: в подборе пары для жениха или невесты (задача о стабильных браках); для определения вершинного покрытия; в теории транспорта для решения задачи распределения ресурсов и оптимизации перевозок.

Примеры графов

Персональные инструменты
Инструменты