Apprentissage interactif de la théorie des graphes
Apprentissage interactif de la théorie des graphes
Guest User
Using app without sign in
Générateur d'ordre topologique
Ordre linéaire des sommets dans un DAG respectant les dépendances
Sélectionnez un algorithme et générez les étapes pour commencer la visualisation
Le tri topologique produit un ordre linéaire des sommets d'un graphe orienté acyclique (DAG) tel que chaque arête va d'un sommet antérieur à un sommet postérieur. Il répond à la question : dans quel ordre peut-on effectuer des tâches quand certaines dépendent d'autres ?
Deux approches standard existent. L'algorithme de Kahn retire de façon répétée un sommet sans arête entrante, l'ajoute à l'ordre et décrémente le degré entrant de ses voisins ; une file contient les sommets de degré entrant nul. L'approche DFS effectue un parcours en profondeur et émet les sommets dans l'ordre inverse de leurs temps de fin. Les deux s'exécutent en O(V + E). S'il reste des sommets non traités (Kahn) ou qu'une arête de retour apparaît (DFS), le graphe a un cycle et aucun ordre valide n'existe.
L'ordre topologique planifie les systèmes de build comme Make et Gradle, résout l'ordre d'installation des paquets, séquence les cours universitaires à prérequis, ordonne l'évaluation des cellules de tableur et planifie l'exécution des instructions dans les compilateurs. C'est l'une des questions d'entretien de difficulté moyenne les plus courantes sur les graphes orientés.
Deux formulations standard, toutes deux linéaires. Kahn progresse depuis les sommets sans prérequis; la variante DFS travaille à rebours depuis les dates de fin.
// Kahn: retirer a repetition un sommet sans arete entrante
calculer degreEntrant[v] pour chaque sommet
file = tous les sommets de degreEntrant 0
ordre = []
tant que la file est non vide:
u = file.retirer()
ordre.ajouter(u)
pour chaque arete (u, v):
degreEntrant[v] -= 1
si degreEntrant[v] == 0: file.ajouter(v)
si ordre.longueur < V: le graphe contient un cycle
// Variante DFS: inverse de l ordre de fin
lancer un DFS; empiler chaque sommet a sa fin
la pile depilee donne un ordre topologique valideKahn possède un avantage pratique qu'il vaut la peine de connaître: comme il détecte un cycle en comptant combien de sommets il a réussi à émettre, les sommets restants sont exactement ceux impliqués dans un cycle ou situés en aval. Cela le rend bien plus utile qu'un simple booléen lorsqu'il faut signaler quelles dépendances sont circulaires.
Exécute Kahn sur un petit graphe de dépendances de compilation, où une arête X vers Y signifie que X doit être construit avant Y.
Graphe d'exemple: Arêtes orientées A vers C, B vers C, C vers D et B vers D.
Un ordre valide est A, B, C, D. Note que B, A, C, D l'est tout autant: A et B n'ont aucun prérequis et leur ordre relatif n'est pas contraint. L'ordre topologique n'est unique que si le graphe forme une seule chaîne, raison pour laquelle les tests devraient vérifier que chaque arête pointe vers l'avant plutôt que de comparer à une séquence attendue.
Temps: O(V + E) · Espace: O(V)
Calculer tous les degrés entrants exige un parcours de toutes les arêtes, O(E). Chaque sommet est enfilé et défilé exactement une fois, O(V). Chaque arête est examinée exactement une fois, lorsque sa source est émise et que le degré entrant de la cible est décrémenté, encore O(E). L'espace contient le tableau des degrés entrants, la file et la liste de sortie, tous en O(V). La variante DFS a les mêmes bornes, la pile de récursion remplaçant la file. Aucune ne peut être améliorée, puisque tout algorithme correct doit lire chaque arête pour connaître les contraintes.
Kahn et DFS produisent des ordres également valides. Choisis selon ce dont tu as besoin en plus de l'ordonnancement.
| Alternative | À préférer quand | Coût |
|---|---|---|
| Kahn (style BFS) | Tu veux un diagnostic de cycle, ou l'ordre lexicographiquement minimal via une file de priorité, ou tu dois éviter une récursion profonde. | O(V + E) |
| Ordre de fin en DFS | Tu lances déjà un DFS pour d'autres raisons, ou tu veux l'implémentation la plus courte. | O(V + E) |
| CFC de Tarjan | Le graphe comporte des cycles et tu veux les condenser en un DAG plutôt que rejeter l'entrée. | O(V + E) |
| Plus long chemin / CPM | Les sommets portent des durées et tu veux le chemin critique. C'est un tri topologique suivi d'une passe de programmation dynamique. | O(V + E) |
Lire l'article complet: Graph Algorithms in Coding Interviews
Algorithmes associés: Recherche en Profondeur (DFS), Détection de Cycles, Méthode du Chemin Critique (CPM)