Я пытаюсь реализовать DFS, однако, согласно A StackOverFlow link about DFS, DFS использует только Stack.DFS - Реализация решения сложности времени O (| E |)
Это моя текущая реализация:
def DFS_graph_recursive(graph, start, end, stack):
#Stack to push the node when we are entering the node
stack.append(start)
while(end not in stack):
for i in graph.edges[start]:
#check if this is inside the stack, to make sure that it doesn't try to go back
if (i not in stack):
#Recursive Call
DFS_graph_recursive(graph, i, end, stack)
#Pop the stack when we are leaving this node, but need to make sure if end is inside
if(end not in stack):
stack.pop()
Существует несколько проблем, временная сложность не выглядит как O (| E |). Первый цикл while - это O (| E |), однако мне нужно проверить, является ли мой следующий узел уже внутри стека, чтобы избежать перехода назад, если этот стек большой, и я предполагаю, что i not in stack
принимает O (n) для вычисления, делая этот алгоритм похожим на O (| E |^2) по сложности.
if(end not in stack)
, делает алгоритм хуже с точки зрения временной сложности, так как для каждого поиска по краю ему нужно проверить, находится ли конец в стеке, что означает, что мы не хотим выталкивать стек, если нашли решение. Это, кроме того, увеличивает сложность времени до O (| E |^2 + | E |). Есть ли способ сделать это только с одним циклом?
С точки зрения космической сложности, это должно быть O (| V |) в худшем случае, что у нас есть длинное дерево с ветвящейся коэффициентом 1.
можно легко реализовать O (| E |) решение если он был двоичным типом дерева, который имеет направленный путь вниз к дочерним узлам. Проблема заключается в том, что поскольку проблема представляет собой неориентированный граф, допустим, что есть две вершины: A и B. Если A подключается к B, тогда B соединяется с A. Поэтому, если я не проверю if (i not in stack)
, я буду застревать, возвращаясь назад и вперед от А к в, в к А ... и т.д.
Вам не нужен стек при выполнении рекурсивных вызовов – hyades
Я не знаю, но мне нужно отслеживать пути, а также гарантировать, что он не позволяет мне переходить между двумя узлами. – user1157751
Как вы планируете отслеживать пути? Если вы действительно хотите, чтобы вы могли переместить обнаруженные узлы в глобальный список. – hyades