Bei einem sortierten Array von Ganzzahlen möchte ich die Anzahl der Paare ermitteln, die sich zu summieren . Wenn beispielsweise { - 3 , - 2 , 0 , 2 , 3 , 4 } gegeben ist , beträgt die Anzahl der Paarsummen 2 .
Sei die Anzahl der Elemente im Eingabearray. Wenn ich die binäre Suche verwende, um die additive Inverse für ein Element im Array zu finden, lautet die Reihenfolge O ( log N ) . Wenn ich alle Elemente in der Menge durchlaufe, ist die Reihenfolge O ( N log N ) .
Wie finde ich einen Algorithmus der Ordnung ?
algorithms
Laura
quelle
quelle
Antworten:
Sei das sortierte Eingabearray. Behalten Sie zwei Zeiger l und r bei , die durch die Elemente in A gehen . Der Zeiger l geht durch den "linken Teil" von A , dh die negativen ganzen Zahlen. Der Zeiger r macht dasselbe für den "rechten Teil", die positiven ganzen Zahlen. Im Folgenden werde ich eine Pseudocode-Lösung skizzieren und der Einfachheit halber 0 ∉ A annehmen . Ausgelassen sind auch die Prüfungen für die Fälle, in denen es in A nur positive oder nur negative ganze Zahlen gibt .A l r A l A r 0∉A A
Es ist offensichtlich, dass der Algorithmus Zeit benötigt.O(N)
quelle
Nach meinem Verständnis scheint der einfachste Ansatz darin zu bestehen, eine Hash-Tabelle zu verwenden, H = {a [0] = wahr, .., a [n-1] = wahr}. Diese Hash-Tabelle kann in O (n) -Zeit erstellt werden. Sobald die Hash-Tabelle erstellt ist, durchlaufen Sie A [0, .., n-1] und prüfen Sie, ob H [-1 * a [i]] vorhanden ist. Wenn dies der Fall ist, erhöhen Sie einen Zähler um 1 und geben Sie das Endergebnis zurück. Dies ist eindeutig O (n).
quelle
Beachten Sie, dass wir einen Wert in einem Python-Set in konstanter Zeit suchen können.
quelle