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
O(n!)
und O(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 als O(n!)
für große n ist.
O(n!)
doch nochO(sqrt(n)*n^n/e^n)
nichtO(n!/100000000000000000000)
?