tło
W chwili pisania tego, P vs problemu NP jest nadal nierozwiązane, ale może słyszeliście o nowej papieru Norberta Bluma dowód twierdząc, że P! = NP, która jest już podejrzewa się błędne (ale zobaczymy).
Problemem omawianym w tym artykule jest problem kliki . Przynajmniej tak czytam w artykule w gazecie, więc popraw mnie, jeśli się mylę, ale w każdym razie chciałbym, abyś napisał program, który rozwiązuje następujący wariant:
Zadanie
Załóżmy, że mamy dużą szkołę z dużą liczbą uczniów. Każdy z tych uczniów ma w tej szkole przyjaciół. Klika studentów to grupa składająca się wyłącznie ze studentów, którzy są przyjaciółmi z każdego innego członka .
Twój program otrzyma pary studentów, którzy są przyjaciółmi jako wkład. Na podstawie tych informacji program musi znaleźć rozmiar największej kliki . Studenci są identyfikowani za pomocą liczb całkowitych .
Jeśli wolisz terminy matematyczne, oznacza to, że zasilasz krawędzie niekierowanego wykresu, identyfikowanego przez dwa węzły każdy.
Wkład
Twoje dane wejściowe będą niepustą listą dodatnich par liczb całkowitych, np [[1,2],[2,5],[1,5]]
. Możesz wprowadzić te dane w dowolnej rozsądnej formie, np. Jako tablicę tablic, jako wiersze tekstu zawierające dwie liczby, itd.
Wydajność
Oczekiwany wynik to jedna liczba n >= 2
: wielkość największej kliki. Z powyższego przykładu wejścia, wynik będzie 3
, jak wszyscy uczniowie ( 1
, 2
i 5
) są przyjaciółmi z siebie.
Przypadki testowe
[[1,2]]
=> 2
[[1,2],[3,1],[3,4]]
=> 2
[[1,2],[2,5],[1,5]]
=> 3
[[2,5],[2,3],[4,17],[1,3],[7,13],[5,3],[4,3],[4,1],[1,5],[5,4]]
=> 4 (the largest clique is [1,3,4,5])
[[15,1073],[23,764],[23,1073],[12,47],[47,15],[1073,764]]
=> 3 (the largest clique is [23,764,1073])
[[1296,316],[1650,316],[1296,1650],[1296,52],[1650,711],[711,316],[1650,52],
[52,711],[1296,711],[52,316],[52,1565],[1565,1296],[1565,316],[1650,1565],
[1296,138],[1565,138],[1565,711],[138,1650],[711,138],[138,144],[144,1860],
[1296,1860],[1860,52],[711,1639]]
=> 6 (the largest clique is [52,316,711,1296,1565,1650])
Możesz użyć tej (głupiej) implementacji referencyjnej (drukuje dodatkowe wyjście z -d
flagą) do weryfikacji wyników innych przypadków testowych.
Zasady
- Twój program nie potrzebuje określonego wyniku przy nieprawidłowym wprowadzaniu danych. Możesz więc założyć, że:
- zawsze otrzymasz przynajmniej jedną parę identyfikatorów
- każda para składa się z dwóch różnych identyfikatorów
- żadna para nie pojawia się dwa razy (zamiana miejsc identyfikatorów nadal byłaby tą samą parą)
- Twój algorytm nie może ustawić górnej granicy rozmiaru wejściowego. Ograniczenia czysto techniczne i ograniczenia określone przez Twój język / środowisko (takie jak rozmiar stosu, czas obliczeń itp.) Są oczywiście nieuniknione.
- Standardowe luki są zabronione.
- To jest golf golfowy , więc wygrywa najkrótszy kod, mierzony w bajtach.
- Jeśli algorytm ma złożoność czasową wielomianową, wynik jest
-1
natychmiastowy niezależnie od rozmiaru kodu, ale w takim przypadku możesz przesłać swoje rozwiązanie gdzie indziej. ;)
źródło
-1
jest zasłużony ;)Odpowiedzi:
Galaretka ,
15 1816 bajtów+3 bajty, aby naprawić błędy w mojej metodzie.
-2 bajty dzięki milom (zauważając, że n × (n-1) ÷ 2 = nC2 )
Monadyczny link pobierający listę przyjaźni (krawędzie) i zwracający liczbę całkowitą.
Wypróbuj online! tworzy zestaw mocy krawędzi w pamięci, więc jest nieefektywny zarówno w przestrzeni, jak i czasie (tak, to O (2 n ) ludzie)!
W jaki sposób?
źródło
Mathematica, 34 bajty
Zasadniczo FindClique wykonuje zadanie i „znajduje największą klikę na wykresie g”.
Wszystkie pozostałe rzeczy konwertują listę wejść na wykres
Wkład
Wydajność
Wkład
Wydajność
thanx @ Kelly Lowder dla -10 bajtów
źródło
Tr[1^#&@@FindClique[#<->#2&@@@#]]&
FindClique
ಠ ___ ಠGalaretka , 20 bajtów
Wypróbuj online!
Oczywiście nie zasługuje to na milion: str
To by pokonało Pytha, gdyby nie
µ(...)µ
2-bajtoweÐf
.źródło
J , 36 bajtów
Wypróbuj online!
Działa w czasie O (2 n ), gdzie n jest liczbą par.
Szybszym rozwiązaniem dla 65 bajtów jest
Wypróbuj online!
Wyjaśnienie
źródło
Pyth, 19 bajtów
Wypróbuj tutaj.
źródło
Python 2 , 180 bajtów
Wypróbuj online!
-2 dzięki shooqie .
-1 dzięki Mr. Xcoder .
-3 dzięki rekursywnemu .
źródło
len
do zmiennej(x not in y)
środki0**(x in y)
.0**
z-~-
.Pyth, 28 bajtów
Wypróbuj online
Wyjaśnienie
źródło
Python 3 ,
162159 bajtówWypróbuj online!
Funkcja c przyjmuje wierzchołki w postaci zestawu
posortowanychkrotek ({(x, y), ...}, gdzie x jest mniejsze niż y).Funkcja o nazwie „pozycja” znajduje się w nagłówku TIO, aby przetestować dane w formacie listy nieposortowanych list. Jeśli klika, zwraca długość. Jeśli nie jest klika, zwraca maksymalny rozmiar kliki wierzchołków, minus jeden wierzchołek dla każdego wierzchołka w wierzchołkach. Przekracza czas w ostatnim przypadku testowym w TIOAktualizacja: dodano porcję „lub (z, y) w x”, aby usunąć zależność od sortowania „f = lambda x: {i dla s w x dla i w s}” zamiast itertools.chain opakowane w zestawie.
-minus 3 bajty dzięki @Jonathan Allen
źródło
c
, więc możesz usunąćc=
(musisz umieścićc=\
na końcu nagłówka i umieścićlambda
na górze bloku kodu dla TIO)s
i wymienićs(...)
z{*...}
umożliwiając usunięcie niektórych miejscach też.05AB1E , 19 bajtów
Wypróbuj online!
źródło
Galaretka , 28 bajtów
Wypróbuj online!
Szybsze rozwiązanie, które jest w stanie rozwiązać ostatni przypadek testowy w ciągu sekundy w TIO.
źródło
n
mogą pojawić się tylko w bazach :)Java + Guava 23,0, 35 + 294 = 329 bajtów
Algorytm ten nie grafuje, ale generuje wszystkie kombinacje par o określonym rozmiarze. Podaję wszystkie kombinacje par do multiset i sprawdzam, czy wszystkie mają oczekiwany rozmiar (liczba unikalnych wpisów - 1). Jeśli tak, to znalazłem klikę i szukam większej.
Z biblioteki Guava korzystam z nowej
combinations
metody i typu zbioru narzędziMultiset
.Nie golfił
źródło
x
jest wielomianem ” <- jesteś pewien? Chyba taka jest metoda . Zwracana wartość toAbstractSet
z iteratorem, a następnafor
pętla wywoła ten iteratorx!
razy, jeśli się nie mylę ...x < n
(przyn
pełnym rozmiarze zestawu danych wejściowych)n!/(x!(n-x)!)
, nadal nie jest wielomianem :)combinations
metodę, która jestX^n
(co jest całkowicie możliwe), mogę ją zdobyć? Tymczasem usuwam moje roszczenie dotyczące „-1”.Python 2 , 102 bajty
Wypróbuj online!
źródło
Kod maszynowy 6502 (C64),
774703 bajty(Po prostu musiałem to zrobić, mój C64 może zrobić wszystko ... hehe)
zrzut heksowy:
Demo online
Sposób użycia: Zacznij od
sys49152
, a następnie wprowadź pary po jednym w wierszu, npBacksapce nie jest obsługiwane podczas wprowadzania (ale jeśli używasz
vice
, po prostu skopiuj i wklej dane wejściowe do emulatora). Wpisz pusty wiersz, aby rozpocząć obliczenia.Jest on zbyt duży, aby opublikować tutaj objaśniającą listę deasemblacji, ale można przeglądać źródło zestawu w stylu ca65 . Algorytm jest bardzo nieefektywny, generuje każdą możliwą permutację węzłów i przy każdym z nich zachłannie buduje klikę, sprawdzając wszystkie krawędzie. Pozwala to na wykorzystanie przestrzeni w O (N) (rodzaj ważne w przypadku maszyny z tą małą RAM), ale ma straszną wydajności wykonania (*) . Teoretyczne ograniczenia wynoszą do 256 węzłów i do 8192 krawędzi.
Istnieje większa (
883805 bajtów) wersja z lepszymi funkcjami:Demo online
Przeglądaj źródło
(*) Ostatni przypadek testowy zajmuje od 12 do 20 godzin (spałem, kiedy w końcu się skończył). Pozostałe przypadki testowe kończą się najgorzej w ciągu kilku minut.
źródło