Поиск в глубину — преимущества обхода случайных соседей

#algorithm #graph-algorithm #depth-first-search

#алгоритм #граф-алгоритм #поиск в глубину

Вопрос:

Поиск в глубину позволяет обходить смежные вершины в произвольном порядке. Есть ли какие-либо преимущества при выборе случайных соседей по сравнению с выбором соседей по возрастанию?

Рассмотрим порядок исследования следующего графика:

Примерный график

 0 -> 9 -> 8 -> 7 ..
0 -> 1 -> 8 -> 7 ..
  

Может ли случайный выбор привести к более благоприятным результатам?

Комментарии:

1. Как бы вы определили «более благоприятный»? Какую метрику вы используете? В противном случае ответ будет «это зависит»…

2. Пространство постоянно. Время может быть учтено @tucuxi

3. По возрастанию чего? Метка узла? Почему это должно иметь какое-либо значение?

4. Должны ли все ребра быть направленными (иметь стрелки?)

Ответ №1:

Могу ли я найти ситуацию, в которой есть преимущество?

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

Есть ли преимущество в целом?

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

Ответ №2:

Прежде всего, DFS не несет ответственности за произвольный порядок.

Способ обхода узлов зависит от 2 вещей:

  1. Порядок, в котором вы вставили соседние узлы в список смежности (обычно зависит от порядка ребер, предоставленных во входных данных).

  2. Пользовательский порядок, который вы выбираете для обхода (как вы упомянули, упорядоченный порядок).

Ответ на ваш вопрос:

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

  2. Если вы решите обходить соседние узлы в отсортированном виде, вам необходимо соответствующим образом поддерживать список смежности, что достигается за счет дополнительного коэффициента V * log(V).

Общая временная сложность = O(V E) O(V * log(V)).

O(V E) => для DFS.

O(V * log(V)) => для очереди приоритетов / сортировки списка смежности.

Здесь V = количество узлов в графе и E = количество ребер.