TL;DR: L'algorithme de Kosaraju trouve des composants fortement connectés dans un graphe orienté en utilisant deux recherches en profondeur d'abord passe. Enregistrez d'abord les sommets en diminuant le temps d'arrivée, transposez chaque arête, puis explorez le graphique transposé dans cet ordre. Le temps d'exécution est O(V + E) et le stockage auxiliaire est O(V + E) lorsque la transposition est stockée.
Algorithme de Kosaraju : Guide des composants fortement connectés
Apprenez l'algorithme de Kosaraju pour les composants fortement connectés avec l'intuition, les étapes, la complexité, le pseudocode, les exemples, les erreurs courantes et la pratique des entretiens.
Essayez YesToTheOfferQuel est l'algorithme de Kosaraju ? L'algorithme

Kosaraju divise un graphe orienté en composants fortement connectés, ou SCC. À l’intérieur d’un SCC, chaque sommet peut atteindre tous les autres sommets. La contraction de chaque SCC en un seul nœud produit un graphe acyclique dirigé, ce qui rend les composants utiles pour l'analyse des dépendances, les graphiques de programme, l'accessibilité et la condensation des graphiques.
L'algorithme utilise une propriété structurelle de recherche en profondeur d'abord. Les temps d'arrivée du graphique d'origine identifient un ordre sûr pour explorer le graphique transposé. L'inversion de chaque arête permute les relations source et récepteur entre les composants, de sorte qu'une recherche ne peut pas s'infiltrer dans un composant non attribué lorsque les sommets sont traités dans le bon ordre.
Comment fonctionne l'algorithme en deux passes ?
- Créez un ensemble visité et une liste d'ordres de fin vide.
- Exécutez une recherche en profondeur d'abord à partir de chaque sommet non visité du graphique d'origine.
- Ajoutez chaque sommet une fois que tous ses voisins sortants ont terminé.
- Construisez la transposition en inversant chaque bord dirigé.
- Effacez l'ensemble visité.
- Traitez les sommets dans l'ordre de fin inverse.
- Chaque arbre DFS dans le graphique transposé est un composant fortement connecté.
Vous pouvez stocker des sommets sur une pile lors du retour de leur premier appel DFS. Faire éclater la pile donne naturellement un temps de fin décroissant. Le graphique peut être déconnecté, donc les deux boucles externes doivent prendre en compte chaque sommet plutôt que de partir uniquement du sommet zéro.
Pourquoi l'inversion de l'ordre d'arrivée détecte-t-elle les SCC ?
Imaginez compresser chaque SCC en un seul nœud. Le graphique de condensation résultant n’a pas de cycle dirigé. Dans le premier DFS, le composant ayant la dernière heure de fin pertinente se comporte comme une source dans cette structure condensée. Après transposition du graphique, ce composant se comporte comme un puits, donc un DFS commencé là-bas reste à l'intérieur.
La suppression de ce composant révèle le même argument pour le prochain composant non attribué. C'est l'idée de preuve que les enquêteurs souhaitent généralement : l'ordre de finition sélectionne les composants en toute sécurité et la transposition empêche le deuxième passage de franchir la mauvaise limite de sortie. Vous n’avez pas besoin de reproduire une longue preuve formelle, mais vous devez expliquer les deux rôles.
Quelles sont les complexités temporelles et spatiales ?
Chaque passe de recherche en profondeur visite chaque sommet et examine chaque arête une fois, et la construction de la transposition prend également un temps linéaire. Le temps total est donc O(V + E). Avec des listes de contiguïté pour le graphique et la transposition, le stockage est O(V + E), plus O(V) pour l'état visité, l'ordre de fin et la récursivité ou une pile explicite.
| Phases | Temps | Objectif supplémentaire |
|---|---|---|
| Premier DFS | O(V+E) | Ordre d'arrivée record |
| Transposer | O(V+E) | Sens du bord inversé |
| Deuxième DFS | O(V+E) | Collecter les composants |
| Total | O(V+E) | Linéaire dans la représentation graphique |
Pour les graphiques très profonds, le DFS récursif peut dépasser la limite de pile d'appels d'un langage. Mentionner une pile itérative montre une conscience de la production sans modifier la limite asymptotique.

Quel pseudocode connaître pour un entretien ?
finish_order = []
visité = set()
pour le sommet du graphique :
si le sommet n'est pas visité :
dfs_finish(sommet, graphique, visité, finish_order)
transpose = reverse_all_edges (graphique)
visité.clear()
composants = []
pour le sommet en sens inverse (finish_order):
si le sommet n'est pas visité :
composant = []
dfs_collect (sommet, transposition, visité, composant)
composants.append (composant)
Dans dfs_finish, ajoutez le sommet après avoir visité les voisins. Dans dfs_collect, ajoutez le sommet lorsqu'il est découvert. Gardez ces deux responsabilités séparées ; l'utilisation de la précommande lors du premier passage est une erreur courante.
Quelles erreurs interrompent généralement une implémentation de Kosaraju ?
Les erreurs les plus courantes sont l'enregistrement de l'ordre de découverte au lieu de l'ordre de fin, l'oubli d'inverser l'ordre pour la deuxième passe, l'inversion de seulement certaines arêtes, la réutilisation de l'état visité sans l'effacer et l'omission des sommets isolés ou déconnectés. Une autre erreur consiste à traiter un graphe non orienté comme si les SCC avaient le même sens ; les composants connectés sont le concept le plus simple.
Testez un seul sommet, un sommet isolé, un cycle dirigé, une chaîne unidirectionnelle, deux cycles reliés par une arête, des boucles automatiques et un graphe déconnecté. Vérifiez la partition plutôt que de vous fier à l'ordre de sortie des composants, car différents ordres de parcours DFS valides peuvent répertorier les composants ou les sommets différemment.
Comment Kosaraju se compare-t-il à l'algorithme de Tarjan ?
Les deux algorithmes trouvent les SCC dans O(V + E). Kosaraju utilise deux passes DFS et stocke généralement un graphique transposé, ce qui peut simplifier le raisonnement et la mise en œuvre. Tarjan utilise un DFS avec des indices de découverte, des valeurs de liens faibles et une pile ; il évite une transposition explicite mais a plus d'état à maintenir correctement.
Lors d'un entretien, choisissez l'algorithme que vous pouvez expliquer et mettre en œuvre de manière fiable, à moins que les contraintes ne le favorisent. Si l'intervieweur demande une seule passe ou aucune transposition, Tarjan pourrait mieux s'adapter. Si la clarté et une preuve directe sont des priorités, Kosaraju est souvent un excellent choix.
Comment l’IA peut-elle soutenir la pratique responsable des algorithmes graphiques ?
AI peut générer de petits contre-exemples, tracer l'état DFS, comparer les implémentations et remettre en question une explication complexe. L'assistance au codage peut aider à localiser un bug de classement ou d'état visité, tandis que l'examen de la transcription peut montrer si vous avez expliqué clairement l'idée de la preuve.
Dessinez et tracez toujours vous-même au moins un graphique, exécutez des tests et vérifiez les réclamations générées. Suivez les règles d’évaluation et n’utilisez pas d’assistance interdite. YesToTheOffer prend en charge la préparation au codage, le raisonnement en temps réel autorisé, les notes privées et la révision post-entretien.
Foire aux questions
FAQ
À quoi sert l'algorithme de Kosaraju ?
L'algorithme de Kosaraju trouve des composantes fortement connectées dans un graphe orienté. Les SCC contribuent à simplifier les structures d'accessibilité et de dépendance, car chaque composant peut être réduit en un seul nœud, produisant ainsi un graphe de condensation acyclique dirigé.
Pourquoi l'algorithme de Kosaraju a-t-il besoin de deux passes DFS ?
La première passe calcule un ordre d'heure de fin qui identifie le composant pouvant être exploré ensuite en toute sécurité. La deuxième passe s'exécute sur le graphique transposé, où les bords inversés empêchent cette recherche de s'échapper vers un autre composant non attribué.
Quelle est la complexité de l’algorithme de Kosaraju ?
La complexité temporelle est O(V + E) : deux passes DFS et une inversion de bord sont chacune linéaires dans un graphe de liste de contiguïté. Les listes de contiguïté stockées pour les graphiques d'origine et transposés utilisent l'espace O(V + E), avec un état de parcours O(V) supplémentaire.
L’ordre de sortie des composants est-il important ?
Généralement non. Différents ordres de contiguïté peuvent modifier le parcours DFS et l'ordre des sommets ou des composants tout en produisant la même partition valide. Les tests doivent comparer l'appartenance aux composants sous forme d'ensembles, sauf si un problème nécessite explicitement un ordre particulier.
L'algorithme de Tarjan est-il meilleur que celui de Kosaraju ?
Ni l’un ni l’autre n’est universellement meilleur. Les deux fonctionnent en O(V + E). Tarjan utilise un DFS et aucune transposition explicite mais maintient un état de liaison faible ; Kosaraju utilise deux passes conceptuellement simples et stocke généralement le graphique inversé. Choisissez en fonction des contraintes et de la fiabilité de la mise en œuvre.
Transformez la pratique en un système reproductible
Élaborez un plan de pratique fondé sur des données probantes, utilisez un soutien responsable lorsque cela est autorisé et révisez la conversation pendant qu'elle est fraîche.
Transformez la pratique en un système reproductible
Préparez-vous avec vos propres preuves et examinez chaque réponse avec un contexte plus clair.
Essayez YesToTheOffer