Se le da, como una lista o vector o lo que sea, un grupo de 3 tuplas o lo que sea, donde las dos primeras cosas son cadenas y la tercera es un número. Las cadenas son ciudades, y el número es la distancia entre ellas. El orden de las ciudades en la tupla es arbitrario (es decir, no importa cuál viene primero y cuál viene segundo) ya que es la misma distancia en cada sentido. Además, hay exactamente una tupla por cada par de citas conectadas. No todas las ciudades pueden estar conectadas. Además, la distancia siempre es positiva (no0
) No es necesario que verifique estas condiciones, puede suponer que la entrada estará bien formada. Su trabajo es devolver las ciudades en una secuencia cíclica, de modo que, si comienza en cualquier ciudad y recorre la secuencia de regreso a la misma ciudad, el total de las distancias entre las ciudades será mínimo (exactamente y en total casos.) Puede suponer que existe una solución. Por ejemplo, digamos que le dan
[("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)]
Puede generar cualquiera de los siguientes (pero solo necesita generar uno):
["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 es el viaje más corto: 13,9
pero no
["Dillburg","Detroit","New York","Hong Kong"]
porque no es el más corto
Ver en.wikipedia.org/wiki/Travelling_salesman_problem
Puntuación
Aquí es donde se pone interesante. Usted toma la cantidad de caracteres que tiene y luego los conecta a la fórmula de notación O más desfavorable. Por ejemplo, supongamos que escribe un programa de fuerza bruta que tiene 42 caracteres. Como todos sabemos, el peor de los casos es n!
dónde n
está el número de ciudades. 42! = 1405006117752879898543142606244511569936384000000000, así que ese es tu puntaje. El puntaje más bajo gana .
Nota: También alivié esto después, pero no estaba seguro de cómo resolverlo y esperaba que nadie lo notara. La gente lo hizo, así que iré con la sugerencia de issacg:
las únicas opciones son O (n!) y O (b ^ n n ^ a ln (n) ^ k), y todos los límites deben ser lo más ajustados posible dada esa notación
fuente
O(n!)
pero noO(sqrt(n)*n^n/e^n)
niO(n!/100000000000000000000)
?O(n!)
yO(b^n*n^a*ln(n)^k)
, y todos los límites deben ser lo más ajustados posible dada esa notación. OP debería aclarar, sin embargo.O(n^2*2^n)
, que es mucho menor queO(n!)
para n grande.Respuestas:
Haskell, 259
Pensé que podría acortarlo. Quizás lo haga.
esto tiene una complejidad temporal de O (n ^ 2 * 2 ^ n) *, por lo que la puntuación es de aproximadamente 6.2e82
* No estoy realmente seguro, pero si hay alguna "adición" a la complejidad, no es más que polinomio, por lo que esto no debería cambiar mucho la puntuación.
fuente
Python 2,
237231228225 caracteresDado que este es un algoritmo ingenuo, ¡su puntaje es probablemente de 225! ≈ 1.26e433.
fuente
from itertools import*
Sería más corto.("a", "a", 0)
, necesitaría una lógica adicional en algún lugar para omitir los bordes de longitud cero. (Y si estás en la web, siempre puedes probar con algo como codepad.org. )sum
a cada elemento de una permutación. ¿No sería esoO(n!*n)
?Julia, 213 caracteres
Probablemente va así
n!n
, entonces ~ 2e407.Para facilitar la lectura y demostrar el uso, dejé algunas líneas nuevas y pestañas sin puntaje, así como entradas de ejemplo y una llamada a la función. También utilicé un algoritmo que requiere
n!
tiempo, pero non!
memoria, es un poco más factible de ejecutar.fuente
sum
en cada elemento de una permutación. ¿No sería eso O (n! * N)?Python 3-491
No conté la longitud de la variable gráfica de entrada
g
. Esta solución utiliza programación dinámica y tiene una complejidad de n ^ 2 * 2 ^ n, para un puntaje total de ~ 6.39e147. Todavía soy bastante nuevo en el golf, ¡así que por favor interviene si ves un gran desperdicio de código en alguna parte!fuente
Mathematica, 66 bytes
No tengo idea de la complejidad, por lo que la puntuación está en algún lugar entre
10^23
y10^93
.fuente
Rubí,
198180 bytesLa primera línea que lee la entrada no tiene puntaje, ya que parece ser lo que todos los demás están haciendo. Además, no hay una nueva línea final necesaria para ruby.
Simplemente genera tontamente todas las permutaciones de las ciudades, así que desánime
O(n!*n)
. En realidad, pensándolo bien, es más lento incluso que eso, porque clasifica todos losO(n!)
caminos en lugar de hacer un seguimiento de los mejores hasta ahora.fuente