Adendo abaixo, esclarecendo os termos :k(k−1)
Portanto, se você examinar os termos da expressão, poderá visualizar (como analogia) o termo é uma enumeração de todas as cadeias binárias que contêm 1 que possuem 1 na primeira posição. Em outras palavras, deixamos que cada posição na cadeia binária represente a escolha de se uma determinada cidades no problema está no subconjunto exato que estamos considerando no momento. Portanto, para 5 cidades, 10101 corresponde ao subconjunto {1,3,5}.(n−1k)kn
Assim, para calcular todos os subconjuntos de {1, ..., }, simplesmente contamos através de cada subconjunto binário (ou seja, contamos com cadeias binárias) de tamanho = 2 (ou seja, cadeias binárias de tamanho que contêm dois 1s), então size = 3, size = 4, ... size = n. (Observe que o subconjunto size = 1 deve conter apenas a primeira cidade e, portanto, é irrelevante calcular sua distância parcial, pois a distância de 1 -> todas as outras cidades do subconjunto -> 1 é exatamente 0.)nn
Em cada subconjunto com cidades, temos que considerar até caminhos parciais ótimos para candidatos. Especificamente, o caminho ideal ideal total poderia atravessar o subconjunto especificado e terminar em qualquer uma das cidades , excluindo a primeira cidade. Em seguida, para cada subcaminho candidato, calculamos o passeio ideal até esse ponto como o mínimo de qualquer dos subcaminhos size = anteriores, mais a distância da cidade terminal desse subcaminho até o cidade terminal para o atual subcaminho candidato. Isso fornece as comparações que devemos fazer. A discrepância entre o meu termo e okk−1k−1k−1(k−1)(k−2)(k−1)(k−2)k(k−1)O termo na análise vinculada é uma diferença notacional (eu somaria em um intervalo diferente, dada minha definição de que eles). No mínimo, porém, deve ilustrar a complexidade de ordem quadrática desse termo.k
Que interessante - eu acabei de codificar esse algoritmo exato em C ++ há alguns minutos atrás. (Então, perdoe a tangente da teoria pura em uma pequena discussão prática. :))
Custa tempo e espaço - pelo menos na minha implementação. Na prática, porém, quando seus requisitos de espaço crescem tão rápido, eles se tornam muito mais dolorosos do que os requisitos de tempo. Por exemplo, no meu PC (com 4 GB de RAM), posso resolver instâncias com até 24 cidades - mais do que isso, e fico sem memória.O(2nn2)O(2nn)
É claro que eu poderia ser um péssimo programador e você poderá fazer melhor do que eu na prática. :)
Edit: Um pouco mais de detalhes sobre um detalhe da sua pergunta: O termo vem do fato de que, no pior caso, você deve calcular a distância parcial ideal dos subconjuntos anteriores (há no máximo deles; observe que é somado sobre na análise que você vinculou) à análise atual. Isso requer, novamente no pior caso, comparações com subconjuntos de tamanho para um total de .k(k−1)nknO(k)k−1O(k2)
Além disso, se minha explicação não foi clara o suficiente, aqui estão algumas notas de aula agradáveis de Vazirani ( PDF ). Role até a página 188 para uma discussão sobre TSP, incluindo uma análise de Held-Karp.