Addendum ci-dessous, clarifiant les termes k(k−1) :
Donc, si vous examinez les termes dans l'expression, vous pouvez imaginer (par analogie) que le terme est une énumération de toutes les chaînes binaires contenant 1 qui ont un 1 en première position. En d'autres termes, nous laissons chaque position dans la chaîne binaire représenter le choix de savoir si l'une donnée des villes du problème se trouve dans le sous-ensemble exact que nous considérons à l'époque. Ainsi, pour 5 villes, 10101 correspond au sous-ensemble {1,3,5}. kn(n−1k)kn
Ainsi, pour calculer à travers tous les sous-ensembles de {1, ..., }, nous comptons simplement à travers chaque sous-ensemble binaire (c'est-à-dire compter à travers des chaînes binaires) de taille = 2 (c'est-à-dire des chaînes binaires de taille qui contiennent deux 1), puis taille = 3, puis taille = 4, ... puis taille = n. (Notez que le sous-ensemble size = 1 ne doit contenir que la première ville, et donc il n'est pas pertinent de calculer sa distance partielle, car la distance de 1 -> toutes les autres villes du sous-ensemble -> 1 est exactement 0.)nnn
Pour chaque sous-ensemble avec villes, nous devons considérer jusqu'à chemins partiels optimaux pour les candidats. Plus précisément, le chemin optimal optimal pourrait traverser le sous-ensemble donné et aboutir à n'importe laquelle des villes, à l'exclusion de la première ville. Ensuite, pour chacun de ces sous-chemins candidats, nous calculons le tour optimal jusqu'à ce point comme le minimum de l'un des sous-chemins précédents, size = plus la distance de la ville terminale pour ce sous-chemin vers le ville terminale pour le sous-chemin candidat actuel. Cela donne telles comparaisons que nous devons faire. L'écart entre mon terme et lek - 1 k - 1 k - 1 ( k - 1 ) ( k - 2 ) ( k - 1 ) ( k - 2 )kk−1k−1k−1(k−1)(k−2)(k−1)(k−2)kk(k−1)terme dans l'analyse liée est une différence de notation (je résumerais sur une plage différente, étant donné ma définition de qu'ils ne l'ont fait). À tout le moins, cependant, il devrait illustrer la complexité d'ordre quadratique de ce terme.k
Comme c'est intéressant - je viens de terminer de coder cet algorithme exact en C ++ il y a quelques minutes. (Alors pardonnez la tangente de la théorie pure à une petite discussion pratique. :))
Cela coûte temps et espace - au moins sous mon implémentation. En pratique, cependant, lorsque vos besoins d'espace augmentent aussi rapidement, ils deviennent beaucoup plus douloureux que les besoins en temps. Par exemple, sur mon PC (avec 4 Go de RAM), je peux résoudre des instances avec jusqu'à 24 villes - plus que cela, et je manque de mémoire.O ( 2 n n )O(2nn2)O(2nn)
Bien sûr, je pourrais juste être un mauvais programmeur, et vous pourriez peut-être faire mieux que moi dans la pratique. :)
Edit: Un peu plus de détails sur un détail de votre question: le terme vient du fait que vous devez, dans le pire des cas, calculer la distance optimale partielle à partir des sous-ensembles précédents (il y a au plus d'entre eux; notez que est additionné de dans l'analyse que vous avez liée) à l'analyse en cours. Cela nécessite, là encore dans le pire des cas, des comparaisons avec des sous-ensembles de taille pour un total de .n k n O ( k ) k - 1 O ( k 2 )k(k−1)nknO(k)k−1O(k2)
De plus, si mon explication n'était pas assez claire, voici quelques belles notes de cours de Vazirani ( PDF ). Faites défiler jusqu'à P. 188 pour une discussion sur le TSP, y compris une analyse de Held-Karp.