π 10 Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π³ΡΠ°ΡΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°ΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡ
Знакомимся с десятью маст-хэв для каждого кодера алгоритмами, которые будут полезными для работы с графами (исходный код прилагается). Данная статья является переводом. Ссылка на оригинальную статью. Графовые алгоритмы представляют собой последовательность шагов для обхода графа через вершины (узлы). Некоторые алгоритмы используются для поиска определенного узла или пути между двумя заданными узлами. Данные алгоритмы применяют на сайтах социальных сетей, в моделировании конечного автомата, а также во многих других сферах. Я приложил свой исходный код для всех алгоритмов, про которые мы будем говорить ниже. Поиск в ширину — это рекурсивный алгоритм поиска всех вершин графа или дерева. Обход начинается с корневого узла и затем алгоритм исследует все соседние узлы. Затем выбирается ближайший узел и исследуются все неисследованные узлы. При использовании BFS для обхода любой узел графа можно считать корневым узлом. Простой алгоритм для BFS, который нужно запомнить: Схематическое представление обхода BFS: Поиск в ширину (Breadth First Searching) Ссылка на код: Поиск в ширину Поиск в глубину или обход в глубину — это рекурсивный алгоритм поиска всех вершин графа или древовидной структуры данных. Алгоритм поиска в глубину (DFS) осуществляет поиск вглубь графа, а также использует стек, чтобы не забыть «получить» следующую вершину для начала поиска, когда на любой итерации возникает тупик. Простой алгоритм, который нужно запомнить, для DFS: Схематическое представление обхода DFS: Поиск в глубину (Depth First Searching) Ссылка на код: Поиск в глубину Если хочешь подтянуть свои знания по алгоритмам, загляни на наш курс «Алгоритмы и структуры данных», на котором ты: Интересно, хочу попробовать Топологическая сортировка для ориентированного ациклического графа (DAG) — это линейное упорядочивание вершин, при котором вершина Для одного графа может применяться более одной топологической сортировки. Простой алгоритм, который следует запомнить, для топологической сортировки: 1. Отметьте 2. Для всех вершин 2.1. Если 2.2. Выполняем 2.3. Цикл выполнен 3. Запишите Схематическое представление топологической сортировки: Топологическая сортировка (Topological Sorting) Пример топологической сортировки для этого графа: 5 → 4 → 2 → 3 → 1 → 0 Ссылка на код: Топологическая сортировка Алгоритм топологической сортировки Кана — это алгоритм обнаружения циклов на базе эффективной топологической сортировки. Работа алгоритма осуществляется путем нахождения вершины без входящих в нее ребер и удаления всех исходящих ребер из этой вершины. Ссылка на код: Обнаружение цикла с использованием алгоритма Кана Алгоритм Дейкстры позволяет найти кратчайший путь между любыми двумя вершинами графа. Он отличается от минимального остовного дерева тем, что кратчайшее расстояние между двумя вершинами может не включать все вершины графа. Ниже проиллюстрирован алгоритм кратчайшего пути с одним источником. Здесь наличие одного источника означает, что мы должны найти кратчайший путь от источника ко всем узлам. После применения алгоритма Дейкстры: Алгоритм Дейкстры (Dijkstra’s Algorithm) Ссылка на код: Алгоритм Дейкстры Алгоритм Беллмана-Форда помогает нам найти кратчайший путь от вершины ко всем другим вершинам взвешенного графа. Он похож на алгоритм Дейкстры, но может обнаруживать графы, в которых ребра могут иметь циклы с отрицательным весом. Алгоритм Дейкстры (не обнаруживает цикл с отрицательным весом) может дать неверный результат, потому что проход через цикл с отрицательным весом приведет к уменьшению длины пути. Дейкстра не применим для графиков с отрицательными весами, а Беллман-Форд, наоборот, применим для таких графиков. Беллман-Форд также проще, чем Дейкстра и хорошо подходит для систем с распределенными параметрами. Алгоритм Беллмана-Форда (Bellman Ford’s Algorithm) Результат алгоритма Беллмана-Форда: Результат алгоритма Беллмана-Форда Ссылка на код: Алгоритм Беллмана Форда Алгоритм Флойда-Уоршалла — это алгоритм поиска кратчайшего пути между всеми парами вершин во взвешенном графе. Этот алгоритм работает как для ориентированных, так и для неориентированных взвешенных графов. Но это не работает для графов с отрицательными циклами (где сумма ребер в цикле отрицательна). Здесь будет использоваться концепция динамического программирования. Алгоритм, лежащий в основе алгоритма Флойда-Уоршалла: Dij(k) ← min ( Dij(k-1), Dij(k-1)+Dkj(k-1)) Ссылка на код: Алгоритм Флойда-Уоршалла Алгоритм Прима — это жадный алгоритм, который используется для поиска минимального остовного дерева из графа. Алгоритм Прима находит подмножество ребер, которое включает каждую вершину графа, так что сумма весов ребер может быть минимизирована. Простой алгоритм для алгоритма Прима, который следует запомнить: Получим: Алгоритм Прима (Prim’s Algorithm) Ссылка на код: Алгоритм Прима Алгоритм Краскала используется для нахождения минимального остовного дерева для связного взвешенного графа. Основная цель алгоритма — найти подмножество ребер, с помощью которых мы можем обойти каждую вершину графа. Он является жадным алгоритмом, т. к. находит оптимальное решение на каждом этапе вместо поиска глобального оптимума. Простой алгоритм Краскала, который следует запомнить: Ссылка на код: Алгоритм Краскала Если мы можем достичь каждой вершины компонента из любой другой вершины этого компонента, то он называется сильно связанным компонентом (SCC). Одиночный узел всегда является SCC. Алгоритм Флойда-Уоршалла относится к методам полного перебора. Но для получения наилучшей временной сложности мы можем использовать алгоритм Косараджу. Простой алгоритм Косараджу, который следует запомнить: Получим: Алгоритм Косараджу (Kosaraju’s Algorithm) Ссылка на код: Алгоритм Косараджу В этой статье мы познакомились с самыми важными алгоритмами, которые должен знать каждый программист, работающий с графами. Если хотите подтянуть или освежить знания по алгоритмам и структурам данных, загляни на наш курс «Алгоритмы и структуры данных», который включает в себя: Интересно, хочу попробовать *** Зачем вообще изучать графовые алгоритмы?
1. Поиск в ширину (Breadth First Searching)
2. Поиск в глубину (Depth First Searching)
3. Топологическая сортировка (Topological Sorting)
u
предшествует v
для каждого направленного ребра uv
(в порядке очереди). Топологическая сортировка для графа невозможна, если граф не является DAG.u
как посещеннуюv
, смежных с u
, выполните:v
не посещенная, то:TopoSort
(не забывая про стек)u
в стек4. Обнаружение цикла с помощью алгоритма Кана (Kahn’s Algorithm)
5. Алгоритм Дейкстры (Dijkstra’s Algorithm)
6. Алгоритм Беллмана-Форда (Bellman Ford’s Algorithm)
7. Алгоритм Флойда-Уоршалла (Floyd-Warshall Algorithm)
8. Алгоритм Прима (Prim’s Algorithm)
9. Алгоритм Краскала (Kruskal’s Algorithm)
10. Алгоритм Косараджу (Kosaraju’s Algorithm)
Материалы по теме
- 5 views
- 0 Comment