Использование обхода в глубину для топологической сортировки — различия между версиями
Shersh (обсуждение | вклад) (→Источники) |
м (rollbackEdits.php mass rollback) |
||
| (не показаны 4 промежуточные версии 2 участников) | |||
| Строка 2: | Строка 2: | ||
|id=topsort_def | |id=topsort_def | ||
|definition= | |definition= | ||
| − | '''Топологическая сортировка''' [[Ориентированный граф|ориентированного]] [[Основные определения теории графов|ациклического графа]] <tex>G = (V, E)</tex> представляет собой | + | '''Топологическая сортировка''' (англ. ''topological sort'') [[Ориентированный граф|ориентированного]] [[Основные определения теории графов|ациклического графа]] <tex>G = (V, E)</tex> представляет собой упорядочивание [[Основные определения теории графов|вершин]] таким образом, что для любого ребра <tex>(u, v) \in E(G)</tex> номер вершины <tex>u</tex> меньше номера вершины <tex>v\ </tex>. |
}} | }} | ||
== Применение == | == Применение == | ||
Топологическая сортировка применяется в самых разных ситуациях, например при создании параллельных алгоритмов, когда по некоторому описанию алгоритма нужно составить граф зависимостей его операций и, отсортировав его топологически, определить, какие из операций являются независимыми и могут выполняться параллельно (одновременно). Примером использования топологической сортировки может служить создание карты сайта, где имеет место древовидная система разделов. Также топологическая сортировка применяется при обработке исходного кода программы в некоторых компиляторах и IDE, где строится граф зависимостей между сущностями, после чего они инициализируются в нужном порядке, либо выдается ошибка о циклической зависимости. | Топологическая сортировка применяется в самых разных ситуациях, например при создании параллельных алгоритмов, когда по некоторому описанию алгоритма нужно составить граф зависимостей его операций и, отсортировав его топологически, определить, какие из операций являются независимыми и могут выполняться параллельно (одновременно). Примером использования топологической сортировки может служить создание карты сайта, где имеет место древовидная система разделов. Также топологическая сортировка применяется при обработке исходного кода программы в некоторых компиляторах и IDE, где строится граф зависимостей между сущностями, после чего они инициализируются в нужном порядке, либо выдается ошибка о циклической зависимости. | ||
| + | |||
| + | Также с помощью топологической сортировки можно найти [[Гамильтоновы графы|гамильтонов путь]] в ациклическом графе. | ||
== Постановка задачи == | == Постановка задачи == | ||
| Строка 26: | Строка 28: | ||
<font color=green>// <tex>G</tex> {{---}} исходный граф</font> | <font color=green>// <tex>G</tex> {{---}} исходный граф</font> | ||
'''function''' <tex>\mathtt{topologicalSort}():</tex> | '''function''' <tex>\mathtt{topologicalSort}():</tex> | ||
| − | проверить граф <tex>G</tex> на ацикличность | + | [[Использование обхода в глубину для поиска цикла|проверить граф <tex>G</tex> на ацикличность]] |
<tex>fill(\mathtt{visited}, false)</tex> | <tex>fill(\mathtt{visited}, false)</tex> | ||
'''for''' <tex>v \in V(G)</tex> | '''for''' <tex>v \in V(G)</tex> | ||
| Строка 41: | Строка 43: | ||
| − | Время работы этого алгоритма соответствует времени работы алгоритма поиска в глубину, то есть равно <tex>O(V+E)</tex>. | + | Время работы этого алгоритма соответствует времени работы алгоритма поиска в глубину, то есть равно <tex>O(|V| + |E|)</tex>. |
==Пример== | ==Пример== | ||
| Строка 53: | Строка 55: | ||
* [[Использование обхода в глубину для поиска мостов]] | * [[Использование обхода в глубину для поиска мостов]] | ||
| − | == Источники == | + | == Источники информации == |
*Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн — Алгоритмы: построение и анализ, 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — с.653 — 656.— ISBN 978-5-8459-0857-5 (рус.) | *Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн — Алгоритмы: построение и анализ, 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — с.653 — 656.— ISBN 978-5-8459-0857-5 (рус.) | ||
* [http://habrahabr.ru/blogs/algorithm/100953/#habracut Топологическая сортировка на habrahabr] | * [http://habrahabr.ru/blogs/algorithm/100953/#habracut Топологическая сортировка на habrahabr] | ||
Текущая версия на 19:43, 4 сентября 2022
| Определение: |
| Топологическая сортировка (англ. topological sort) ориентированного ациклического графа представляет собой упорядочивание вершин таким образом, что для любого ребра номер вершины меньше номера вершины . |
Применение
Топологическая сортировка применяется в самых разных ситуациях, например при создании параллельных алгоритмов, когда по некоторому описанию алгоритма нужно составить граф зависимостей его операций и, отсортировав его топологически, определить, какие из операций являются независимыми и могут выполняться параллельно (одновременно). Примером использования топологической сортировки может служить создание карты сайта, где имеет место древовидная система разделов. Также топологическая сортировка применяется при обработке исходного кода программы в некоторых компиляторах и IDE, где строится граф зависимостей между сущностями, после чего они инициализируются в нужном порядке, либо выдается ошибка о циклической зависимости.
Также с помощью топологической сортировки можно найти гамильтонов путь в ациклическом графе.
Постановка задачи
| Теорема: | ||||||
— ациклический ориентированный граф, тогда | ||||||
| Доказательство: | ||||||
|
Определим как порядковый номер окраски вершины в черный цвет в результате работы алгоритма dfs. Рассмотрим функцию . Очевидно, что такая функция подходит под критерий функции из условия теоремы, если выполняется следующее утверждение:
| ||||||
Алгоритм
Из определения функции мгновенно следует алгоритм топологической сортировки:
// — исходный граф function проверить граф на ацикличность for if not function for if not
Время работы этого алгоритма соответствует времени работы алгоритма поиска в глубину, то есть равно .
Пример
Распространённая задача на топологическую сортировку — следующая. Есть переменных, значения которых нам неизвестны. Известно лишь про некоторые пары переменных, что одна переменная меньше другой. Требуется проверить, не противоречивы ли эти неравенства, и если нет, выдать переменные в порядке их возрастания (если решений несколько — выдать любое). Легко заметить, что это в точности и есть задача о поиске топологической сортировки в графе из вершин.
См. также
- Использование обхода в глубину для поиска цикла
- Использование обхода в глубину для проверки связности
- Использование обхода в глубину для поиска компонент сильной связности
- Использование обхода в глубину для поиска точек сочленения
- Использование обхода в глубину для поиска мостов
Источники информации
- Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн — Алгоритмы: построение и анализ, 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — с.653 — 656.— ISBN 978-5-8459-0857-5 (рус.)
- Топологическая сортировка на habrahabr
- MAXimal :: algo :: Топологическая сортировка
- Пример задачи на топологическую сортировку