Topologischer Sortieralgorithmus

Topologischer Sortieralgorithmus
Der topologische Sortieralgorithmus funktioniert mit der DAG (direkter acyclischer Graphen). Die Bedeutung der topologischen Sort. In diesem Fall können wir, wenn wir einen zyklischen Diagramm haben, nicht vorhersagen, welcher Knoten kommt, nach welchem ​​Knoten. Das ist der Grund, warum der topologische Sortieralgorithmus nur mit dem acyclischen Diagramm und nicht mit dem zyklischen Diagramm funktioniert.

Jedes Diagramm hat mehr als eine topologische Sortiersequenz, da sie von den Grad der Ränder der Knoten abhängt. Der erste Startknoten, den wir mit einer uneingeschränkten Anzahl von Knoten auswählen, ist 0.

Lassen Sie uns den topologischen Sortieralgorithmus mit einem Beispiel verstehen.

Schritt 1: Wir setzen die Knoten ein, deren ankommende Kantenzahl gleich 0 ist. Diese Knoten sind also Knoten 1 und Knoten 4.

Schritt 2:

A. Wir beginnen mit dem Knoten 1. Wir können jeden Knoten zwischen Knoten 1 und Knoten 4 auswählen.

B. Wir verringern jede Knotenkante um 1, die mit Knoten 1 verbunden ist. Wir verringern die Kante der Knoten (0, 2 und 3).

C. Wir verschieben den Knoten 1 von der Liste in die topologisch sortierte Liste, wie unten gezeigt.

Schritt 3:

A. Wir gehen jetzt aus der Liste, die Node 4 ist.

B. Wir verringern alle ausgehenden Kanten der mit Knoten 4 verbundenen Knoten, die Knoten (0 und 3) sind.

C. Jetzt hat Node 3 keine eingehenden Kanten, also drücken wir ihn in die Liste, und der Knoten 4 verlagert sich auf die topologisch sortierte Liste.

Schritt 4:

A. Wir gehen jetzt aus der Liste, die Node 3 ist.

B. Wir verringern alle ausgehenden Kanten der mit Knoten 3 verbundenen Knoten, die Knoten (0 und 2) sind.

C. Jetzt haben die Knoten 0 und der Knoten 2 keine eingehenden Kanten, also drücken wir sie in die Liste, und der Knoten 3 verschiebt.

Schritt 5:

A. Wir gehen jetzt aus der Liste, die Node 0 ist.

B. Da keine ausgehenden Kanten aus Knoten 0, fügen wir sie einfach der topologischen Sortierliste hinzu.

Schritt 6:

A. Wir gehen jetzt aus der Liste, die Node 2 ist.

B. Da keine ausgehenden Kanten aus Knoten 2, fügen wir sie einfach der topologischen Sortierliste hinzu.

Schritt 7:

Schließlich haben wir die Liste hier sortiert.

Topologischer Sortieralgorithmus

Die folgenden sind die Schritte für den topologischen Sortieralgorithmus, dem wir folgen müssen.

Schritt 0: Berechnen Sie den Grad jedes Grafikknotens.

Schritt 1: Wir müssen zuerst einen Knoten finden, der eingehende Kanten von Null hat.

Schritt 2: Wir entfernen diesen Knoten aus dem Diagramm und fügen ihn der Liste der topologischen Sortieraufträge hinzu.

Schritt 3: Entfernen Sie die Knoten mit ausgehenden Kanten.

Schritt 4: Reduzieren.

Schritt 5: Wiederholen Sie die Schritte 1-4, bis keine Knoten mit 0 Grad verbleiben.

Schritt 6: Stellen Sie sicher, dass alle Elemente in der richtigen Reihenfolge sind.

Schritt 7: Jetzt haben wir die Bestellung ab Schritt 6 sortiert.

Schritt 8: Setzen Sie dem Algorithmus ein Ende.

Python -Code: Das folgende ist eine Python -Implementierung des obigen Beispiels.

FromCollectionsImportDefaultDict
classBuildgraph:
Def__init __ (Selbst, Knoten: int):
selbst.Knoten = Knoten
# Wir speichern das Diagramm jetzt im benachbarten Listenformat
selbst.adjlistDetails = defaultDict (Liste)
# Es werden die Informationen zu einem bestimmten Knoten eingebaut sein
# Kanten in einer Grafik
selbst.count_numbers_of_incoming_edge_of_a_node = []
# Wir speichern die sortierten Knoten in topologischer Reihenfolge
selbst.topological_sorted_order = []
# Wir speichern die Informationen all dieser Knoten, die dies nicht tun
# haben eingehende Kanten in einer Grafik
selbst.nodes_have_zero_incoming_edges = []
# Jetzt erstellen wir eine angrenzende Liste aller Diagramme, um sie zu sortieren
DefaddGraphedge (Selbst, Quelle: int, Ziel: int):
selbst.adjlistDetails [Quelle].anhängen (Ziel)
selbst.count_numbers_of_incoming_edge_of_a_node [Ziel] += 1
FifeTopologicalSortalgorithmus (Selbst):
für Knoteninrange (Selbst.Knoten):
wenn ich.count_numbers_of_incoming_edge_of_a_node [node] == 0:
selbst.nodes_have_zero_incoming_edges.anhängen (Knoten)
Während.nodes_have_zero_incoming_edges:
selbst.nodes_have_zero_incoming_edges.Sortieren()
Quelle = Selbst.nodes_have_zero_incoming_edges.Pop (0)
# angrenzende Listen -Iteration
Wenn Quelle Inself.adjlistDetails:
Für Node Inself.adjlistDetails [Quelle]:
selbst.count_numbers_of_incoming_edge_of_a_node [node] -= 1
wenn ich.count_numbers_of_incoming_edge_of_a_node [node] == 0:
selbst.nodes_have_zero_incoming_edges.anhängen (Knoten)
selbst.topological_sorted_order.anhängen (Quelle)
print ("Topologische Sortierreihenfolge:"+str (Selbst.topological_sorted_order)))
Defmain ():
number_of_nodes = 7
Graph = Buildgraph (number_of_nodes)
Graph.count_numbers_of_incoming_edge_of_a_node = [0] *number_of_nodes
Graph.AddGraphedge (0,2)
Graph.AddGraphedge (0,5)
Graph.AddGraphedge (1,3)
Graph.AddGraphedge (1,6)
Graph.AddGraphedge (2,4)
Graph.AddGraphedge (3,5)
Graph.AddGraphedge (5,2)
Graph.AddGraphedge (5,4)
Graph.AddGraphedge (6,2)
Graph.TopologicalSortalgorithmus ()
Wenn __name__ == "__ main__":
hauptsächlich()

Ausgang:

Topologische Sortierreihenfolge: [0, 1, 3, 5, 6, 2, 4]

Topologische Sortieralgorithmus -Zeitkomplexität:

Die Gesamtzeit für den Verarbeitung des Algorithmus ist O (E + N), wobei E die Anzahl der Kanten darstellt und N die Anzahl der Knoten in der Grafik darstellt. Im folgenden Schritt müssen wir dann in einem Grad jedes Knotens, das im Allgemeinen O (e) Zeiten dauert, berechnen und dann alle diese Knoten in eine sortierte Liste platzieren, in der ihr In-Grad Null ist, was O (n) nimmt) mal. Die Gesamtzeitkomplexität des topologischen Sortieralgorithmus ist also O (E+N).

Aber die Raumkomplexität des topologischen Sortieralgorithmus ist O (n), die Gesamtzahl der Knoten in der Grafik ist.

Anwendung :

1. Die topologische Sortierung ist sehr nützlich, um den Zyklus des Diagramms zu finden.

2. Der topologische Sortieralgorithmus wird verwendet, um die Deadlockbedingungen in einem Betriebssystem zu bestimmen.

3. Der topologische Sortieralgorithmus wird verwendet, um den kürzesten Weg in einem gewichteten acyclischen Graphen zu finden.

Abschluss:

Dieser Artikel hat einen weiteren wichtigen Algorithmus, topologische Sortierung, erfahren. Wir haben gesehen, dass dieser Algorithmus nur mit acyclischen Graphen funktioniert. Der topologische Sortieralgorithmus hilft auch, die Aufgabenkompilierungsreihenfolge zu bestimmen. Der topologische Sortieralgorithmus hat viele Echtzeitvorteile, z. B. den kürzesten Weg zu finden. Da die topologische Art äußerst nützlich ist, muss jeder Programmierer und Schüler diesen Algorithmus gründlich verstehen.