Использование обхода в глубину для топологической сортировки — различия между версиями
Glukos (обсуждение | вклад) (→Применение) |
(→Постановка задачи) |
||
Строка 9: | Строка 9: | ||
|proof= | |proof= | ||
Определим <tex>leave[u]</tex> как порядковый номер окраски вершины <tex>u</tex> в черный цвет в результате работы [[Обход в глубину, цвета вершин|алгоритма dfs]]. Рассмотрим функцию <tex>\varphi = n + 1 - leave[u] </tex>. Очевидно, что такая функция подходит под критерий функции <tex>\varphi</tex> из условия теоремы, если выполняется следующее утверждение: | Определим <tex>leave[u]</tex> как порядковый номер окраски вершины <tex>u</tex> в черный цвет в результате работы [[Обход в глубину, цвета вершин|алгоритма dfs]]. Рассмотрим функцию <tex>\varphi = n + 1 - leave[u] </tex>. Очевидно, что такая функция подходит под критерий функции <tex>\varphi</tex> из условия теоремы, если выполняется следующее утверждение: | ||
− | {{ | + | {{Лемма |
|statement=<tex>G</tex> — ациклический ориентированный граф, тогда <tex>uv \in E \Rightarrow leave[u] > leave[v]</tex> | |statement=<tex>G</tex> — ациклический ориентированный граф, тогда <tex>uv \in E \Rightarrow leave[u] > leave[v]</tex> | ||
|proof= | |proof= |
Версия 11:23, 17 января 2012
Топологическая сортировка ориентированного ациклического графа представляет собой такое линейное упорядочение всех его вершин, что если , то при таком упорядочении располагается до (если граф не является ациклическим, такая сортировка невозможна).
Содержание
Применение
Топологическая сортировка применяется в самых разных ситуациях, например при создании параллельных алгоритмов, когда по некоторому описанию алгоритма нужно составить граф зависимостей его операций и, отсортировав его топологически, определить, какие из операций являются независимыми и могут выполняться параллельно (одновременно). Примером использования топологической сортировки может служить создание карты сайта, где имеет место древовидная система разделов. Также топологическая сортировка применяется при обработке исходного кода программы в некоторых компиляторах и IDE, где строится граф зависимостей между сущностями, после чего они инициализируются в нужном порядке, либо выдается ошибка о циклической зависимости.
Постановка задачи
Теорема: | ||||||
— ациклический ориентированный граф, тогда | ||||||
Доказательство: | ||||||
Определим алгоритма dfs. Рассмотрим функцию . Очевидно, что такая функция подходит под критерий функции из условия теоремы, если выполняется следующее утверждение: как порядковый номер окраски вершины в черный цвет в результате работы
| ||||||
Алгоритм
Из определения функции
мгновенно следует алгоритм топологической сортировки:doTopSort(graph G) { fill(visited, false); time = 0; for (vertex v : v in graph G) { if (!visited[v]) { dfs(v); } } }
dfs(vertex u) { visited[u] = true; for (vertex v : exists edge uv) { if (!visited[v]) { dfs(v); } } topSortAnswer[u] = n - time++; }
Время работы этого алгоритма соответствует времени работы алгоритма поиска в глубину, то есть равно
.Источники
- Томас Кормен, Чарльз Лейзерсон, Рональд Ривест, Клиффорд Штайн. Алгоритмы: построение и анализ, второе издание. Пер. с англ. — Издательский дом "Вильямс", 2007. — 1296 с. — Глава 22. Элементарные алгоритмы для работы с графами.
- Топологическая сортировка на habrbabr