Lors de la recherche de graphiques, il existe deux algorithmes simples: width-first et depth-first (généralement effectué en ajoutant tous les nœuds de graphes adjacents à une file d'attente (width-first) ou à une pile (depth-first)).
Maintenant, y a-t-il des avantages de l'un sur l'autre?
Ceux auxquels je pourrais penser:
- Si vous vous attendez à ce que vos données se trouvent assez loin dans le graphique, deep-first pourrait le trouver plus tôt, car vous allez très rapidement dans les parties les plus profondes du graphique.
- Inversement, si vous vous attendez à ce que vos données se situent assez loin dans le graphique, width-first peut donner le résultat plus tôt.
Y a-t-il quelque chose qui m'a échappé ou est-ce que cela dépend principalement des préférences personnelles?
Un point important dans notre monde multicœur: BFS est beaucoup plus facile à paralléliser. Ceci est intuitivement raisonnable (envoyer des fils à chaque enfant) et il peut être prouvé qu'il en est ainsi. Donc, si vous avez un scénario où vous pouvez utiliser le parallélisme, alors BFS est la voie à suivre.
la source
(J'ai fait de ce site un wiki de communauté. N'hésitez pas à le modifier.)
Si
ensuite
Raisons de choisir
IDDFS = recherche approfondie approfondie d'abord itérative
la source
h
la "hauteur de l'arbre". Est-ce que cela se traduit directement par "la hauteur du graphique"?Un scénario (autre que la recherche du chemin le plus court, qui a déjà été mentionné) dans lequel vous devrez peut-être choisir l'un sur l'autre pour obtenir un programme correct serait constitué de graphes infinis:
Si nous considérons par exemple un arbre où chaque nœud a un nombre fini d'enfants, mais que sa hauteur est infinie, DFS pourrait ne jamais trouver le nœud que vous recherchez. Il continuera simplement à visiter le premier enfant de chaque nœud. voit, donc si celui que vous recherchez n'est pas le premier enfant de son parent, il n'y parviendra jamais. BFS est cependant assuré de le trouver en temps fini.
De même, si nous considérons un arbre où chaque noeud a un nombre infini d'enfants, mais que l'arbre a une hauteur finie, BFS pourrait ne pas se terminer. Il ne visitera que les enfants du nœud racine et si le nœud que vous recherchez est l'enfant d'un autre nœud, il ne sera pas atteint. Dans ce cas, DFS est assuré de le trouver en temps fini.
la source
La largeur d'abord et la profondeur d'abord ont certainement le même comportement dans le cas le plus défavorable (le nœud souhaité est le dernier trouvé). Je suppose que cela est également vrai pour tous les cas si vous n’avez pas d’informations sur vos graphiques.
Un bon bonus de la recherche en largeur d'abord est qu'elle trouve les chemins les plus courts (dans le sens du moins d'arêtes) qui peuvent présenter un intérêt ou non.
Si votre rang de nœud moyen (nombre de voisins) est élevé par rapport au nombre de nœuds (c'est-à-dire que le graphique est dense), width-first aura d'énormes files d'attente, tandis que depth-first aura de petites piles. Dans les graphiques clairsemés, la situation est inversée. Par conséquent, si la mémoire est un facteur limitant, il se peut que la forme du graphique à traiter informe votre choix de stratégie de recherche.
la source
Tout ce qui précède est correct, mais il convient de noter que BFS et DFS créent leurs propres arborescences, en fonction de l'ordre utilisé pour les parcourir. Chacun de ces arbres a sa propre propriété, ce qui peut être utile en cas de problème.
Par exemple, toutes les arêtes du graphique d'origine qui ne figurent pas dans l'arborescence BFS sont des arêtes croisées; des arêtes situées entre deux branches de l’arbre BFS. Toutes les arêtes du graphique d'origine qui ne figurent pas dans l'arborescence DFS sont des arrières; des arêtes reliant deux sommets d'une branche de l'arborescence DFS. De telles propriétés peuvent être utiles pour des problèmes tels que des colorants spéciaux, etc.
la source
DFS et BFS arborent tous deux leurs propres propriétés uniques qui peuvent vous donner des informations plus utiles sur le graphique. Par exemple, avec un seul DFS, vous pouvez effectuer les opérations suivantes:
Avec BFS, vous pouvez trouver les chemins les plus courts entre le nœud source et tout autre nœud du graphique.
Le chapitre sur les algorithmes graphiques dans CLRS résume très bien ces propriétés de DFS et de BFS.
la source
Je pense qu'il serait intéressant d'écrire les deux de manière à ce que seul un changement de lignes de code donne un algorithme ou un autre, afin que vous puissiez voir que votre dillema n'est pas si puissant qu'il semble l'être au premier abord. .
Personnellement, j’aime bien l’interprétation de BFS comme une inondation de paysage: les zones de basse altitude seront inondées en premier, puis les zones de haute altitude suivront. Si vous imaginez les altitudes du paysage comme des isolignes, comme nous le voyons dans les livres de géographie, il est facile de voir que BFS remplit toutes les zones sous la même isoline en même temps, comme ce serait le cas avec la physique. Ainsi, interpréter les altitudes comme distance ou coût réduit donne une idée assez intuitive de l’algorithme.
En gardant cela à l'esprit, vous pouvez facilement adapter l'idée de la recherche en largeur d'abord pour trouver facilement l'arbre de recouvrement minimal, le chemin le plus court et de nombreux autres algorithmes de minimisation.
Je n'ai pas encore vu d'interprétation intuitive de DFS (seulement celle standard sur le labyrinthe, mais elle n'est pas aussi puissante que celle de BFS et les inondations), donc pour moi, il semble que BFS semble mieux corréler avec les phénomènes physiques décrits ci-dessus, alors que DFS est plus en corrélation avec les choix de dillema sur des systèmes rationnels (c’est-à-dire que ce sont les personnes ou les ordinateurs qui décident de ce qu’il faut faire pour une partie d’échecs ou pour sortir d’un labyrinthe).
Donc, pour moi, la différence entre les mensonges sur lesquels le phénomène naturel correspond le mieux à son modèle de propagation (transversal) dans la vie réelle.
la source