L'algorithme de recherche en largeur d'abord parcourt les sommets par "niveaux" dans l'arbre formé par le graphe. Le but est donc ici d'explorer tous les sommets suivants (enfants directs) d'un sommet donné, alors que DFS explore les sommets successeurs (du haut vers le bas, branche par branche). Nous n'avons donc pas de backtracking pour BFS, car nous ne devons jamais considérer le sommet précédent.
L'exemple suivant illustre l'algorithme BFS en action. Les sommets sont numérotés dans l'ordre d'exploration BFS.


Nous pouvons décomposer notre algorithme en deux phases : une phase d'initialisation des valeurs, et une phase d'exécution qui décrit ce qui se passe lorsque l'algorithme est exécuté.
La phase d'exécution décrit comment traiter un sommet.
Dans cette approche, nous utilisons des collections indexées (par exemple des tableaux) pour maintenir les différentes informations relatives aux états de chaque objet Sommet. Dans une approche "orienté-objet", nous pouvons maintenir ces informations par exemple dans l'objet Sommet lui même.
Nous utiliserons aussi certaines variables supplémentaires :
arrayFirstIndex : indice du premier élément dans un tableau[1].
Nous devons initialiser les tableaux avec une taille correspondant à n.
Nous emploierons ∀j pour raccourcir la notation ∀(j ≥ arrayFirstIndex) ∧ (j < n+arrayFirstIndex), ce qui signifie pour tout emplacement du tableau
.
//si parentVertex > vertexOrder, nous avons visité tous les sommets /* initialisation du sommet courant, et on sait que visitedVertices[i]=true car il est marqué comme visité AVANT d'être placé dans orderedVertices */ i := orderedVertices[parentVertex]; //parentVertex pointe maintenant sur le prochain sommet à évaluer parentVertex := parentVertex+1; /* i est l'indice de x, j est l'indice de y ∃ y suivant de x, et non visité cette boucle stocke tous les sommets d'un même niveau */ //marquer y comme visité //pointer vers l'indice suivant dans orderedVertices vertexOrder := vertexOrder+1; //stocker l'indice du sommet orderedVertices[vertexOrder] := j;
//si parentVertex > vertexOrder, nous avons visité tous les sommets /* initialisation du sommet courant, et on sait que visitedVertices[i]=true car il est marqué comme visité AVANT d'être placé dans orderedVertices */ i := orderedVertices[parentVertex]; //parentVertex pointe maintenant sur le prochain sommet à évaluer parentVertex := parentVertex+1; /* i est l'indice de x, j est l'indice de y ∃ y suivant de x, et non visité cette boucle stocke tous les sommets d'un même niveau */ //marquer y comme visité //le sommet j a été atteint depuis le sommet i previousVertices[j] := i; //pointer vers l'indice suivant dans orderedVertices vertexOrder := vertexOrder+1; //stocker l'indice du sommet orderedVertices[vertexOrder] := j;
Selon notre implémentation, le tableau orderedVertices contient les indices des sommets de X, naturellement trié selon l'ordre de découverte des sommets.
Si nous désirons travailler comme pour notre algorithme DFS, il nous pouvons remplacer orderedVertices[vertexOrder] := j; par orderedVertices[j] := vertexOrder; (ligne 24
27). Nous devrons ensuite modifier la ligne 10 pour que parentVertex pointe sur le premier des suivants de i au lieu d'une incrémentation.
Dans ce cas, le tableau est trié (comme les autres tableaux) dans l'ordre des indices des sommets dans X, et contient pour chaque indice le numéro d'ordre du sommet correspondant.
Dans le cas d'une implémentation avec arrayFirstIndex = 0, nous devons remplacer ≥ par > dans la comparaison entre vertexOrder et parentVertex (ligne 2).
L'instruction de la ligne 21 n'est pas strictement nécessaire car BFS ne nécessite pas de mémoriser quel est le sommet précédent. Dans ce cas, l'initialisation ∀j : previousVertices[j] := -1 n'est pas nécessaire non plus.
Nous pouvons observer pour un même graphe les différences entre le parcours DFS et le parcours BFS. Les sommets sont marqués dans l'ordre d'exploration.
Dans le cas de DFS, les sommets sont explorés dans l'arbre "de haut en bas", alors que pour BFS ils sont explorés "par niveaux"


Au niveau de la complexité, les algorithmes DFS et BFS sont identiques
(m) car chaque arc n'est évalué qu'une seule fois. Ils diffèrent seulement par leur mode opératoire.
Les propos suivants s'appliquent aux implémentations que nous avons vu pour les algorithmes DFS et BFS, mais il existe de nombreuses autres implémentations qui respectent les caractéristiques de ces algorithmes.
Dans le cas de notre implémentation DFS, nous devons utiliser un numéro d'ordre pour les sommets. Nous pouvons trouver le numéro d'ordre d'un sommet en consultatnt le tableau verticesOrders à l'indice correspondant au sommet en question.
Notre implémentation de l'algorithme BFS, au contraire utilise un tableau orderedVertices pour lequel les indices correspondent au numéro d'ordre, et les valeurs correspondent aux indices des sommets.
Notre implémentation de DFS utilise un tableau de booléens closedVertices pour signaler qu'un sommet est visité et qu'il ne reste aucun sommet non visité depuis ce dernier. Ceci n'est pas nécessaire dans BFS car nous utilisons une comparaison d'indices.
Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher les interactions avec les réseaux sociaux sur ces pages.
43 mots clés dont 28 définis manuellement (plus d'information...).
Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher le nuage de mots clés.
Cours de Théorie des Graphes et réseaux de Petri(Septembre 2008)
Shortest paths in graphs(version 12/12/09)
Parcours en largeur + applet Java
Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.
Recherche (afficher)
Utilisateur (masquer)
Navigation (masquer)
Apparence (afficher)
Stats (afficher)
Citation (masquer)