Использование обхода в глубину для топологической сортировки — различия между версиями
Glukos (обсуждение | вклад) |
Glukos (обсуждение | вклад) |
||
| Строка 1: | Строка 1: | ||
| − | '''Топологическая сортировка''' [[Ориентированный граф|ориентированного]] [[Основные определения теории графов|ациклического графа]] <tex>G = (V, E)</tex> представляет собой такое линейное упорядочение всех его [[Основные определения теории графов|вершин]], что если <tex>(u, v) \in E(G)</tex>, то <tex>u</tex> при таком упорядочении располагается до <tex>v\ </tex> (если граф не является ациклическим, такая сортировка невозможна). Топологическая сортировка применяется в самых разных ситуациях, например при создании параллельных алгоритмов, когда по некоторому описанию алгоритма нужно составить граф зависимостей его операций и, отсортировав его топологически, определить, какие из операций являются независимыми и могут выполняться параллельно (одновременно). Примером использования топологической сортировки может служить создание карты сайта, где имеет место древовидная система разделов. Также топологическая сортировка применяется при обработке исходного кода программы в некоторых компиляторах и IDE, а именно строится граф зависимостей между сущностями, после чего они инициализируются в нужном порядке, либо выдается ошибка о циклической зависимости. | + | '''Топологическая сортировка''' [[Ориентированный граф|ориентированного]] [[Основные определения теории графов|ациклического графа]] <tex>G = (V, E)</tex> представляет собой такое линейное упорядочение всех его [[Основные определения теории графов|вершин]], что если <tex>(u, v) \in E(G)</tex>, то <tex>u</tex> при таком упорядочении располагается до <tex>v\ </tex> (если граф не является ациклическим, такая сортировка невозможна). |
| + | |||
| + | == Применение == | ||
| + | Топологическая сортировка применяется в самых разных ситуациях, например при создании параллельных алгоритмов, когда по некоторому описанию алгоритма нужно составить граф зависимостей его операций и, отсортировав его топологически, определить, какие из операций являются независимыми и могут выполняться параллельно (одновременно). Примером использования топологической сортировки может служить создание карты сайта, где имеет место древовидная система разделов. Также топологическая сортировка применяется при обработке исходного кода программы в некоторых компиляторах и IDE, а именно строится граф зависимостей между сущностями, после чего они инициализируются в нужном порядке, либо выдается ошибка о циклической зависимости. | ||
== Постановка задачи == | == Постановка задачи == | ||
| Строка 41: | Строка 44: | ||
== Источники == | == Источники == | ||
* Томас Кормен, Чарльз Лейзерсон, Рональд Ривест, Клиффорд Штайн. Алгоритмы: построение и анализ, второе издание. Пер. с англ. — Издательский дом "Вильямс", 2007. — 1296 с. — Глава 22. Элементарные алгоритмы для работы с графами. | * Томас Кормен, Чарльз Лейзерсон, Рональд Ривест, Клиффорд Штайн. Алгоритмы: построение и анализ, второе издание. Пер. с англ. — Издательский дом "Вильямс", 2007. — 1296 с. — Глава 22. Элементарные алгоритмы для работы с графами. | ||
| + | * [http://habrahabr.ru/blogs/algorithm/100953/#habracut Топологическая сортировка на habrbabr] | ||
Версия 08:25, 25 октября 2011
Топологическая сортировка ориентированного ациклического графа представляет собой такое линейное упорядочение всех его вершин, что если , то при таком упорядочении располагается до (если граф не является ациклическим, такая сортировка невозможна).
Содержание
Применение
Топологическая сортировка применяется в самых разных ситуациях, например при создании параллельных алгоритмов, когда по некоторому описанию алгоритма нужно составить граф зависимостей его операций и, отсортировав его топологически, определить, какие из операций являются независимыми и могут выполняться параллельно (одновременно). Примером использования топологической сортировки может служить создание карты сайта, где имеет место древовидная система разделов. Также топологическая сортировка применяется при обработке исходного кода программы в некоторых компиляторах и 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