Vous êtes sur la page 1sur 4

Algorithme de parcours en largeur

L'algorithme de parcours en largeur (ou BFS,


pour Breadth First Search en anglais) permet le Algorithme de parcours en largeur
parcours d'un graphe ou d'un arbre de la manière
suivante  : on commence par explorer un nœud
source, puis ses successeurs, puis les successeurs
non explorés des successeurs, etc. L'algorithme de
parcours en largeur permet de calculer les distances
de tous les nœuds depuis un nœud source dans un
graphe non pondéré (orienté ou non orienté). Il
peut aussi servir à déterminer si un graphe non
orienté est connexe.

Ordre dans lequel les nœuds sont parcourus

Sommaire Découvreur ou Konrad Zuse


Principe inventeur

Exemple Date de 1945


découverte
Pseudo code
Problèmes liés Uninformed search algorithm
Complexité (d), Parcours de graphe
Applications Structure des Graphe
Évocation dans la littérature données
Notes et références Complexité en temps
Voir aussi Pire cas
Complexité en espace
Principe Pire cas

Un parcours en largeur débute à partir d'un nœud


source. Puis il liste tous les voisins de la source, pour ensuite les explorer
un par un. Ce mode de fonctionnement utilise donc une file dans laquelle
il prend le premier sommet et place en dernier ses voisins non encore
explorés. Les nœuds déjà visités sont marqués afin d'éviter qu'un même
nœud soit exploré plusieurs fois. Dans le cas particulier d'un arbre, le
marquage n'est pas nécessaire. Voici les étapes de l'algorithme :

1. Mettre le nœud source dans la file.


2. Retirer le nœud du début de la file pour le traiter.
3. Mettre tous ses voisins non explorés dans la file (à la fin). Exemple animé de l'algorithme
4. Si la file n'est pas vide reprendre à l'étape 2. de parcours en largeur.

L'algorithme de parcours en profondeur diffère du parcours en largeur


car il continue l'exploration jusqu'à arriver un cul-de-sac. C'est seulement à ce moment-là qu'il revient en
arrière pour explorer depuis un autre nœud voisin. L'utilisation d'une pile au lieu d'une file transforme

l'algorithme du parcours en largeur en l'algorithme de parcours en profondeur.

Exemple
Sur le graphe suivant, cet algorithme va alors fonctionner ainsi :

Il explore dans l'ordre les sommets A, B, C, E, D, F, G, contrairement à l'algorithme de parcours en


profondeur qui cherche dans cet ordre : A, B, D, F, C, G, E.

Pseudo code
L'algorithme s'implémente à l'aide d'une file.

ParcoursLargeur(Graphe G, Sommet s):

f = CreerFile();

f.enfiler(s);

marquer(s);

tant que la file est non vide

s = f.defiler();

afficher(s);

pour tout voisin t de s dans G

si t non marqué

f.enfiler(t);

marquer(t);

Complexité
La complexité en temps dans le pire cas est en où est le nombre de sommets et est le
nombre d'arcs. En effet, chaque arc et chaque sommet est visité au plus une seule fois. Montrons le. Soit un
graphe G=(S, A), dont aucun sommet n'est marqué à l'appel de l'algorithme. Tous les sommets insérés dans
la file sont marqués et l'instruction conditionnelle assure donc que les sommets seront insérés au plus une
fois, comme l'insertion dans la file se fait en Θ(1), la complexité est en Θ(S). La boucle sur les voisins t d'un
sommet s consiste à lister les voisins a une complexité en temps de l'ordre de grandeur du nombre de
voisins de s (on parcourt la liste d'adjacence du sommet s). Comme la somme des longueurs des listes
d'adjacence est |A| (le nombre d'arêtes), la complexité totale passée dans cette boucle pour tout s est Θ(A).
1
Cormen et al. (voir p. 552 ) appelle une telle analyse une analyse par agrégat. La complexité totale est
1
donc Θ(|S|+|A|) .

Applications
Le parcours en largeur explore tous les sommets accessibles depuis le sommet source. On peut utiliser cet
algorithme pour calculer les composantes connexes d'un graphe non orienté avec une complexité linéaire en
l t ill d g h
la taille du graphe.

De plus, lors de ce parcours, les sommets sont explorés par distance croissante au sommet source. Grâce à
cette propriété, on peut utiliser l'algorithme pour résoudre le problème de cheminement suivant  : calculer
des plus courts chemins entre le sommet source et tous les sommets du graphe. L'algorithme de Dijkstra
peut être vu comme une généralisation du parcours en largeur avec des arcs pondérés positivement.

Un raffinement appelé LexBFS permet de reconnaître rapidement certaines classes de graphes.

Évocation dans la littérature


Dans son roman Le Nom de la rose, Umberto Eco fait expliquer par Guillaume de
Baskerville un algorithme de parcours en largeur pour explorer méthodiquement un
2
labyrinthe :

« Pour trouver la sortie d'un labyrinthe, récita en effet Guillaume, il n'y a qu'un moyen. À
chaque nœud nouveau, autrement dit jamais visité avant, le parcours d'arrivée sera marqué
de trois signes. Si, à cause de signes précédents sur l'un des chemins du nœud, on voit que
ce nœud a déjà été visité, on placera un seul signe sur le parcours d'arrivée. Si tous les
passages ont été déjà marqués, alors il faudra reprendre la même voie, en revenant en
arrière. Mais si un ou deux passages du nœud sont encore sans signes, on en choisira un
quelconque, pour y apposer deux signes. Quand on en apposera deux autres, de façon que
ce passage en porte trois dorénavant. Toutes les parties du labyrinthe devraient avoir été
parcourues si, en arrivant à un nœud, on ne prend jamais le passage avec trois signes, sauf
si d'autres passages sont encore sans signes. »

Notes et références
1. Thomas Cormen, Charles Leiserson, Ronald Rivest, Clifford Stein, "Introduction à
l'algorithmique", DUNOD, 2001, 3e éd. (1re éd. 1990), 1176 p. (ISBN 2-10-003922-9)
2. Umberto Eco (trad. de l'italien par Jean-Noël Schifano), Le Nom de la rose, 1980, Deuxième
jour, « Nuit ».

Voir aussi
Algorithme de parcours en profondeur
Algorithme de recherche en faisceau
algorithme de Dijkstra

Ce document provient de « https://fr.wikipedia.org/w/index.php?


title=Algorithme_de_parcours_en_largeur&oldid=188863101 ».

La dernière modification de cette page a été faite le 14 décembre 2021 à 11:57.

Droit d'auteur : les textes sont disponibles sous licence Creative Commons attribution, partage dans les mêmes
conditions ; d’autres conditions peuvent s’appliquer. Voyez les conditions d’utilisation pour plus de détails, ainsi que
les crédits graphiques. En cas de réutilisation des textes de cette page, voyez comment citer les auteurs et
mentionner la licence.
Wikipedia® est une marque déposée de la Wikimedia Foundation, Inc., organisation de bienfaisance régie par le
paragraphe 501(c)(3) du code fiscal des États-Unis.
Politique de confidentialité
À propos de Wikipédia
Avertissements
Contact
Développeurs
Statistiques
Déclaration sur les témoins (cookies)

Vous aimerez peut-être aussi