Apprentissage interactif de la théorie des graphes
Apprentissage interactif de la théorie des graphes
Guest User
Using app without sign in
Visualiseur interactif de parcours en profondeur
Explore aussi profondément que possible en utilisant une pile
Sélectionnez un algorithme et générez les étapes pour commencer la visualisation
Le parcours en profondeur (DFS) est un algorithme de parcours de graphe qui explore aussi loin que possible le long de chaque branche avant de revenir en arrière. À partir d'un nœud source, il suit un chemin jusqu'à une impasse, puis remonte au point de branchement le plus récent et essaie l'arête inexplorée suivante, généralement par récursion ou avec une pile explicite.
DFS marque le nœud de départ comme visité, puis visite récursivement le premier voisin non visité, en s'enfonçant à chaque étape. Quand un nœud n'a plus de voisin non visité, la récursion se déroule et la recherche reprend depuis le nœud précédent. Chaque sommet et chaque arête est traité exactement une fois, donnant O(V + E) temps et O(V) espace. L'ordre d'entrée et de sortie de la récursion produit des temps de découverte et de fin utilisés par de nombreux algorithmes dérivés.
DFS est le fondement du tri topologique, de la détection de cycles, des composantes fortement connexes, des points d'articulation, des ponts et de la génération de labyrinthes. En pratique, il sous-tend la résolution de dépendances dans les outils de build, la détection d'interblocages et les solveurs de casse-têtes. Les recruteurs utilisent DFS constamment dans les problèmes de backtracking, d'îles dans une grille et d'énumération de chemins.
DFS s'écrit généralement de façon récursive, mais la forme itérative rend la pile explicite et évite de saturer la pile d'appels sur les graphes profonds. Les deux produisent le même ordre de découverte.
DFS(graphe, source):
temps = 0
visiter(source)
visiter(u):
visites.ajouter(u)
dec[u] = ++temps // date de découverte
pour chaque voisin v de u:
si v absent de visites:
parent[v] = u
visiter(v)
fin[u] = ++temps // date de finLes dates de découverte et de fin sont le véritable produit du DFS. L'intervalle [dec[u], fin[u]] d'un descendant est strictement imbriqué dans celui de son ancêtre, et cette imbrication fonde le tri topologique, la détection de cycles, les composantes fortement connexes de Tarjan, les points d'articulation et les ponts.
Exécute DFS depuis A sur le graphe chargé par défaut dans le visualiseur, en prenant toujours les voisins par ordre alphabétique.
Graphe d'exemple: Arêtes non orientées A-B (2), A-C (3), B-C (1) et C-D (4). DFS ignore les poids.
L'ordre de parcours est A, B, C, D. BFS visite ces quatre sommets dans le même ordre, mais les arbres diffèrent: BFS construit un arbre plat avec A vers B, A vers C et C vers D, tandis que DFS construit la chaîne unique A vers B vers C vers D. L'arête arrière C vers A identifie le cycle A-B-C-A, et les intervalles imbriqués A[1,8], B[2,7], C[3,6], D[4,5] montrent directement la profondeur de récursion.
Temps: O(V + E) · Espace: O(V)
Chaque sommet est visité exactement une fois car le test de visite protège l'appel récursif, et chaque arête est examinée une fois depuis chaque extrémité, soit 2E inspections dans un graphe non orienté et E dans un graphe orienté. L'espace est l'ensemble des visités plus la pile de récursion, tous deux en O(V). La profondeur de récursion vaut la longueur du plus long chemin simple, donc sur un graphe en chaîne d'un million de sommets une implémentation récursive saturera la pile d'appels dans la plupart des langages et il faut la forme à pile explicite.
Choisis DFS quand la question porte sur la structure. Choisis BFS quand elle porte sur la distance.
| Alternative | À préférer quand | Coût |
|---|---|---|
| BFS | Tu veux le moins de sauts, un parcours par niveaux, ou le graphe est très profond et les réponses sont probablement proches de la source. | O(V + E) |
| Approfondissement itératif | Le graphe est pratiquement infini ou très profond et tu veux malgré tout la solution la moins profonde sans le coût mémoire du BFS. | O(b^d) |
| Composantes fortement connexes de Tarjan | Tu veux précisément les CFC d'un graphe orienté. C'est un DFS augmenté du calcul des low-link en une seule passe. | O(V + E) |
| Union-Find | Tu n'as besoin que des composantes connexes d'un graphe non orienté et les arêtes arrivent au fil de l'eau. | quasi O(E) |
Lire l'article complet: BFS vs DFS: When to Use Each Traversal
Algorithmes associés: Recherche en Largeur (BFS), Tri Topologique, Détection de Cycles