Você recebe, como uma lista ou vetor ou o que for, um monte de três tuplas ou o que for, onde as duas primeiras coisas são cadeias de caracteres e a terceira é um número. As strings são cidades e o número é a distância entre elas. A ordem das cidades na tupla é arbitrária (ou seja, não importa o que vem primeiro e o que vem depois), pois é a mesma distância em cada sentido. Além disso, existe exatamente uma tupla para cada par de citações conectadas. Nem todas as cidades podem estar conectadas. Além disso, a distância é sempre positiva (não0
) Você não precisa verificar essas condições, pode assumir que a entrada será bem formada. Seu trabalho é retornar as cidades em uma sequência cíclica, de modo que, se você começar em qualquer cidade e retornar a mesma para a mesma cidade, o total das distâncias entre as cidades será mínimo (exatamente e em todos os aspectos). casos). Você pode assumir que existe uma solução. Por exemplo, digamos que você receba
[("New York", "Detroit", 2.2), ("New York", "Dillsburg", 3.7), ("Hong Kong", "Dillsburg", 4), ("Hong Kong", "Detroit", 4), ("Dillsburg", "Detroit", 9000.1), ("New York", "Hong Kong", 9000.01)]
Você pode produzir qualquer um dos seguintes (mas você só precisa produzir um):
["Detroit","Hong Kong","Dillsburg","New York"]
["Hong Kong","Dillsburg","New York","Detroit"]
["Dillsburg","New York","Detroit","Hong Kong"]
["New York","Detroit","Hong Kong","Dillsburg"]
["Dillsburg","Hong Kong","Detroit","New York"]
["New York","Dillsburg","Hong Kong","Detroit"]
["Detroit","New York","Dillsburg","Hong Kong"]
["Hong Kong","Detroit","New York","Dillsburg"]
porque é a viagem mais curta: 13,9
mas não
["Dillburg","Detroit","New York","Hong Kong"]
porque não é o mais curto.
Veja en.wikipedia.org/wiki/Travelling_salesman_problem
Pontuação
É aqui que fica interessante. Você pega o número de caracteres que você possui e os conecta à fórmula de pior notação O na pior das hipóteses. Por exemplo, digamos que você escreva um programa de força bruta com 42 caracteres. Como todos sabemos, o pior caso é n!
onde n
está o número de cidades. 42! = 1405006117752879898543142606244511569936384000000000, então essa é sua pontuação. A pontuação mais baixa vence .
Nota: Também aliviei isso depois, mas não tinha certeza de como resolvê-lo e esperava que ninguém notasse. As pessoas fizeram, então eu vou com a sugestão de issacg:
as únicas opções são O (n!) e O (b ^ n n ^ a ln (n) ^ k), e todos os limites devem ser o mais estreitos possível, considerando essa notação
fonte
O(n!)
mas não éO(sqrt(n)*n^n/e^n)
nemO(n!/100000000000000000000)
?O(n!)
eO(b^n*n^a*ln(n)^k)
, e todos os limites devem ser o mais estreitos possível, considerando essa notação. OP deve esclarecer, no entanto.O(n^2*2^n)
é muito menor do queO(n!)
para n grandes.Respostas:
Haskell, 259
Eu pensei que seria capaz de diminuí-lo. Talvez eu vá.
isso tem complexidade de tempo de O (n ^ 2 * 2 ^ n) *, então a pontuação é de cerca de 6,2e82
* Na verdade, não tenho certeza, mas se houver alguma "adição" à complexidade, não será mais que polinômio, portanto isso não deve alterar muito a pontuação.
fonte
Python 2,
237231228225 caracteresComo esse é um algoritmo ingênuo, sua pontuação é provavelmente de cerca de 225! 1.26e433.
fonte
from itertools import*
seria mais curto.("a", "a", 0)
, seria necessário haver uma lógica extra em algum lugar para pular arestas de comprimento zero. (E se você estiver na Web, sempre poderá testar com algo como codepad.org. )sum
cada item de uma permutação. Não seriaO(n!*n)
?Julia, 213 caracteres
Provavelmente vai assim
n!n
, então ~ 2e407.Para facilitar a leitura e demonstrar o uso, deixei algumas linhas e guias não pontuadas, bem como exemplos de entrada e chamada para a função. Também usei um algoritmo que requer
n!
tempo, mas nãon!
memória, é um pouco mais viável de executar.fonte
sum
em cada item de uma permutação. Isso não seria O (n! * N)?Python 3-491
Não contei o comprimento da variável do gráfico de entrada
g
. Esta solução usa programação dinâmica e possui uma complexidade de n ^ 2 * 2 ^ n, para uma pontuação total de ~ 6.39e147. Eu ainda sou muito novo no golfe, por favor, grite se vir um grande desperdício de código em algum lugar!fonte
Mathematica, 66 bytes
Não tenho idéia da complexidade, então a pontuação está entre
10^23
e10^93
.fonte
Rubi,
198180 bytesA primeira linha que lê a entrada não é pontuada, pois parece ser o que todo mundo está fazendo. Além disso, não há nova linha final necessária para o ruby.
Isso simplesmente gera todas as permutações das cidades, então me decepcione
O(n!*n)
. Na verdade, pensando bem, é mais lento ainda, porque classifica todos osO(n!)
caminhos em vez de acompanhar os melhores até agora.fonte