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

  • Топологическая сортировка применяется только к направленным ацикличным графам (DAG), и используется для упорядочивания вершин, чтобы можно было правильно выполнять зависимости между задачами.


1. Алгоритм Тарьяна для поиска компонент сильной связности

Описание: Алгоритм Тарьяна используется для поиска компонент сильной связности (SCC — Strongly Connected Components) в направленных графах. Сильная связность графа означает, что для каждой пары вершин в компоненте существует путь между ними в обоих направлениях. Граф делится на такие компоненты, которые являются максимальными по своему размеру и которые не могут быть объединены без потери сильной связности.

Шаги алгоритма:

  1. Инициализируем пустые стеки и списки для отслеживания времени входа в вершины, а также текущие индексы вершин.

  2. Обходим граф с использованием поиска в глубину (DFS).

  3. Каждый раз, когда мы посещаем вершину, помечаем её индексом времени (номер, когда вершина была посещена), а также добавляем её в стек.

  4. Когда посещена вся компонентная связность, можно по стеку извлечь её компоненты и пометить как одну компоненту сильной связности.

Алгоритмическая сложность:

  • Время работы алгоритма — O(V + E), где V — количество вершин, E — количество рёбер в графе. Это объясняется тем, что каждая вершина и каждое ребро проходят через алгоритм только один раз.

Применение:

  • Составление планов задач с зависимостями.

  • Выявление циклов в графах и анализ взаимосвязанных компонентов.


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

Описание: Топологическая сортировка — это линейное упорядочивание вершин направленного ацикличного графа (DAG), такое что для каждого ребра (u, v) вершина u идёт перед вершиной v. Топологическая сортировка используется для задач, где необходимо выполнить действия в определённом порядке. Она широко применяется в задачах, таких как компиляция кода, управление зависимостями и планирование задач.

Шаги алгоритма:

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

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

  3. Пока очередь не пуста:

    • Извлекаем вершину из очереди.

    • Для каждой вершины-соседа уменьшаем её входную степень. Если входная степень соседа становится равной нулю, добавляем его в очередь.

  4. Продолжаем этот процесс до тех пор, пока не получим все вершины в порядке сортировки.

Алгоритмическая сложность:

  • Время работы — O(V + E), где V — количество вершин, E — количество рёбер, так как каждая вершина и каждое ребро обрабатываются только один раз.

Применение:

  • Планирование задач, где существует зависимость.

  • Компоненты компиляторов.

  • Составление расписаний с учётом зависимости задач.


Сравнение алгоритмов

АлгоритмТип графаВремя работыПрименениеОсобенности
Алгоритм ТарьянаНаправленный графO(V + E)Поиск компонент сильной связностиРаботает с циклами и сильно связанными компонентами
Топологическая сортировкаНаправленный ацикличный граф (DAG)O(V + E)Планирование задач, компиляция, анализ зависимостейРаботает только с DAG, обеспечивает упорядочение задач