Топологическая сортировка

Топологическая сортировка — упорядочивание вершин ациклического ориентированного графа согласно частичному порядку, заданному рёбрами орграфа на множестве его вершин.

Например, для графа:

существует несколько согласованных последовательностей его вершин, которые могут быть получены при помощи топологической сортировки, в частности:

В последовательности могут быть переставлены любые две стоящие рядом вершины, которые не входят в отношение частичного порядка .

Ациклический ориентированный граф

Топологическая сортировка широко применяется в различных отраслях например, с её помощью можно построить последовательность прохождения учебных курсов студентами, последовательность установки программ при помощи пакетного менеджера, последовательность сборки исходных текстов программ по данным сборочных файлов, можно построить список отображения объектов в изометрической проекции зная парные порядковые отношения между объектами (какой из двух объектов должен быть прорисован раньше).

Алгоритм Кана править

Один из первых алгоритмов, и наиболее приспособленный к исполнению вручную разработан Артуром Каном в 1962 году.

Пусть дан ациклический ориентированный простой граф  . Через   обозначим множество таких вершин  , что  . То есть   — множество всех вершин, из которых есть дуга в вершину  . Пусть   — искомая последовательность вершин.

пока  
  выбрать любую вершину   такую, что   и  
   
  удалить   из всех  

Наличие хотя бы одного цикла в графе приведёт к тому, что на определённой итерации цикла не удастся выбрать новую вершину  .

 

Например, если задан граф:

 ,

алгоритм выполнится следующим образом:

шаг              
0              
1              
2              
3              
4              
5              

На втором шаге вместо   может быть выбрана вершина  , поскольку порядок между   и   не задан.

Алгоритм Тарьяна править

С использованием вычислительной техники топологическую сортировку можно выполнить за   времени и памяти, если обойти все вершины, используя поиск в глубину, и выводить вершины в момент выхода из неё — алгоритм разработан Робертом Тарьяном в 1976 году.

Изначально все вершины помечаются как белые, для каждой вершины осуществляется шаг алгоритма:

  • если вершина чёрная, ничего делать не надо,
  • если вершина серая — найден цикл, топологическая сортировка невозможна,
  • если вершина белая, то:
    • красится в серый,
    • применяется шаг алгоритма для всех вершин, в которые можно попасть из текущей,
    • красится вершину в чёрный и помещается её в начало окончательного списка.

Например, на графе:

 

с порядком обхода   алгоритм отрабатывает следующим образом:

Шаг Текущая Белые Стек (серые) Выход (чёрные)
0  
1      
2      
3      
4        
5        
6    
7      
8      
9        
10      
11      
12  
13    

См. также править

Литература править

  • Левитин А. В. Глава 5. Метод уменьшения размера задачи: Топологическая сортировка // Алгоритмы. Введение в разработку и анализМ.: Вильямс, 2006. — С. 220—224. — 576 с. — ISBN 978-5-8459-0987-9
  • Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Глава 22.4. Топологическая сортировка // Алгоритмы: построение и анализ = Introduction to Algorithms / Под ред. И. В. Красикова. — 2-е изд. — М.: Вильямс, 2005. — С. 632—635. — ISBN 5-8459-0857-4.

Ссылки править