Algorithme de tri topologique

Algorithme de tri topologique
L'algorithme de tri topologique fonctionne avec le DAG (graphique acyclique direct). La signification du type topologique est que si un nœud pointe vers un autre nœud, alors le nœud qui pointe vers un autre nœud viendra après cela. Donc, dans ce cas, si nous avons un graphique cyclique, nous ne pouvons pas prédire quel nœud vient après quel nœud. C'est donc la raison pour laquelle l'algorithme de tri topologique ne fonctionne qu'avec le graphique acyclique et non avec le graphique cyclique.

Chaque graphique a plus d'une séquence de tri topologique car cela dépend de l'effet des bords des nœuds. Le premier nœud de départ que nous choisissons avec un nombre de nœuds en degré est 0.

Comprenons l'algorithme de tri topologique avec un exemple.

Étape 1: Nous insérons ces nœuds dont le nombre de bords entrants est égal à 0. Ces nœuds sont donc le nœud 1 et le nœud 4.

Étape 2:

un. Nous commençons par le nœud 1. Nous pouvons choisir n'importe quel nœud entre le nœud 1 et le nœud 4.

b. Nous diminuons chaque bord de nœud de 1, qui est connecté au nœud 1. Nous diminuons le bord des nœuds (0, 2 et 3).

c. Nous déplaçons le nœud 1 de la liste vers la liste tricot topologiquement, comme indiqué ci-dessous.

Étape 3:

un. Nous procédons maintenant à la liste, qui est le nœud 4.

b. Nous diminuons tous les bords sortants des nœuds connectés au nœud 4, qui sont des nœuds (0 et 3).

c. Maintenant, le nœud 3 n'a pas de bords entrants, nous le poussons donc dans la liste, et le nœud 4 change vers la liste tricotétiquement triée.

Étape 4:

un. Nous procédons maintenant à la liste, qui est le nœud 3.

b. Nous diminuons tous les bords sortants des nœuds connectés au nœud 3, qui sont des nœuds (0 et 2).

c. Maintenant, les nœuds 0 et le nœud 2 n'ont pas de bords entrants, nous le poussons donc dans la liste, et le nœud 3 passe à la liste trieuse topologiquement.

Étape 5:

un. Nous procédons maintenant à la liste, qui est le nœud 0.

b. Comme aucun bord sortant du nœud 0, nous les ajoutons donc simplement à la liste des tri topologiques.

Étape 6:

un. Nous procédons maintenant à la liste, qui est le nœud 2.

b. Comme aucun bord sortant du nœud 2, nous les ajoutons donc simplement à la liste des tri topologiques.

Étape 7:

Enfin, nous avons trié la liste ici.

Algorithme de tri topologique

Voici les étapes de l'algorithme de tri topologique que nous devons suivre.

Étape 0: Calculez le degré de chaque nœud graphique.

Étape 1: Nous devons d'abord trouver un nœud qui a des bords entrants de zéro.

Étape 2: Nous supprimons ce nœud du graphique et l'ajoutons à la liste des ordres de tri topologique.

Étape 3: Supprimez les nœuds qui ont des bords sortants.

Étape 4: Réduisez le degré par le nombre d'arêtes connexes qui ont été supprimées.

Étape 5: Répétez les étapes 1 à 4 jusqu'à ce qu'aucun nœud avec 0 ne reste au degré.

Étape 6: Vérifiez que tous les éléments sont dans la séquence correcte.

Étape 7: Maintenant, nous avons trié la commande de l'étape 6.

Étape 8: mettre fin à l'algorithme.

Code python: Ce qui est ci-dessous est une implémentation Python de l'exemple ci-dessus.

From CollectionsImportDefaultDict
ClassBuildGraph:
Def__init __ (self, nœuds: int):
soi.nœuds = nœuds
# Nous stockons maintenant le graphique au format de liste adjacent
soi.adjListDetails = defaultDict (list)
# Il stocke les informations sur un nœud particulier entrant
# bords dans un graphique
soi.count_numbers_of_incoming_edge_of_a_node = []
# Nous stocons les nœuds triés dans l'ordre topologique
soi.topologique_sorted_order = []
# Nous stocons les informations de tous ces nœuds que ce ne sont pas
# avoir des bords entrants dans un graphique
soi.nœuds_have_zero_incoming_edges = []
# Maintenant, nous créons une liste adjacente de tous les graphiques à trier
DefaddGraphEdge (self, source: int, destination: int):
soi.adjlistDetails [source].Ajouter (destination)
soi.count_numbers_of_incoming_edge_of_a_node [destination] + = 1
Donfortalgorithme (Self):
pour le nœud enrange (soi.nœuds):
si-même.count_numbers_of_incoming_edge_of_a_node [node] == 0:
soi.nœuds_have_zero_incoming_edges.ajouter (nœud)
où.nœuds_have_zero_incoming_edges:
soi.nœuds_have_zero_incoming_edges.trier()
Source = soi.nœuds_have_zero_incoming_edges.pop (0)
# itération de liste adjacente
Si l'inselon de la source.AdjListDetails:
pour l'inselon du nœud.adjListDetails [source]:
soi.count_numbers_of_incoming_edge_of_a_node [node] - = 1
si-même.count_numbers_of_incoming_edge_of_a_node [node] == 0:
soi.nœuds_have_zero_incoming_edges.ajouter (nœud)
soi.topologique_sorted_order.ajouter (source)
Imprimer ("Ordre de tri topologique:" + Str (Self.topologique_sorted_order))
Defmain ():
Number_Of_Nodes = 7
graph = buildGraph (numéro_of_nodes)
graphique.count_numbers_of_incoming_edge_of_a_node = [0] * numéro_of_nodes
graphique.AddGraphEdge (0,2)
graphique.AddGraphEdge (0,5)
graphique.Addgraphedge (1,3)
graphique.Addgraphedge (1,6)
graphique.Addgraphedge (2,4)
graphique.Addgraphedge (3,5)
graphique.Addgraphedge (5,2)
graphique.Addgraphedge (5,4)
graphique.Addgraphedge (6,2)
graphique.Topologicalsortalgorithme ()
Si __name__ == "__ Main__":
principal()

Sortir:

Ordre de tri topologique: [0, 1, 3, 5, 6, 2, 4]

Algorithme de tri topologique Complexité du temps:

Le temps total pour traiter l'algorithme est O (e + n), où E représente le nombre d'arêtes et N représente le nombre de nœuds dans le graphique. Ensuite, à l'étape suivante, nous devons calculer le degré de chaque nœud, qui prend généralement des temps (e), puis placer tous ces nœuds dans une liste triée où leur degré est nul, ce qui prend O (n) fois. Ainsi, la complexité de temps totale de l'algorithme de tri topologique est O (E + N).

Mais la complexité de l'espace de l'algorithme de tri topologique est O (n), qui est le nombre total de nœuds dans le graphique.

Application :

1. Le type topologique est très utile pour trouver le cycle du graphique.

2. L'algorithme de tri topologique est utilisé pour déterminer les conditions de blocage dans un système d'exploitation.

3. L'algorithme de tri topologique est utilisé pour trouver le chemin le plus court d'un graphique acyclique pondéré.

Conclusion:

Cet article a appris sur un algorithme plus important, le tri topologique. Nous avons vu que cet algorithme ne fonctionne qu'avec des graphiques acycliques. L'algorithme de tri topologique aide également à déterminer l'ordre de compilation des tâches. L'algorithme de tri topologique a de nombreux avantages en temps réel, comme trouver le chemin le plus court. Parce que le type topologique est extrêmement utile, chaque programmeur et étudiant doit bien comprendre cet algorithme.