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

Я просмотрел множество примеров в Интернете и посмотрел видео на YouTube, но я все еще немного не понимаю, что такое топологическая сортировка. Насколько я понимаю, вы должны начать с посещенной и непосещенной очереди и получить топологический порядок сортировки, когда закончите посещение всех дочерних элементов узла?


person M. Stephens    schedule 26.03.2018    source источник


Ответы (2)


Топологическая сортировка означает, что вам дается список заданий и список предварительных условий, и вы должны определить порядок заданий.

рабочие места = [1,2,3] предпосылки = [[1,2], [1, 3], [3,2]]

result = [1,3,2] должен быть порядком выполнения заданий. здесь [1,2] означает, что задание 2 не может быть запущено, пока задание 1 не будет завершено (задание 1 является предварительным условием).

Поэтому для этого вы можете использовать простой поиск в глубину (алгоритм обхода графа). в котором вы можете иметь собственный класс с именем JobVertex

class JobVertex {
   int job;
   List<JobVertex> preRequisites;
   boolean inProgress; 
   boolean visited;}

Изначально для флагов inProgress и посещений можно установить значение false. Флаг inProgress используется для обнаружения циклов (потому что для работы топологической сортировки граф должен быть DAG)

List<Integer> result = new ArrayList<>();

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

Временная сложность может быть такой же, как у dfs (v + e), где v соответствует вершинам, а e соответствует ребрам соответственно.

person Aditya    schedule 23.12.2020

Топологическая сортировка — это линейный порядок узлов, в котором для каждого направленного ребра «a -> b» «a» стоит перед «b» в порядке. Поскольку ребра должны быть ориентированы, на ориентированных графах должны выполняться топологические сортировки, а графы также должны быть ациклическими (они не могут содержать циклы). Это специальное подмножество графов, известное как DAG (направленный ациклический граф).

Вот пример того, как это выглядит, обратите внимание, что все ребра (стрелки) идут слева направо

Лучший способ найти топологическую сортировку — использовать DFS с временным стеком, а не с очередью. Ваше понимание близко, но не полностью. Поскольку DFS работает на графе, вы не помещаете узел во временный стек, пока не будут исследованы все дочерние элементы этого узла. Здесь в игру вступает рекурсивный элемент этого алгоритма. Поскольку вы не хотите помещать узел в стек до тех пор, пока его дочерние элементы не будут исследованы, вам придется подождать, пока алгоритм не завершит работу над дочерними элементами. При реализации стека первый узел, который выталкивается сверху, не будет иметь ребер, указывающих на него, а последний выскочивший узел не будет иметь ребер, исходящих от него. Если бы мы использовали очередь, все было бы наоборот.

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

person A. Picariello    schedule 01.11.2018