Рубрики
Без рубрики

Почему теория графика такая удивительная? – Часть 2, Глубина первый поиск и топологический сортировка

В предыдущей статье мы исследовали определение графика и дали несколько кратких примеров того, как … помеченный графиком, компьютерным искусством, алгоритмами, Python.

Магия вычислений (серия 13 деталей)

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

Триверс графика – это процесс посещения каждого узла графика. Такие обходы классифицируются на две категории по порядку, в котором посещаются узлы: поиск по глубине (на который мы будем искать сегодня) и поиск в ширине (на следующую неделю!). Для остальной части статьи, пусть G быть графиком с N узлы и E края.

Прежде чем говорить о самих обходах, мы должны представить некоторую терминологию графика.

Степень узла

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

Например, на изображении выше степень узла 1 составляет 3, степень узлов 4 и 2 равна 2, а степень узла 3 – 1.

На неправомерном графике сумма степени каждого узла равна половине количества краев (как и для любых узлов i и J Таково есть преимущество между ними, краем (i, j) считается оба (i, j) и (J, i) ) Говоря о направленных графиках, для любого узла я Существует степень (количество краев, которые приводят к я ) и степень (количество краев, которые уходят из i ).

Прогулки, тропы, циклы на графике.

A Прогулка На графике есть последовательность узлов на графике, так что для любых двух последовательных узлов, i и J , существует край (i, j) Анкет Это подразумевает, что узлы и края могут быть повторены. Например, на графике мы представлены выше, 1 -> 3 -> 1 -> 2 -> 4 -это прогулка. A тропа На графике есть прогулка без неоднократных краев. Например, на графике выше 1 -> 2 -> 4 или 2 -> 4 -> 1 -> 3 -тропы. A цикл В графике есть след, в котором повторяются только первые и последние узлы. На нашем графике 1 -> 2 -> 4 -> 1 -цикл.

Поиск глубины – анализ и Почему это важно

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

  1. Начните обход из произвольного узла, пусть будет я ; Марк я как посещение.
  2. Поиск соседей i .
  3. Если сосед, пусть будет J , найден, тогда алгоритм делает рекурсивный призыв к Шаг 1 , теперь начиная с узла J вместо i .
  4. Если соседей не найдены, вызов заканчивается, а алгоритм перемещается вверх по рекурсивному стеку.

Применение этого рекурсивного подхода к узлу я (Найти своих соседей и делать корреспондент рекурсивных вызовов) также можно назвать, для короткого, Расширение i Анкет

Теперь давайте посмотрим на временную сложность алгоритма DFS при представлении G Используя каждый из методов, представленных в предыдущей статье:

  • G представлен с использованием Матрица смежности , пусть это будет A размера N * N . Если нам нужно искать соседей произвольного узла я , мы должны пройти через все N столбцы я -th Line of the Matrix. Мы должны сделать это точно N Время, поскольку мы не можем расширить заметку несколько раз, и, следовательно, сложность DFS при использовании матрицы смежности O (n*n).
  • G представлен с помощью Списки смежности , пусть A [i] Обозначите список соседей i . Затем для каждого узла я , мы должны пройти через его соседей – по количеству равных до степени узла i . Добавление этих операций приводит к O (N+E).

Как мы уже говорили в предыдущей статье – для плотного графика (то есть, когда E приближается к n*n), подход матрицы смежности оказался бы более эффективным, поскольку он будет использовать значительно меньшую память, одновременно имея одинаковую асимптотическую сложность – когда E приближается к n *N, o (n+e) является O (n*n).

Давайте теперь увидим реализацию DFS с использованием графика, представленного списками смежности. Чтобы избежать дублирования кода, во время этой серии я буду использовать Прилегающий_лист.py Я написал для первой статьи, которая включает в себя базовое определение класса для управления графиками, представленными списками смежности.

Этот фрагмент работает на графике, используемом выше при объяснении степени узла, а его выход – «1 2 4 3». Алгоритм начинается с 1, ища его соседей (которые 2, 3, 4). Первый найденный 2, а затем алгоритм ищет невисцированных соседей 2, находя 4. Узел 4 не остался не оставленных соседей, и алгоритм перемещается вверх по стеке. То же самое касается 2. Узел 3 является последним из необычных соседей узла 1, что приводит к выводу.

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

Если G является направленным графом без циклов (также называемый направленным ациклическим графом или DAG в течение короткого времени), а затем топологическая сортировка узлов графика G является линейным упорядочением узлов, так что для любого края (i, j) , я приходит раньше J в заказе. Эта сортировка имеет широкий спектр реальных целей, в частности, помогает организовать график задач на основе их зависимостей.

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

Простой способ сделать это – сначала найти узел в степени 0 (В нашем случае, Узел 1 ) и запустите глубину сначала поиск с ним в качестве корня. Вместо того, чтобы использовать узел сразу, мы будем использовать стек, чтобы толкнуть его Только после того, как все его соседи были посещены . Затем обратный стек будет содержать топологическую сортировку для нашего графика, так как последний узел, который мы толкаем к стеку, будет корнем.

Для реализации топологической сортировки я изменил график Класс мы использовали ранее для направленного графика, а также рассчитали степень каждого узла при инициализации:

Затем я внедрил модифицированные DFS, используя модифицированную версию класса Manager Graph в качестве родителя:

Для указанного графа выше выходной сигнал фрагмента составляет «1 4 2 3 5», упорядочение, которое удовлетворяет условиям нашего определения. Обратите внимание, что топологическая сортировка графика не обязательно уникальна. Для нашего примера «1 2 3 5 4» также является правильным упорядочением.

Вывод

Это было краткое введение в глубинный первый поиск и одно из его реальных приложений. На следующей неделе мы поговорим о другом графике – промежуточный поиск первого (или BFS для краткости), и мы также продемонстрируем некоторые из его способностей. До тех пор, следите за обновлениями, почему бы не наслаждаться некоторыми другими статьями в Магия вычислений серии? Часть о Fibonacci Numbers это довольно успех!

Магия вычислений (серия 13 деталей)

Оригинал: “https://dev.to/kruzzy/why-is-graph-theory-so-amazing-part-2-depth-first-search-topological-sorting-jkg”