|  
    
La complexité temporelle d'un algorithme de backtracking est généralement exponentielle , même si cela peut varier en fonction du problème et de ses contraintes. Il n'y a pas de complexité temporelle unique pour le retour en arrière, car cela dépend fortement de :
  
 * Le nombre de choix à chaque étape : Si vous avez des choix *b* à chaque étape et que la profondeur de l'arbre de recherche est *d*, alors la complexité peut être O(b
d
 ).  
  
 * Contraintes spécifiques au problème et techniques d'élagage : Le retour en arrière implique souvent d’élaguer l’espace de recherche. Si vous parvenez à élaguer efficacement les branches qui ne mèneront pas à une solution, vous pouvez réduire considérablement l'espace de recherche et améliorer les performances. L’efficacité de la stratégie d’élagage a un impact important sur la complexité temporelle finale.  
  
 * La nature du problème : Certains problèmes se prêtent intrinsèquement plus à un retour en arrière que d’autres.  
  
 Voici un aperçu des raisons pour lesquelles c'est généralement exponentiel et quelques exemples :  
  
 * Nature exponentielle : Le backtracking explore toutes les combinaisons ou permutations possibles jusqu’à ce qu’une solution soit trouvée. Dans le pire des cas, il pourrait devoir explorer une grande partie de l’espace de recherche, ce qui entraînerait une croissance exponentielle du nombre de nœuds visités.  
  
 * Exemples et leurs complexités :  
  
 * Problème N-Queens : Trouver tous les placements possibles de N reines sur un échiquier NxN de telle sorte qu'aucune reine ne se menace. La complexité temporelle est d'environ O(N !), dans le pire des cas. Les techniques de taille peuvent améliorer considérablement les performances.  
  
 * Problème du vendeur itinérant (TSP) : Trouver l'itinéraire le plus court possible qui visite chaque ville exactement une fois et revient à la ville de départ. Une approche naïve de retour en arrière aurait une complexité temporelle de O(n !), où « n » est le nombre de villes. La branche et la liaison sont utilisées comme élagage pour une exécution plus rapide.  
  
 * Problème de somme de sous-ensemble : Déterminer s'il existe un sous-ensemble d'un ensemble donné de nombres dont la somme est égale à une valeur cible. La complexité temporelle peut être O(2
n
 ), où « n » est le nombre d'éléments dans l'ensemble, car vous devrez peut-être prendre en compte tous les sous-ensembles possibles.  
  
 * Résolveur de Sudoku : Dans le pire des cas, un solveur de Sudoku en retour en arrière pourrait essayer un grand nombre de possibilités pour chaque cellule vide. Bien que théoriquement exponentielle, de bonnes heuristiques et contraintes permettent de résoudre très rapidement le Sudoku du monde réel.  
  
 * Coloration des graphiques : Attribuer des couleurs aux sommets d'un graphique de telle sorte qu'il n'y ait pas deux sommets adjacents de la même couleur. Le pire des cas est exponentiel mais l'efficacité dépend de la façon dont vous commandez les nœuds.  
  
 * Facteurs affectant la complexité temporelle :  
  
 * Profondeur de la récursion : Plus l'arbre de recherche est profond, plus les calculs sont nécessaires.  
 * Facteur de branchement : Le nombre de choix à chaque nœud de l'arborescence de recherche. Un facteur de branchement plus important conduit à une croissance exponentielle plus rapide.  
 * Taille : Un élagage efficace réduit l’espace de recherche, améliorant ainsi les performances. La taille est le facteur le plus important à considérer.  
  
 En résumé :  
  
 Bien qu'il soit difficile de donner une complexité temporelle précise pour le retour en arrière en général, on peut affirmer sans se tromper qu'elle est généralement exponentielle (O(b
d
 ) ou O(2
n
 ) ou O(n!)) dans le pire des cas. La complexité temporelle réelle est fortement influencée par la structure du problème, l'efficacité des stratégies d'élagage utilisées et la taille de l'entrée. Il est important de concevoir des algorithmes de backtracking avec un élagage efficace pour éviter d’explorer des chemins inutiles. Dans certains cas, l’élagage peut être si efficace qu’il rend l’algorithme beaucoup plus rapide en pratique que ne le suggère sa complexité exponentielle dans le pire des cas. Cependant, pour de nombreux problèmes, même avec l’élagage, le retour en arrière reste intrinsèquement inefficace pour les grandes quantités d’entrées.
 
 |