Sie erhalten eine Liste von ( a, b ) und eine Liste von x . Berechnen Sie die maximale Axt + b für jedes x . Sie können annehmen, dass a , b und x nicht negative ganze Zahlen sind.
Ihr Programm oder Funktion muss in erwartet ausgeführt (die Zufälligkeit , wenn Ihr Code das betrifft, nicht der Eingang) O ( n log n ) Zeit , wo n ist die gesamte Eingangslänge (Summe oder Maximum der Längen der beiden Listen).
Das ist Code-Golf. Kürzester Code gewinnt.
Beispiel
[[2 8] [4 0] [2 1] [1 10] [3 3] [0 4]] [1 2 3 4 5]
Ausgabe:
[11 12 14 16 20]
Erläuterung:
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
Anmerkung zur Komplexität:
Wenn Sie ein Builtin mit einer guten durchschnittlichen Komplexität verwendet haben und es randomisiert werden kann, um die erwartete Komplexität theoretisch leicht zu erhalten, können Sie davon ausgehen, dass Ihre Sprache dies getan hat.
Das heißt, wenn Ihr Programm getestet werden kann, um in O ( n log n ) zu sein, möglicherweise mit Ausnahmen in Randbedingungen aufgrund der Implementierung Ihrer Sprache, aber nicht logisch in Ihrem eigenen Code zu sehen, werden wir sagen, es ist O ( n log n ).
quelle
O(n log(n))
? Können Sie einen Referenzalgorithmus bereitstellen?Antworten:
Pyth -
9998 BytesDies ist so ziemlich eine direkte Übersetzung von @ KeithRandalls Python-Antwort. Es kann definitiv viel mehr golfen werden.
Ich werde bald eine Erklärung veröffentlichen.Nimmt zwei durch Kommas getrennte Listen auf, die durch Kommas durch stdin getrennt sind.
Probieren Sie es hier aus
quelle
Python, 214 Bytes
Berechnet die konvexe Hülle, indem die Eingabe
a,b
in aufsteigendera
Reihenfolge durchlaufen wird. Die konvexe Hülle wird imH
Format-1,0,x1,a1,b1,x2,a2,b2,x2,...,xn,an,bn
where aufgezeichnetxi
die x des Schnittes Koordinatea{i-1},b{i-1}
undai,bi
.Dann durchlaufe ich die Eingaben
x
in sortierter Reihenfolge und schneide die konvexe Hülle ab, um auf dem Laufenden zu bleiben.Alles ist linear mit Ausnahme der Sorten O (n lgn).
Führen Sie es wie folgt aus:
quelle
H
linear für jedex
inX
, nicht wahr ?. Ist es nicht möglich, dass wir O (n ^ 2) -Komplexität haben, wenn beide Listen die gleiche Länge haben?H
linear nach jedemx
, aber weil ich diex
s in der Reihenfolge tue , erinnere ich mich, wo die letzte Suche aufgehört hat und beginne die nächste Suche dort. Die innerewhile
Schleife kann also höchstens O (n) Mal über alle ausgeführt werdenx
(auch wenn sie für eine Person möglicherweise O (n) Mal ausgeführt wirdx
).while
Schleife in der erstenfor
Schleife geschieht .Haskell, 204
271BytesBearbeiten : Golf viel weiter durch Aktualisieren der konvexen Hülle als Liste (aber mit der gleichen Komplexität wie die ungolfed Version), Verwenden von "split (x + 1)" anstelle von "splitLookup x" und Entfernen aller qualifizierten Funktionsaufrufe wie Predule. foldl.
Dies erzeugt eine Funktion f, die die Liste von (a, b) Paaren und eine Liste von x Werten erwartet. Ich denke, es wird von irgendetwas in der APL-Familie mit den gleichen Ideen in die Länge getrieben, aber hier ist es:
Beispielnutzung:
Es funktioniert in O (n log n) Zeit; Analyse siehe unten.
Bearbeiten: Hier ist eine ungolfed Version mit der Big-O-Analyse und einer Beschreibung, wie alles funktioniert:
quelle
Common Lisp - 648
692Mit einer tatsächlichen binären Suche.
Erläuterung
Sei n die Länge von (a, b) und k die Länge von Punkten.
a
(parallele Linien) nur die Parallelleitung mit dem maximalen Haltb
, die immer größer als die andere sind (wir verhindern Divisionen durch Null , wenn die Berechnung Kreuzungen) - O (n)Erstellen Sie anhand dieser Liste ein Lambda, das eine Intervallprüfung für seine Eingabe durchführt und den Maximalwert berechnet - der Binärbaum wird in O (n) erstellt (siehe /programming//a/4309901/124319 ). Die binäre Suche, die angewendet wird, hat die Komplexität O (ln (n)) . Mit der Beispieleingabe erstellen wir die folgende Funktion (diese Funktion wird dann kompiliert):
wende diese Funktion auf alle Elemente an - O (k.ln (n))
Resultierende Komplexität: O ((n + k) (ln n)) im ungünstigsten Fall.
Wir können keine Komplexitätsschätzung für die Gesamtzahl der Eingaben (n + k) bereitstellen, da k und n unabhängig sind. Wenn beispielsweise n asymptotisch negligeable WRT k , dann wäre die Gesamtkomplexität seine O (k) .
Aber wenn wir annehmen , dass k = O (n) , dann wird die resultierende Komplexität ist O (n.ln (n)) .
Andere Beispiele
Und wenn wir die Anführungszeichen verschieben, um zu sehen, was berechnet wird, müssen wir nicht einmal vergleichen (sobald die erste Liste vorverarbeitet ist):
Hier ist ein weiteres Beispiel (aus einem Kommentar entnommen):
Die effektive Funktion:
quelle
(LIST* A B C R) should be a lambda expression
.(use-package :optima)
(Bearbeitung ...)optima
. Schließlich sollte der von mir bereitgestellte Code auswertbar sein.(MAPCAR (EVAL (LAMBDA (X) ...
das zur Antwort auswertet. Haben Sie dort einen Debug-Code hinterlassen?