Использование обхода в глубину для топологической сортировки — различия между версиями
м |
м (→Алгоритм) |
||
| Строка 20: | Строка 20: | ||
Из определения функции <tex>\varphi</tex> мгновенно следует алгоритм топологической сортировки: | Из определения функции <tex>\varphi</tex> мгновенно следует алгоритм топологической сортировки: | ||
| − | + | <font color=green>// <tex>G</tex> {{---}} исходный граф</font> | |
| − | + | '''function''' <tex>\mathtt{topologicalSort}():</tex> | |
| − | + | <tex>fill(\mathtt{visited}, false)</tex> | |
| − | + | '''for''' <tex>v \in V(G)</tex> | |
| − | + | '''if''' '''not''' <tex>\mathtt{visited}[v] </tex> | |
| − | + | <tex>\mathtt{dfs}(v) </tex> | |
| − | + | <tex>\mathtt{ans}.\mathtt{reverse}() </tex> | |
| − | + | ||
| − | + | ||
| + | '''function''' <tex>\mathtt{dfs}(u):</tex> | ||
| + | <tex>\mathtt{visited}[u] = true </tex> | ||
| + | '''for''' <tex>uv \in E(G)</tex> | ||
| + | '''if''' '''not''' <tex>\mathtt{visited}[v] </tex> | ||
| + | <tex>\mathtt{dfs}(v) </tex> | ||
| + | <tex>\mathtt{ans}.\mathtt{pushBack}(u) </tex> | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
Время работы этого алгоритма соответствует времени работы алгоритма поиска в глубину, то есть равно <tex>O(V+E)</tex>. | Время работы этого алгоритма соответствует времени работы алгоритма поиска в глубину, то есть равно <tex>O(V+E)</tex>. | ||
Версия 20:04, 11 января 2015
Топологическая сортировка ориентированного ациклического графа представляет собой упорядочение вершин таким образом, что для любого ребра номер вершины меньше номера вершины .
Содержание
Применение
Топологическая сортировка применяется в самых разных ситуациях, например при создании параллельных алгоритмов, когда по некоторому описанию алгоритма нужно составить граф зависимостей его операций и, отсортировав его топологически, определить, какие из операций являются независимыми и могут выполняться параллельно (одновременно). Примером использования топологической сортировки может служить создание карты сайта, где имеет место древовидная система разделов. Также топологическая сортировка применяется при обработке исходного кода программы в некоторых компиляторах и IDE, где строится граф зависимостей между сущностями, после чего они инициализируются в нужном порядке, либо выдается ошибка о циклической зависимости.
Постановка задачи
| Теорема: | ||||||
— ациклический ориентированный граф, тогда | ||||||
| Доказательство: | ||||||
|
Определим как порядковый номер окраски вершины в черный цвет в результате работы алгоритма dfs. Рассмотрим функцию . Очевидно, что такая функция подходит под критерий функции из условия теоремы, если выполняется следующее утверждение:
| ||||||
Алгоритм
Из определения функции мгновенно следует алгоритм топологической сортировки:
// — исходный граф function for if not
function for if not
Время работы этого алгоритма соответствует времени работы алгоритма поиска в глубину, то есть равно .
Источники
- Томас Кормен, Чарльз Лейзерсон, Рональд Ривест, Клиффорд Штайн. Алгоритмы: построение и анализ, второе издание. Пер. с англ. — Издательский дом "Вильямс", 2007. — 1296 с. — Глава 22. Элементарные алгоритмы для работы с графами.
- Топологическая сортировка на habrahabr