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 largeur
Explore les nœuds niveau par niveau en utilisant une file
Sélectionnez un algorithme et générez les étapes pour commencer la visualisation
Le parcours en largeur (BFS) est un algorithme fondamental de parcours de graphe qui explore un graphe niveau par niveau. À partir d'un nœud source, il visite chaque voisin à distance un, puis chaque nœud à distance deux, et ainsi de suite, en utilisant une file pour gérer la frontière. Comme il étend toujours d'abord les nœuds non visités les plus proches, BFS trouve le plus court chemin dans tout graphe non pondéré.
BFS place le nœud de départ dans une file et le marque comme visité. Il retire ensuite de façon répétée le nœud en tête, examine ses voisins et ajoute à la fin tout voisin pas encore visité. Cette discipline premier entré, premier sorti garantit que les nœuds sont traités par distance croissante à la source. L'algorithme s'exécute en temps O(V + E) et espace O(V), où V est le nombre de sommets et E celui des arêtes.
BFS alimente les requêtes de plus court chemin dans les réseaux non pondérés, les robots d'indexation web, les suggestions d'amis dans les réseaux sociaux, les recherches de diffusion GPS et le parcours par niveaux des arbres. Il est aussi la base d'algorithmes avancés comme Edmonds-Karp pour le flot maximum. BFS est l'un des sujets les plus posés en entretien de programmation, apparaissant dans les problèmes de grille, de labyrinthe et d'échelle de mots.
Tout l'algorithme tient dans une file et un ensemble de sommets visités. Toutes les autres propriétés qui font la réputation du BFS découlent de l'ordre dans lequel la file restitue les sommets.
BFS(graphe, source):
visites = {source}
dist[source] = 0
file = [source]
tant que la file est non vide:
u = file.retirerPremier()
pour chaque voisin v de u:
si v absent de visites:
visites.ajouter(v)
dist[v] = dist[u] + 1
parent[v] = u
file.ajouterEnFin(v)L'invariant est que la file contient toujours des sommets appartenant à au plus deux niveaux de distance consécutifs, en ordre croissant au sens large. Cette seule propriété rend dist correct: un sommet reçoit sa distance la première fois qu'il est vu, et il ne peut plus être atteint à moindre coût par la suite.
Exécute BFS depuis A sur le graphe chargé par défaut dans le visualiseur, afin de suivre chaque étape dans le panneau ci-dessus.
Graphe d'exemple: Arêtes non orientées A-B (2), A-C (3), B-C (1) et C-D (4). BFS ignore totalement les poids et compte les sauts, chaque arête vaut donc un.
Les distances finales sont A 0, B 1, C 1, D 2, et les pointeurs parents donnent l'arbre des plus courts chemins A vers B, A vers C et C vers D. Remarque que BFS atteint D en passant par C alors que le coût pondéré de ce trajet vaut 7 contre 3 pour A vers B vers C: la seule chose optimisée est le nombre de sauts, ce qui explique précisément pourquoi les graphes pondérés exigent Dijkstra.
Temps: O(V + E) · Espace: O(V)
Chaque sommet entre dans la file au plus une fois, parce qu'il est marqué visité au moment de l'enfilement et non du défilement. Cela borne la boucle externe à V itérations. À l'intérieur, le travail est proportionnel au degré du sommet courant, et la somme de tous les degrés vaut 2E dans un graphe non orienté, donc le parcours des voisins totalise O(E). L'espace est dominé par l'ensemble des visités, le tableau des distances et la file, chacun en O(V). Avec une matrice d'adjacence, le parcours des voisins coûte O(V) par sommet et l'exécution complète se dégrade en O(V au carré).
BFS est le choix par défaut tant que les arêtes ne sont pas pondérées. Dès que des poids apparaissent, ou que l'objectif passe de la distance à la structure, autre chose l'emporte.
| Alternative | À préférer quand | Coût |
|---|---|---|
| DFS | Tu cherches des faits structurels plutôt qu'une distance: cycles, tri topologique, composantes, ponts. Il consomme aussi moins de mémoire sur les graphes larges. | O(V + E) |
| Algorithme de Dijkstra | Les arêtes portent des poids positifs ou nuls, donc le nombre de sauts n'est plus la distance. | O((V + E) log V) |
| BFS 0-1 | Tous les poids valent 0 ou 1. Une deque remplace la file et bat une véritable file de priorité. | O(V + E) |
| BFS bidirectionnel | Tu veux la distance entre une paire précise dans un grand graphe et tu peux chercher en arrière depuis la cible. | O(b^(d/2)) |
Lire l'article complet: BFS vs DFS: When to Use Each Traversal
Algorithmes associés: Recherche en Profondeur (DFS), Algorithme de Dijkstra, Vérification Bipartite