Kürzlich habe ich einen Code für Tiefensuche zuerst auf einer Website (https://brilliant.org/wiki/depth-first-search-dfs/) gesucht. Doch ihre Umsetzung nicht vollständig correct.This ist der Code, den sieFalsche Ausgabe in Tiefe Erste Suche Implementierung
geschriebendef depth_first_search(graph):
visited, stack = set(), [root]
while stack:
vertex = stack.pop()
if vertex not in visited:
visited.add(vertex)
stack.extend(graph[vertex] - visited)
return visited
Wie Sie sehen können, angewendet die Logik sie korrekt ist, aber sie verwendet gesetzt Betrieb, der die Ausgabe jedes Mal das Programm läuft ändert.
Das ist mein komplettes Programm
graph = {'A': {'B', 'S'}, 'B': {'A'}, 'C': {'S', 'F', 'D', 'E'},
'D': {'C'}, 'E': {'H', 'C'}, 'F': {'C', 'G'}, 'G': {'S', 'F', 'H'},
'H': {'G', 'E'}, 'S': {'A', 'G', 'C'}}
def depth_first_search(graph, root):
visited, stack = set(), [root]
while stack:
vertex = stack.pop()
if vertex not in visited:
visited.add(vertex)
stack.extend(graph[vertex] - visited)
return visited
print(depth_first_search(graph, 'A'))
Im Folgenden sind die Ausgänge ich evertime ich das Programm laufen
{'H', 'C', 'B', 'A', 'D', 'S', 'F', 'E', 'G'}
{'D', 'E', 'C', 'H', 'G', 'S', 'A', 'B', 'F'}
{'G', 'F', 'C', 'H', 'E', 'D', 'B', 'S', 'A'} and so on....
Der Grund für die besonders Satz verwendet Sinn für die folgenden Codezeile wie wir macht möchte, dass der Stapel nur die nicht erkundeten Scheitelpunkte speichert.
stack.extend(graph[vertex] - visited)
So Durchführung Einstelldifferenzdruck Betrieb wird erreicht, dass objective.But es zu einem Preis kommt, wie erwähnt above.So ich den Code ein bisschen gezwickt mit Satz zu vermeiden und mit Listen tun machen
graph = {'A': ['B', 'S'], 'B': ['A'], 'C': ['S', 'F', 'D', 'E'],
'D': ['C'], 'E': ['H', 'C'], 'F': ['C', 'G'], 'G': ['S', 'F', 'H'],
'H': ['G', 'E'], 'S': ['A', 'G', 'C']}
def depth_first_search(graph, root):
visited, stack = [], [root]
while stack:
vertex = stack.pop()
if vertex not in visited:
visited.append(vertex)
neighbours = graph[vertex]
for neighbour in neighbours:
# ensures we only add unexplored nodes to the stack
if neighbour not in visited:
stack.append(neighbour)
return visited
print(depth_first_search(graph, 'A'))
Aber ich bekomme ein falsches Ergebnis
['A', 'S', 'C', 'E', 'H', 'G', 'F', 'D', 'B']
Das richtige Ergebnis
sein muss 10Was mache ich falsch?
Hey vielen Dank noch mal für die Hilfe. Aber ich habe eine Frage, ist es wirklich erforderlich, die Werte des Graphen zu alphabetisieren? Wenn ich mir das Diagramm anschaue, ist es nur ein einfacher ungerichteter Graph, in dem ein Knoten mit anderen Knoten verbunden ist. Warum also ist es wichtig, ob ich alphabetisch sortiere oder nicht? Die Verbindungen werden sowieso gleich sein? Bitte korrigiere mich, wenn ich falsch liege. –
Es gibt keine einzige DFS-Reihenfolge für ein bestimmtes Diagramm. Es spielt eigentlich keine Rolle, welcher Nachbar zuerst bei irgendeinem Schritt besucht wird, solange Sie einer Kette bis zum Ende folgen, bevor Sie rückwärts gehen und einen anderen Weg gehen. Dies kann auf verschiedene Arten geschehen, die alle zu unterschiedlichen (gültigen) Aufträgen führen. Sie scheinen nach einer einzigen kanonischen Suchreihenfolge zu suchen, und dieses Ergebnis erhalten Sie, wenn Sie die Knoten in alphabetischer Reihenfolge besuchen. Ich nahm an, dass Sie genau danach suchen. – glibdud
Oh, ich verstehe! Ja, genau das habe ich gesucht.Ich dachte, DFSs sollen nur in alphabetischer Reihenfolge durchlaufen werden, da die meisten Youtube-Videos das Traversal in alphabetischer Reihenfolge anzeigen. Danke für die Klarstellung! –