Dostajesz, jako listę, wektor lub cokolwiek, wiązkę 3-krotek lub cokolwiek, gdzie pierwsze dwie rzeczy są łańcuchami, a trzecia to liczba. Ciągi to miasta, a liczba to odległość między nimi. Kolejność miast w krotce jest dowolna (tzn. Nie ma znaczenia, który z nich będzie pierwszy, a który drugi), ponieważ w każdym kierunku jest taka sama odległość. Ponadto dla każdej pary połączonych cytatów jest dokładnie jedna krotka. Nie wszystkie miasta mogą być połączone. Ponadto odległość jest zawsze dodatnia (nie0
). Nie musisz sprawdzać tych warunków, możesz założyć, że dane wejściowe będą dobrze sformułowane. Twoim zadaniem jest zwracanie miast w cyklicznej sekwencji, tak że jeśli zaczniesz od jednego miasta i przejdziesz sekwencję z powrotem do tego samego miasta, całkowita odległość między miastami będzie minimalna (dokładnie i we wszystkich przypadki). Możesz założyć, że istnieje rozwiązanie. Powiedzmy na przykład, że otrzymałeś
[("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)]
Możesz wypisać dowolne z poniższych (ale musisz tylko wypisać jedno):
["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"]
ponieważ jest to najkrótsza podróż: 13,9
ale nie
["Dillburg","Detroit","New York","Hong Kong"]
ponieważ nie jest najkrótszy.
Zobacz en.wikipedia.org/wiki/Travelling_salesman_problem
Punktacja
Tutaj zaczyna się robić ciekawie. Bierzesz liczbę posiadanych znaków, a następnie podłączasz je do najgorszego wzoru O-notacji. Powiedzmy na przykład, że piszesz program brutalnej siły, który ma 42 znaki. Jak wszyscy wiemy, najgorszy przypadek n!
, gdzie n
jest liczbą miast. 42! = 1405006117752879898543142606244511569936384000000000, więc taki jest twój wynik. Te najniższe wynikiem wygrywa .
Uwaga: później też mi to ulżyło, ale nie byłem pewien, jak to rozwiązać i miałem nadzieję, że nikt tego nie zauważy. Ludzie to zrobili, więc przejdę do sugestii Issacga:
jedynymi opcjami są O (n!) i O (b ^ n n ^ a ln (n) ^ k), a wszystkie granice muszą być jak najściślejsze, biorąc pod uwagę ten zapis
źródło
O(n!)
ale nieO(sqrt(n)*n^n/e^n)
aniO(n!/100000000000000000000)
?O(n!)
iO(b^n*n^a*ln(n)^k)
, a wszystkie granice muszą być jak najściślejsze, biorąc pod uwagę ten zapis. OP powinien jednak wyjaśnić.O(n^2*2^n)
jest znacznie mniejsze niż wO(n!)
przypadku dużej liczby n.Odpowiedzi:
Haskell, 259
Myślałem, że uda mi się to skrócić. Może, bedę.
ma to złożoność czasową O (n ^ 2 * 2 ^ n) *, więc wynik wynosi około 6,2e82
* Nie jestem do końca pewien, ale jeśli jest coś „dodającego” do złożoności, to nie jest to więcej niż wielomian, więc nie powinno to zbytnio zmieniać wyniku.
źródło
Python 2,
237231228225 znakówPonieważ jest to naiwny algorytm, jego wynik to prawdopodobnie około 225! ≈ 1,26e433.
źródło
from itertools import*
byłoby krótsze.("a", "a", 0)
, musiałaby istnieć dodatkowa logika, aby pominąć krawędzie zerowej długości. (A jeśli jesteś w sieci, zawsze możesz przetestować za pomocą czegoś takiego jak codepad.org. )sum
każdą pozycję permutacji. Czy to nie byłobyO(n!*n)
?Julia, 213 znaków
Prawdopodobnie idzie tak
n!n
, więc ~ 2e407.Dla czytelności i zademonstrowania użycia pozostawiłem w nieskalowanych znakach nowej linii i kartach, a także przykładowe dane wejściowe i wywołanie funkcji. Użyłem również algorytmu, który wymaga
n!
czasu, ale nien!
pamięci, jego nieco bardziej wykonalne działanie.źródło
sum
na każdym elemencie permutacji. Czy nie byłoby to O (n! * N)?Python 3 - 491
Nie policzyłem długości zmiennej wykresu wejściowego
g
. To rozwiązanie wykorzystuje programowanie dynamiczne i ma złożoność n ^ 2 * 2 ^ n, co daje łączny wynik ~ 6,39 e147. Nadal jestem całkiem nowy w golfie, więc włącz się, jeśli zobaczysz gdzieś duże marnotrawstwo kodu!źródło
Mathematica, 66 bajtów
Nie ma pojęcia o złożoności, więc wynik jest gdzieś pomiędzy
10^23
a10^93
.źródło
Rubin,
198180 bajtówPierwszy wiersz, w którym czytane są dane wejściowe, nie jest oceniany, ponieważ wydaje się, że robią to wszyscy inni. Poza tym ruby nie wymaga ostatecznej nowej linii.
Po prostu głupio generuje wszystkie permutacje miast, więc mnie odłóż
O(n!*n)
. Właściwie, po zastanowieniu, jest nawet wolniejszy, ponieważ sortuje wszystkieO(n!)
ścieżki, a nie śledzi najlepszych do tej pory.źródło