Sie erhalten eine Liste, einen Vektor oder was auch immer, ein Bündel von 3-Tupeln oder was auch immer, wobei die ersten beiden Dinge Zeichenfolgen sind und das dritte eine Zahl. Die Zeichenfolgen sind Städte, und die Zahl gibt die Entfernung zwischen ihnen an. Die Reihenfolge der Städte im Tupel ist willkürlich (dh es spielt keine Rolle, welche zuerst und welche dann an zweiter Stelle kommt), da die Entfernung in jeder Richtung gleich ist. Außerdem gibt es genau ein Tupel für jedes Paar verbundener Städte. Möglicherweise sind nicht alle Städte verbunden. Auch der Abstand ist immer positiv (nicht0
). Sie brauchen diese Bedingungen nicht zu überprüfen, Sie können davon ausgehen, dass die Eingabe korrekt ist. Ihre Aufgabe ist es, die Städte in einer zyklischen Reihenfolge zurückzugeben, sodass, wenn Sie an einer beliebigen Stadt beginnen und die Reihenfolge bis zu derselben Stadt wiederholen, die Gesamtentfernung zwischen den Städten minimal ist (genau und insgesamt) Fälle.) Sie können davon ausgehen, dass eine Lösung existiert. Nehmen wir zum Beispiel an, Sie sind gegeben
[("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)]
Sie können Folgendes ausgeben (aber Sie müssen nur eines ausgeben):
["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"]
weil es die kürzeste fahrt ist: 13.9
aber nicht
["Dillburg","Detroit","New York","Hong Kong"]
weil es nicht das kürzeste ist.
Siehe en.wikipedia.org/wiki/Travelling_salesman_problem
Wertung
Hier wird es interessant. Sie nehmen die Anzahl der Zeichen, die Sie haben, und stecken sie dann in die O-Notationsformel für den schlimmsten Fall. Angenommen, Sie schreiben ein Brute-Force-Programm mit 42 Zeichen. Wie wir alle wissen, ist der schlimmste Fall , n!
wo n
die Zahl der Städte ist. 42! = 1405006117752879898543142606244511569936384000000000, das ist also Ihre Punktzahl. Die niedrigste Punktzahl gewinnt .
Hinweis: Ich habe das später auch gelindert, war mir aber nicht sicher, wie ich es lösen sollte, und hoffte, dass es niemand bemerken würde. Die Leute taten es, also werde ich mit issacgs Vorschlag weitermachen:
Die einzigen Optionen sind O (n!) und O (b ^ n ^ a (n) ^ k), und alle Grenzen müssen unter Berücksichtigung dieser Notation so eng wie möglich sein
quelle
O(n!)
doch nochO(sqrt(n)*n^n/e^n)
nichtO(n!/100000000000000000000)
?O(n!)
undO(b^n*n^a*ln(n)^k)
sind und dass alle Grenzen angesichts dieser Notation so eng wie möglich sein müssen. OP sollte jedoch klarstellen.O(n^2*2^n)
, die viel weniger alsO(n!)
für große n ist.Antworten:
Haskell, 259
Ich dachte, ich könnte es kürzer machen. Vielleicht werde ich.
Dies hat eine zeitliche Komplexität von O (n ^ 2 * 2 ^ n) *, so dass die Punktzahl etwa 6,2e82 beträgt
* Ich bin mir nicht sicher, aber wenn es irgendeinen "Zusatz" zur Komplexität gibt, ist es nicht mehr als ein Polynom, daher sollte dies die Punktzahl nicht wesentlich verändern.
quelle
Python 2,
237231228225 ZeichenDa dies ein naiver Algorithmus ist, liegt seine Punktzahl wahrscheinlich bei 225! ≈ 1,26e433.
quelle
from itertools import*
wäre kürzer.("a", "a", 0)
, müsste irgendwo eine zusätzliche Logik vorhanden sein, um Kanten mit der Länge Null zu überspringen. (Und wenn Sie im Internet sind, können Sie immer mit so etwas wie codepad.org testen. )sum
jedes Element einer Permutation aufgerufen . Wäre das nicht seinO(n!*n)
?Julia, 213 Zeichen
n!n
Geht wohl so , also ~ 2e407.Zur besseren Lesbarkeit und zur Veranschaulichung der Verwendung habe ich in einigen Zeilenumbrüchen und Tabulatoren sowie bei der Beispieleingabe einen Aufruf der Funktion hinterlassen. Außerdem habe ich einen Algorithmus verwendet, der
n!
Zeit benötigt , aber keinenn!
Speicher. Der Algorithmus ist etwas praktikabler.quelle
sum
für jedes Element einer Permutation aufgerufen . Wäre das nicht O (n! * N)?Python 3 - 491
Ich habe die Länge der Eingabegraphvariablen nicht gezählt
g
. Diese Lösung verwendet dynamische Programmierung und hat eine Komplexität von n ^ 2 * 2 ^ n für eine Gesamtpunktzahl von ~ 6,39e147. Ich bin noch ziemlich neu im Golfen, also bitte melden Sie sich, wenn Sie irgendwo eine große Verschwendung von Code sehen!quelle
Mathematica, 66 Bytes
Keine Ahnung von der Komplexität, daher liegt die Punktzahl irgendwo zwischen
10^23
und10^93
.quelle
Rubin,
198180 BytesDie erste Zeile, in der die Eingabe gelesen wird, ist nicht markiert, da dies anscheinend alle anderen Benutzer tun. Außerdem wird für Ruby kein abschließender Zeilenumbruch benötigt.
Es erzeugt nur dumm alle Permutationen von Städten, also mach mich fertig
O(n!*n)
. Eigentlich ist es, wenn man es sich überlegt, sogar langsamer, weil es alleO(n!)
Pfade sortiert, anstatt die bisher besten zu verfolgen.quelle