Sauter à un chapitre clé
Qu'est-ce que le Breadth First Search en informatique ?
La recherche par ordre croissant (BFS) est une technique clé en informatique, en particulier dans les domaines de la théorie des graphes et de la manipulation des structures de données. Il s'agit essentiellement d'un algorithme permettant de parcourir ou de rechercher des structures de données arborescentes ou graphiques. Le facteur unique de cet algorithme de recherche est qu'il explore tous les sommets d'un graphe au niveau de profondeur actuel avant de passer aux nœuds du niveau de profondeur suivant.
Le niveau de profondeur, dans ce contexte, fait référence à la distance (le nombre minimum d'arêtes) à partir de la racine ou du nœud de départ désigné. Ainsi, le niveau de profondeur 0 correspond au nœud de départ ; le niveau de profondeur 1 comprend tous les nœuds directement connectés au nœud de départ, et ainsi de suite.
Comprendre l'algorithme de recherche en profondeur (Breadth First)
L'algorithme Breadth First Search visite systématiquement tous les nœuds du niveau de profondeur actuel avant de passer au suivant. Ce processus "niveau par niveau" distingue l'algorithme BFS d'autres algorithmes de recherche tels que l'algorithme Depth First Search, qui parcourt un chemin aussi profond que possible avant de revenir sur ses pas. Pour mettre en œuvre l'algorithme BFS, tu utilises principalement une structure de données appelée file d'attente, en suivant la stratégie FIFO (First in, First out).
Le pseudocode simple de BFS est le suivant :BFS (graphe G, sommet de départ s) : // tous les nœuds initialement inexplorés marquent s comme exploré let Q = structure de données de file d'attente, initialisée avec s while Q is not empty : remove the first node of Q, call it v for each edge(v, w) : // pour les voisins de v si w est inexploré : marquer w comme exploré ajouter w à Q (à la fin)
Composants clés de l'algorithme de recherche en largeur (Breadth First)
Les principaux composants de l'algorithme Breadth First Search sont les suivants :- Le graphe: une structure de données non linéaire composée de nœuds et d'arêtes.
- La file d'attente: un type particulier de structure de données abstraite où les éléments sont conservés dans l'ordre et où les principales opérations sont l'enqueue (ajout d'entités) et le dequeue (retrait d'entités).
- Le tableau visité: pour garder une trace des nœuds déjà visités, afin d'éviter les boucles infinies.
Exemples pratiques de Breadth First Search
Lorsque tu utilises l'algorithme BFS sur une structure graphique, tu crées implicitement un arbre Breadth-First. Cet arbre a pour racine le nœud source, et tous les nœuds situés à la même distance de la source se trouvent au même niveau de profondeur de l'arbre.Supposons qu'il existe un graphe non pondéré et non orienté comme le suivant :
1 | --- | 2 |
| | | | |
3 | --- | 4 |
Cas d'utilisation réels de la recherche par largeur d'abord
Le BFS revêt une grande importance pratique dans les scénarios de la vie réelle. En voici quelques-uns :- Dans les algorithmes de routage de réseau, BFS aide à trouver tous les nœuds voisins.
- Pour la recherche de chemins dans des cartes géographiques réelles, basées sur des pixels ou virtuelles.
- Dans l'exploration du Web, où les araignées utilisent BFS pour limiter leur profondeur d'exploration.
- Pour les sites Web de réseaux sociaux, où BFS peut aider à trouver toutes les personnes se trouvant à une distance d'"amitié" donnée, par exemple.
En outre, l'algorithme BFS est essentiel pour l'apprentissage automatique. Il joue un rôle crucial dans le modèle d'apprentissage basé sur les arbres de décision en extrayant des modèles utiles ou des arbres de décision à partir d'ensembles de données.
Recherche en largeur d'abord vs recherche en profondeur d'abord
Lorsque l'on examine le contraste entre Breadth First Search (BFS) et Depth First Search (DFS), on constate qu'il s'agit en fait de deux pierres angulaires différentes de la théorie des graphes en informatique, chacune ayant des caractéristiques et des cas d'utilisation distincts. Leur principal point commun est qu'il s'agit d'algorithmes permettant de parcourir et de rechercher des structures de données graphiques, mais la façon dont ils effectuent ce processus est très différente.
Similitudes et différences : Recherche en largeur d'abord et recherche en profondeur d'abord
Malgré leurs différences évidentes, BFS et DFS partagent une poignée de caractéristiques. Par exemple, ils partent tous deux d'un nœud racine ou de n'importe quel nœud arbitraire pour parcourir le graphe. De plus, leur objectif est de visiter chaque nœud du graphe exactement une fois, c'est pourquoi ils maintiennent une liste "visitée" ou un hachage pour suivre les nœuds déjà rencontrés.
La principale différence entre ces algorithmes de recherche réside dans leur approche de la traversée de la structure. BFS parcourt le graphe niveau par niveau. Il visite les nœuds niveau par niveau, c'est-à-dire qu'il visite d'abord les nœuds au niveau de profondeur 0 (la racine), puis au niveau de profondeur 1, et ainsi de suite. Au contraire, DFS suit une stratégie différente. Il descend le plus profondément possible dans un chemin avant de revenir en arrière.
Une autre différence considérable est la structure de données qu'ils utilisent. BFS utilise une file d'attente, qui suit la règle du premier entré, premier sorti (FIFO). En revanche, DFS utilise une pile, qui obéit au principe du dernier entré, premier sorti (LIFO).
Expliquons plus clairement ce que sont le BFS et le DFS :
Algorithme | Modèle de parcours | Structure des données |
Recherche en largeur (Breadth First Search) | Niveau par niveau | File d'attente (FIFO) |
Recherche en profondeur d'abord | Aussi profond que possible | Pile (LIFO) |
Un autre aspect remarquable de BFS et DFS est leur complexité en termes de temps et d'espace. Le BFS et le DFS ont tous deux une complexité temporelle linéaire, notée \( O(V + E) \), où \( V \) est le nombre de sommets, et \( E \) est le nombre d'arêtes. Alors que leur complexité temporelle est similaire, leur complexité spatiale diffère en raison de leur nature contrastée. La complexité spatiale de BFS pourrait être plus élevée, en particulier lorsqu'il s'agit d'un graphique qui croît de façon exponentielle, tandis que DFS a une empreinte plus petite car il ne doit stocker que les nœuds le long de la branche active de l'arbre ou du graphique.
Choisir entre la recherche en largeur d'abord et la recherche en profondeur d'abord : Quand et pourquoi
Pour décider d'utiliser BFS ou DFS, tu dois tenir compte de la nature du problème que tu traites et de ce que tu espères obtenir. Tu trouveras ci-dessous une liste de guides qui t'aideront à faire un choix judicieux :
- Si tu sais qu'une solution existe près de la racine de l'arbre, BFS serait une meilleure option puisqu'il minimise le coût du chemin.
- Si l'arbre est extrêmement large (c'est-à-dire qu'il contient de nombreux nœuds), tu devrais utiliser DFS car il prend moins de mémoire.
- Si le graphe est acyclique ou structuré en arbre, DFS peut être plus avantageux.
- Si tu dois trouver le chemin le plus court ou si tu as besoin d'une traversée niveau par niveau, BFS devrait être ton choix.
- DFS peut te servir beaucoup mieux si tu veux obtenir n'importe quelle réponse valide, et pas nécessairement le chemin le plus court.
Il convient de mentionner que lorsqu'il s'agit de problèmes de connectivité ou de trouver des ponts ou des points d'articulation dans un réseau, DFS est généralement plus performant que BFS et est préféré. Mais n'oublie pas que BFS est généralement utilisé pour les graphes non pondérés ou pour trouver le chemin le plus court dans les graphes pondérés qui ont des poids non négatifs.
En fin de compte, le choix entre BFS et DFS n'est pas toujours évident. Souvent, l'algorithme le plus efficace dépend en grande partie des spécificités de la tâche à accomplir.
Exploration de l'arbre de recherche Breadth First
Lorsqu'il s'agit de la mise en œuvre de l'algorithme BFS (Breadth First Search), nous pouvons visualiser le processus et le résultat à l'aide d'un type particulier d'arbre appelé arbre BFS. Cette structure de données représente essentiellement la séquence d'exploration utilisée pendant la traversée de l'arbre BFS.
La structure et la fonction de l'arbre BFS
L'arbre BFS, également connu sous le nom de Breadth First Search Tree, est un arbre enraciné qui est utilisé pour montrer l'ordre d'exploration des nœuds au cours d'un algorithme de traversée BFS. Il s'agit d'une représentation schématique fiable qui indique clairement comment BFS explore les nœuds d'un graphe, en procédant niveau par niveau.
L'arbre BFS est conçu de telle sorte qu'il s'enracine soit dans un nœud spécifique appelé nœud "source" ou "départ", soit dans n'importe quel nœud arbitraire du graphe. L'arbre s'étend ensuite dans le sens de la largeur, en incorporant tous les nœuds accessibles depuis la source. Chaque nœud de l'arbre représente un sommet du graphique, et chaque arête de l'arbre correspond à une arête directe du graphique. L'arbre croît niveau par niveau, chaque niveau comprenant des nœuds qui se trouvent à la même distance (nombre d'arêtes) du nœud racine. Chaque niveau est exploré entièrement avant de passer au niveau suivant.
Un niveau, dans ce cas, désigne l'ensemble des nœuds qui se trouvent à la même distance du nœud racine. Le niveau 0 correspond au nœud de départ ; le niveau 1 correspond à tous les nœuds directement connectés au nœud de départ, et ainsi de suite.
Nœud dans l'arbre BFS | Correspond à |
Nœud racine | Sommet source/début dans le graphique |
Bord dans l'arbre BFS | Bord direct dans le graphique |
Niveau dans l'arbre BFS | Nœuds à égale distance du nœud racine |
Pour un graphe connecté, l'arbre BFS est généralement unique, étant donné que le sommet de départ est spécifié. Cependant, pour un graphique déconnecté ou un graphique où le sommet de départ n'est pas unique, il peut y avoir plusieurs arbres BFS possibles.
La fonction première de cet arbre est de mettre en évidence la façon dont les nœuds sont rencontrés au cours de la traversée de l'arbre BFS. En outre, il permet également d'illustrer comment BFS peut trouver le chemin le plus court entre deux nœuds en termes de nombre de sauts (ou d'arêtes).
Le processus d'élaboration d'un arbre de recherche en largeur (Breadth First)
La construction d'un arbre BFS correspond au fonctionnement systématique de l'algorithme BFS. Si tu te souviens bien, BFS progresse niveau par niveau, en visitant chaque nœud non visité au niveau actuel avant de passer au suivant. Chaque fois qu'un nouveau nœud est découvert au cours de cette traversée, une arête est créée entre le nœud actuel (qui fait déjà partie de l'arbre BFS) et le nœud nouvellement découvert. Cette approche systématique aboutit à la formation d'un arbre BFS.
Le processus d'élaboration d'un arbre Breadth First Search peut être illustré par les étapes suivantes :
Commence par un nœud racine dans le graphe G. Crée une file d'attente, Q, et ajoute la racine à cette file. Marquez la racine comme visitée. Tant que Q n'est pas vide, effectuez les étapes suivantes : retirez de la file d'attente le premier nœud de Q, en le référençant comme 'n'. Pour chaque nœud adjacent à 'n' mais non visité, 'm' : ajoutez 'm' à Q et marquez-le comme visité. Dessinez une arête de 'n' à 'm' dans l'arbre BFS.
En suivant ce processus, tu obtiendras un arbre BFS qui reflète les étapes suivies par l'algorithme BFS pendant la traversée du graphe original. N'oublie pas que l'arbre BFS ne représente pas nécessairement la structure du graphe original dans son intégralité, mais qu'il représente le chemin le plus court (le plus petit nombre d'arêtes) entre le nœud racine et n'importe quel autre nœud de l'arbre.
En résumé, la création d'un arbre Breadth First Search implique l'utilisation d'un algorithme systématique pour parcourir un graphe niveau par niveau. En élaborant un tel arbre, nous pouvons visualiser le chemin emprunté par l'algorithme BFS et obtenir le chemin le plus court entre le nœud racine et n'importe quel autre nœud de l'arbre.
La complexité temporelle de la recherche par largeur d'abord (Breadth First Search)
Dans le domaine de l'informatique, la compréhension de la complexité temporelle est fondamentalement cruciale. Elle te permet d'évaluer l'efficacité d'un algorithme en fonction du temps qu'il met à s'exécuter compte tenu de la taille de ses données d'entrée. Lors de la mise en œuvre de l'algorithme Breadth First Search (BFS), tu dois comprendre sa complexité temporelle pour juger de ses performances et de son efficacité, en particulier pour les grands ensembles de données.
Comprendre la complexité temporelle de l'algorithme Breadth First Search
La complexité temporelle fait essentiellement référence à la complexité de calcul qui décrit le taux de croissance du temps pris par un algorithme par rapport à la taille de ses données d'entrée. Elle fournit une limite supérieure au temps nécessaire à l'exécution d'un programme. En termes de BFS, la complexité temporelle est décisive pour évaluer les performances et l'évolutivité de l'algorithme.
L'algorithme BFS commence par un nœud racine choisi et explore les nœuds voisins au niveau de profondeur actuel avant de passer aux nœuds du niveau de profondeur suivant. Comme BFS explore chaque arête du graphe une fois, la complexité temporelle peut être associée au nombre d'arêtes et de sommets traités par l'algorithme.
Dans BFS, chaque sommet est traité exactement une fois et chaque arête est également traitée une fois lorsque nous arrivons à l'une de ses extrémités. Par conséquent, le temps total pour traiter tous les sommets et toutes les arêtes est proportionnel au nombre de sommets plus le nombre d'arêtes. Cela peut s'exprimer comme suit :
\[ \text{{Complexité temporelle de BFS}} = O (V + E) \]où :
- \(O\) représente la notation Big O - utilisée pour décrire la limite supérieure de la complexité temporelle.
- \N(V\N) représente le nombre de sommets dans le graphe.
- \(E\) représente le nombre d'arêtes dans le graphique.
Note que la complexité temporelle s'applique à la fois aux scénarios les plus défavorables et aux scénarios moyens, car chaque sommet et chaque arête seront toujours explorés une fois dans un graphe connecté. Il convient également de mentionner que la complexité temporelle ne tient pas compte du temps nécessaire à l'initialisation ou à la déclaration de la structure de données auxiliaire (la file d'attente), ce qui peut augmenter le temps requis en fonction de la mise en œuvre.
Améliorer la complexité temporelle des algorithmes de recherche en largeur (Breadth First Search)
La complexité temporelle d'un algorithme BFS peut être considérée comme efficace dans la plupart des scénarios pratiques, car elle augmente linéairement avec la taille du graphe d'entrée (nombre de sommets et d'arêtes). Cependant, certains ajustements et certaines approches peuvent permettre d'optimiser davantage sa durée d'exécution, en particulier dans des cas d'utilisation ou des conditions de données spécifiques.
Un facteur crucial qui influence la complexité temporelle de BFS est la structure de données auxiliaire utilisée. BFS utilise généralement une file d'attente implémentée sous forme de liste liée ou de tableau dynamique, ce qui contribue à une complexité temporelle constante pour les opérations de mise en file d'attente et de mise hors file d'attente. Cependant, dans certains scénarios, l'utilisation d'une file d'attente à double extrémité peut améliorer l'efficacité temporelle de BFS, en particulier si l'algorithme nécessite une recherche en sens inverse ou une recherche bidirectionnelle.
Un autre aspect à prendre en compte est la représentation du graphe. La complexité temporelle de BFS suppose que le graphe est représenté à l'aide d'une liste d'adjacence. Si une matrice d'adjacence est utilisée, la complexité temporelle augmente, ce qui ralentit considérablement l'algorithme BFS. Par conséquent, le choix d'une représentation par liste d'adjacence plutôt que par matrice d'adjacence peut entraîner d'importants gains de temps, en particulier pour les graphes peu denses.
L'écriture d'un code efficace et bien structuré peut également contribuer à réduire le temps d'exécution. Il s'agit notamment d'éviter les calculs inutiles, d'utiliser des opérations appropriées sur les structures de données et d'assurer une bonne gestion de la mémoire. Par exemple, le fait de marquer les nœuds visités immédiatement lorsqu'ils sont ajoutés à la file d'attente permet d'éviter de revisiter les nœuds, ce qui améliore l'efficacité.
En outre, BFS peut être parallélisé pour tirer parti de la concurrence et des systèmes multicœurs. Le concept de frontière dans BFS, qui fait référence à tous les nœuds explorés au niveau de profondeur actuel, peut être exploité pour créer un BFS parallèle où plusieurs nœuds de la même frontière peuvent être traités simultanément.
Bien qu'il existe des moyens d'optimiser un algorithme BFS, il est essentiel de le faire avec prudence. Chaque optimisation doit être justifiée par la nature du problème et du graphe d'entrée, et il faut veiller à ce que ces optimisations n'introduisent pas par inadvertance de la complexité ou des erreurs.
Mise en œuvre pratique de la recherche en largeur (Breadth First Search)
La mise en pratique de la méthode Breadth First Search (BFS) implique une série d'étapes que tu dois suivre attentivement pour résoudre efficacement un problème donné. Il ne s'agit pas seulement de comprendre les concepts de base - il est également essentiel de les appliquer de manière stratégique et logique. Ci-dessous, nous allons nous plonger dans les étapes que tu dois prendre en compte pour que la méthode BFS fonctionne efficacement pour toi, suivies de quelques études de cas réels mettant en évidence sa mise en œuvre dans des problèmes de codage.
Étapes de la mise en œuvre de la méthode Breadth First Search dans la résolution de problèmes
La mise en œuvre pratique de la BFS implique une approche logique et bien planifiée. Cette approche peut être décomposée systématiquement, te guidant pour passer de la théorie à la mise en œuvre sans effort.
- Identifie le problème qui nécessite une mise en œuvre BFS.
- Détermine la représentation du graphe. Pour BFS, une liste d'adjacence est généralement un meilleur choix car elle optimise la complexité temporelle.
- Définis la racine ou le nœud de départ du graphe.
- Crée une file d'attente et une liste de visites (ou un hachage). Mets la racine en file d'attente et marque-la comme visitée.
- Lance une boucle qui se poursuit jusqu'à ce que la file d'attente soit vide. Au cours de chaque itération :
- Retire un nœud de la file d'attente.
- Traite le nœud (une opération qui dépend du problème spécifique à résoudre).
- Pour chaque sommet adjacent au nœud actuel qui n'a pas encore été visité, marque-le comme visité et mets-le en file d'attente.
Prends note que l'algorithme BFS visite chaque sommet une fois et parcourt chaque arête une fois, ce qui conduit à une complexité temporelle globale de \( O(V+E) \) où \( V \) est le nombre de sommets et \( E \) est le nombre d'arêtes. Cela confirme sa nature efficace et évolutive.
Études de cas : La recherche en largeur d'abord dans les problèmes de codage du monde réel
La BFS trouve des applications dans de nombreux scénarios du monde réel, en particulier lorsqu'il existe des problèmes d'optimisation dans le routage des réseaux, l'IA, l'exploration du Web, la recherche de chemins dans les cartes géographiques et les réseaux sociaux. Nous examinerons ici quelques cas plus spécifiques où la mise en œuvre de la BFS dans la résolution de problèmes s'est avérée indispensable.
Étude de cas 1 : Suggestion d'amis sur les réseaux sociauxDans les services de réseaux sociaux tels que Facebook ou LinkedIn, la fonction "Personnes que vous connaissez peut-être" ou "Suggestion d'amis" est très répandue. En utilisant BFS, nous pouvons facilement mettre en œuvre cette fonction.Au départ, on peut exécuter un BFS à partir du nœud d'un utilisateur sur deux niveaux de profondeur (en considérant que les personnes ayant jusqu'à deux degrés de séparation ont plus de chances de se connaître). Les nœuds découverts au deuxième niveau (sans tenir compte de ceux du premier niveau car il s'agit des amis de l'utilisateur et de ceux qu'il ne connaît pas) servent de liste de suggestions d'amis.
Étude de cas 2 : Google Maps Shortest PathBFS est un composant essentiel de l'algorithme du chemin le plus court utilisé dans Google Maps. Lorsqu'un utilisateur souhaite trouver l'itinéraire le plus efficace entre un lieu A et un lieu B, BFS vient à la rescousse.Dans ce scénario, chaque lieu sur la carte est un nœud, et les routes qui relient ces lieux sont des arêtes. L'objectif est de trouver le chemin le plus court - celui qui a le moins de poids ou de coût (le coût peut représenter la distance, le temps ou l'état de la route). Si la distance ou le coût est uniforme pour toutes les arêtes (ce qui implique un graphe non pondéré), un simple BFS de la source à la destination trouverait le chemin le plus court. Mais si le graphe a des poids (chaque arête a un coût différent), l'algorithme BFS peut être transformé en algorithme de Dijkstra, qui trouve le chemin le plus court dans un graphe avec des poids non négatifs.
Ces études de cas soulignent l'aspect pratique et la puissance de BFS. Cependant, étant donné la complexité linéaire du temps de BFS et le style de traversée basé sur l'étendue, ce n'est pas toujours l'approche optimale. C'est pourquoi il est tout aussi important de savoir quand utiliser BFS que de comprendre comment l'utiliser.
Breadth First Search - Principaux points à retenir
- Breadth First Search (BFS) est un algorithme de traversée de graphe qui explore les nœuds niveau par niveau, à partir d'un nœud racine. Il est largement utilisé dans les algorithmes de routage des réseaux, la recherche de chemins dans les cartes, l'exploration du Web et les sites de réseaux sociaux.
- BFS et Depth First Search (DFS) sont tous deux des algorithmes de traversée de graphe, mais avec des stratégies différentes. BFS explore les nœuds niveau par niveau à l'aide d'une structure de données Queue, tandis que DFS explore aussi profondément que possible un chemin avant de revenir en arrière à l'aide d'une structure de données Stack.
- La complexité temporelle de BFS est de \(O(V + E)\), où \(V\) est le nombre de sommets et \(E\) est le nombre d'arêtes. Cela s'applique à la fois aux scénarios les plus défavorables et aux scénarios moyens, car chaque sommet et chaque arête seront toujours explorés une fois dans un graphe connecté.
- Un arbre de recherche Breadth First est un arbre enraciné qui présente l'ordre d'exploration des nœuds au cours d'un algorithme de traversée BFS. C'est une représentation fiable de la façon dont BFS parcourt les nœuds d'un graphe niveau par niveau.
- Le choix entre BFS et DFS dépend de la nature du problème et des résultats souhaités. BFS est généralement choisi lorsqu'une solution existe près de la racine ou qu'une traversée niveau par niveau est nécessaire, tandis que DFS est préféré lorsque l'arbre est très large ou ne nécessite pas nécessairement le chemin le plus court.
Apprends avec 15 fiches de Recherche en largeur dans l'application gratuite StudySmarter
Tu as déjà un compte ? Connecte-toi
Questions fréquemment posées en Recherche en largeur
À propos de StudySmarter
StudySmarter est une entreprise de technologie éducative mondialement reconnue, offrant une plateforme d'apprentissage holistique conçue pour les étudiants de tous âges et de tous niveaux éducatifs. Notre plateforme fournit un soutien à l'apprentissage pour une large gamme de sujets, y compris les STEM, les sciences sociales et les langues, et aide également les étudiants à réussir divers tests et examens dans le monde entier, tels que le GCSE, le A Level, le SAT, l'ACT, l'Abitur, et plus encore. Nous proposons une bibliothèque étendue de matériels d'apprentissage, y compris des flashcards interactives, des solutions de manuels scolaires complètes et des explications détaillées. La technologie de pointe et les outils que nous fournissons aident les étudiants à créer leurs propres matériels d'apprentissage. Le contenu de StudySmarter est non seulement vérifié par des experts, mais également régulièrement mis à jour pour garantir l'exactitude et la pertinence.
En savoir plus