Вам дают в виде списка или вектора, или чего-то еще, набор из 3-х кортежей или чего-то еще, где первые две вещи - это строки, а третья - это число. Строки - это города, а число - это расстояние между ними. Порядок городов в кортеже произвольный (т. Е. Не имеет значения, что идет первым, а что вторым), так как это одинаковое расстояние в каждом направлении. Кроме того, существует ровно один кортеж для каждой пары связанных сайтов. Не все города могут быть связаны. Кроме того, расстояние всегда положительно (не0
). Вам не нужно проверять эти условия, вы можете предположить, что входные данные будут правильно сформированы. Ваша задача состоит в том, чтобы возвращать города в циклической последовательности, так что, если вы начнете с какого-либо одного города и обойдете последовательность обратно в один и тот же город, общее расстояние между городами будет минимальным (точно и во всех случаи.) Вы можете предположить, что решение существует. Например, скажем, вам дали
[("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)]
Вы можете вывести любое из следующего (но вам нужно вывести только одно):
["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"]
потому что это самая короткая поездка: 13,9
но нет
["Dillburg","Detroit","New York","Hong Kong"]
потому что это не самый короткий.
См. En.wikipedia.org/wiki/Travelling_salesman_problem
счет
Вот где это становится интересным. Вы берете количество символов, которое у вас есть, а затем вставляете их в формулу O-обозначения в наихудшем случае. Например, допустим, вы пишете программу грубой силы длиной 42 символа. Как мы все знаем, худший случай , n!
когда n
это число городов. 42! = 1405006117752879898543142606244511569936384000000000, так что это ваш счет. Самый низкий балл побеждает .
Примечание: потом я тоже это облегчил, но не знал, как ее решить, и надеялся, что никто не заметит. Люди сделали, так что я пойду с предложением issacg:
единственными вариантами являются O (n!) и O (b ^ n n ^ a ln (n) ^ k), и все границы должны быть как можно более точными, учитывая эту запись
источник
O(n!)
но неO(sqrt(n)*n^n/e^n)
ниO(n!/100000000000000000000)
?O(n!)
иO(b^n*n^a*ln(n)^k)
, и все границы должны быть максимально точными, учитывая эту запись. ОП следует уточнить, хотя.O(n^2*2^n)
, что гораздо меньше, чемO(n!)
для больших n.Ответы:
Хаскелл, 259
Я думал, что смогу сделать это короче. Может быть, я буду.
это имеет временную сложность O (n ^ 2 * 2 ^ n) *, поэтому оценка составляет около 6.2e82
* На самом деле я не уверен, но если есть какое-то «дополнение» к сложности, оно не более чем полиномиальное, так что это не должно сильно изменить счет.
источник
Python 2,
237231228225 символовПоскольку это наивный алгоритм, его оценка, вероятно, около 225! ≈ 1.26e433.
источник
from itertools import*
будет короче.("a", "a", 0)
, где-то должна быть дополнительная логика, чтобы пропустить ребра нулевой длины. (И если вы в сети, вы всегда можете протестировать что-то вроде codepad.org. )sum
каждый элемент перестановки. Не будет ли этоO(n!*n)
?Юлия, 213 символов
Вероятно, идет как
n!n
, так что ~ 2e407.Для удобства чтения и демонстрации использования я оставил некоторые неотмеченные символы новой строки и вкладки, а также пример ввода и вызова функции. Также я использовал алгоритм, который требует
n!
времени, но неn!
памяти, его чуть более выполнимо для запуска.источник
sum
на каждом предмете перестановки. Разве это не O (n! * N)?Питон 3 - 491
Я не посчитал длину входной переменной графика
g
. Это решение использует динамическое программирование и имеет сложность n ^ 2 * 2 ^ n для общего балла ~ 6,39e147. Я все еще довольно новичок в гольфе, поэтому, пожалуйста, присоединяйтесь, если вы видите где-то большую трату кода!источник
Mathematica, 66 байт
Понятия не имею по сложности, поэтому оценка где-то между
10^23
и10^93
.источник
Рубин,
198180 байтПервая строка, которая читает входные данные, не оценивается, так как кажется, что это делают все остальные. Кроме того, нет окончательного перевода строки, необходимого для ruby.
Он просто тупо порождает все перестановки городов, так что опусти меня
O(n!*n)
. На самом деле, если подумать, это даже медленнее, потому что он сортирует всеO(n!)
пути, а не отслеживает лучшие.источник