Otrzymujesz listę ( a, b ) i listę x . Oblicz maksymalne ax + b dla każdego x . Możesz założyć , że a , b i x są liczbami całkowitymi nieujemnymi.
Twój program lub funkcja musi działać w oczekiwanym (losowym przypadku, jeśli Twój kod tego wymaga, a nie na wejściu) O ( n log n ) czas, gdzie n jest całkowitą długością wejściową (sumą lub maksymalną długością obu list).
To jest golf golfowy. Najkrótszy kod wygrywa.
Przykład
[[2 8] [4 0] [2 1] [1 10] [3 3] [0 4]] [1 2 3 4 5]
Wynik:
[11 12 14 16 20]
Wyjaśnienie:
11 = 1*1 + 10
12 = 1*2 + 10 = 2*2 + 8
14 = 2*3 + 8
16 = 2*4 + 8 = 4*4 + 0
20 = 4*5 + 0
Uwaga na temat złożoności:
Jeśli użyłeś wbudowanego programu o dobrej złożoności średnich przypadków i można go randomizować, aby łatwo uzyskać oczekiwaną złożoność w teorii, możesz założyć, że Twój język to zrobił.
Oznacza to, że jeśli twój program może być przetestowany pod kątem O ( n log n ), być może z wyjątkami wielkości liter z powodu implementacji twojego języka, ale nie można go logicznie zobaczyć we własnym kodzie, powiemy, że to O ( n log n ).
źródło
O(n log(n))
? Czy możesz podać algorytm referencyjny?Odpowiedzi:
Pyth -
9998 bajtówJest to prawie bezpośrednie tłumaczenie odpowiedzi Python @ KeithRandall. Zdecydowanie więcej można w nią grać w golfa.
Wkrótce opublikuję wyjaśnienie.Pobiera dwie listy rozdzielane przecinkami, oddzielone przecinkami przez standardowe wejście.
Wypróbuj tutaj
źródło
Python, 214 bajtów
Oblicza wypukły kadłub poprzez iterację wprowadzanych danych
a,b
wa
kolejności rosnącej . Wypukły kadłub jest rejestrowany wH
formacie, w-1,0,x1,a1,b1,x2,a2,b2,x2,...,xn,an,bn
którymxi
jest współrzędną x przecięciaa{i-1},b{i-1}
iai,bi
.Następnie iteruję dane wejściowe
x
w posortowanej kolejności, obcinając wypukły kadłub, aby nadążać.Wszystko jest liniowe, z wyjątkiem rodzajów, które są O (n lgn).
Uruchom to jak:
źródło
H
liniowo dla każdejx
INX
, prawda ?. Czy nie jest możliwe, że mamy złożoność O (n ^ 2), gdy obie listy mają tę samą długość?H
każdego liniowox
, ale ponieważ robię tox
w kolejności, pamiętam, gdzie zatrzymało się ostatnie wyszukiwanie i tam rozpoczynam następne. Tak więc wewnętrznawhile
pętla może wykonać co najwyżej O (n) razy we wszystkichx
(nawet jeśli może wykonać O (n) razy dla dowolnej osobyx
).while
pętli w pierwszejfor
pętli.Haskell, 204
271bajtówEdycja : grał znacznie dalej, aktualizując wypukły kadłub jako listę (ale z taką samą złożonością jak wersja nie golfowa), używając „split (x + 1)” zamiast „splitLookup x” i usuwając wszystkie kwalifikowane wywołania funkcji, takie jak Predule. złożyć
Tworzy to funkcję f, która oczekuje listy par (a, b) i listy wartości x. Wydaje mi się, że wszystko to w rodzinie APL zostanie zdumione, używając tych samych pomysłów, ale oto:
Przykładowe użycie:
Działa w czasie O (n log n); analiza poniżej.
Edycja: Oto wersja bez golfa z analizą big-O i opisem tego, jak to wszystko działa:
źródło
Common Lisp - 648
692Z rzeczywistym wyszukiwaniem binarnym.
Wyjaśnienie
Niech n będzie długością (a, b), a k długością punktów.
a
(linie równoległe), zachowując tylko linię równoległą z maksimumb
, która jest zawsze większa od drugiej (zapobiegamy podziałom przez zero przy obliczaniu skrzyżowań) - O (n)biorąc pod uwagę tę listę, zbuduj lambda, która sprawdza interwał dla danych wejściowych i oblicza maksymalną wartość - drzewo binarne jest wbudowane w O (n) (patrz /programming//a/4309901/124319 ). Wyszukiwanie binarne, które zostanie zastosowane, ma złożoność O (ln (n)) . Za pomocą przykładowego wejścia budujemy następującą funkcję (ta funkcja jest następnie kompilowana):
zastosuj tę funkcję do wszystkich elementów - O (k.ln (n))
Wynikająca z tego złożoność: O ((n + k) (ln n))) w najgorszym przypadku.
Nie możemy podać oszacowania złożoności dla całkowitej liczby danych wejściowych (n + k), ponieważ k i n są niezależne. Na przykład, jeśli n jest asymptotycznie pomijalnym wrt k , wówczas całkowita złożoność wynosiłaby O (k) .
Ale jeśli założymy, że k = O (n) , to złożoność wynikowa to O (n.ln (n)) .
Inne przykłady
A jeśli przeniesiemy cudzysłowy, aby zobaczyć, co jest obliczane, możemy zobaczyć, że nie musimy nawet dokonywać żadnych porównań (po przetworzeniu pierwszej listy):
Oto kolejny przykład (wzięty z komentarza):
Skuteczna funkcja:
źródło
(LIST* A B C R) should be a lambda expression
.(use-package :optima)
(edytowałem ...)optima
. Wreszcie kod, który podałem, powinien być możliwy do oceny.(MAPCAR (EVAL (LAMBDA (X) ...
co stanowi odpowiedź na odpowiedź. Zostawiłeś tam kod debugowania?