J'ai regardé plusieurs autres réponses de StackOverflow et elles sont toutes différentes de ce que mon conférencier a écrit dans ses diapositives.
Depth First Search a une complexité temporelle de O (b ^ m), où b est le facteur de branchement maximal de l'arbre de recherche et m est la profondeur maximale de l'espace d'état. Terrible si m est beaucoup plus grand que d, mais si l'arbre de recherche est "touffu", il peut être beaucoup plus rapide que Breadth First Search.
Il continue en disant ..
La complexité de l'espace est O (bm), c'est-à-dire un espace linéaire en longueur de séquence d'action! Il suffit de stocker un seul chemin de la racine au nœud feuille, ainsi que les nœuds frères non développés restants pour chaque nœud sur le chemin.
ne autre réponse sur StackOverflow indique que c'est O (n + m).
Complexité temporelle: Si vous pouvez accéder à chaque nœud en O(1) temps, alors avec un facteur de branchement de b et une profondeur maximale de m, le nombre total de nœuds dans cet arbre serait le pire des cas = 1 + b + b2 +… + Bm-1 = bm - 1, résultant en un temps total pour visiter chaque nœud proportionnel à bm. D'où la complexité = O (bm).
D'un autre côté, si au lieu d'utiliser le facteur de branchement et la profondeur maximale vous avez le nombre de nœuds n , alors vous pouvez directement dire que la complexité être proportionnelle à n ou égale à O (n) .
Les autres réponses que vous avez liées dans votre question utilisent de la même manière différentes terminologies. L'idée est la même partout. Certaines solutions ont également ajouté le nombre d'Edge pour rendre la réponse plus précise, mais en général, le nombre de nœuds est suffisant pour décrire la complexité.
Complexité spatiale: La longueur du chemin le plus long = m. Pour chaque nœud, vous devez stocker ses frères et sœurs de sorte que lorsque vous avez visité tous les enfants et que vous revenez à un nœud parent, vous pouvez savoir quel frère explorer ensuite. Pour m nœuds sur le chemin, vous devrez stocker b nœuds supplémentaires pour chacun des m nœuds. C’est ainsi que vous obtenez une complexité d’espace O(bm).
La complexité est O(n + m)
où n
est le nombre de nœuds dans votre arborescence et m
est le nombre d'arêtes.
La raison pour laquelle votre professeur représente la complexité sous la forme O(b ^ m)
, est probablement parce qu'il veut souligner la différence entre la recherche en profondeur et la recherche en largeur.
Lorsque vous utilisez BFS, si votre arbre a une très grande dispersion par rapport à sa profondeur, et que vous vous attendez à ce que des résultats soient trouvés au niveau des feuilles, alors clairement DFS aurait beaucoup plus de sens ici car il atteint les feuilles plus rapidement que BFS, même bien qu'ils atteignent tous les deux le dernier nœud dans le même temps (travail).
Lorsqu'un arbre est très profond et que les non-feuilles peuvent fournir des informations sur les nœuds plus profonds, BFS peut détecter des moyens d'élaguer l'arbre de recherche afin de réduire la quantité de nœuds nécessaires pour trouver votre objectif. De toute évidence, plus vous découvrez un arbre élevé, plus vous pouvez élaguer un sous-arbre, plus vous pouvez sauter de nœuds. C'est plus difficile lorsque vous utilisez DFS, car vous donnez la priorité à atteindre une feuille sur l'exploration des nœuds les plus proches de la racine.
Je suppose que cette complexité temps/espace DFS est enseignée sur une classe AI mais pas sur la classe Algorithm.
L'arbre de recherche DFS a ici une signification légèrement différente:
Un nœud est une structure de données de comptabilité utilisée pour représenter l'arbre de recherche. Un état correspond à une configuration du monde. ... De plus, deux nœuds différents peuvent contenir le même état mondial si cet état est généré via deux chemins de recherche différents.
Extrait du livre "Intelligence artificielle - Une approche moderne"
Ainsi, la complexité temps/espace se concentre ici sur la visite des nœuds et la vérification de l'état de l'objectif. @displayName donne déjà une explication très claire.
Alors que O (m + n) est dans la classe d'algorithme, l'accent est mis sur l'algorithme lui-même, lorsque nous stockons le graphique en tant que liste d'adjacence et comment nous découvrons les nœuds.