/ / Algorithmus, der prüft, ob in den Feldern S und T Ganzzahlen s und t sind, also s + t = k, wenn k eine Zahl ist - Algorithmus, big-o

Algorithmus, der überprüft, ob in den Feldern S und T Ganzzahlen s und t sind, also s + t = k, wenn k die Zahl gegeben ist - Algorithmus, big-o

Ich versuche einen Algorithmus zu erstellen, der zwei benötigtArrays, S und T von n ganzen Zahlen und Ganzzahl k. Der Algorithmus prüft, ob die Arrays ganze Zahlen s und t haben, also s + t = k. (S in S und t in T.) Der Algorithmus soll eine Laufzeit von O (n log n) haben.

Ich habe versucht, an etwas zu denken, das das Array sortiertT und benutze die for-Schleife, um durch S zu gehen und binäre Suche zu verwenden, um zu sehen, ob ich eine Ganzzahl wie k - S [i] für jedes Element in S finde. Aber das wird immer eine Laufzeit größer als n log n haben, denke ich.

Nicht nach jemandem suchen, um den Code zu schreiben. Frag nur hier nach ein paar Ideen.

Antworten:

6 für die Antwort № 1

Sortieren Sie die zwei Listen, das ist O (n log n).

Richte dann zwei Iteratoren ein. Ein Iterator beginnt am niedrigste Wert in S und geht weiter durch immer steigende Werte in S. Der andere Iterator beginnt bei der höchste Wert in T und iteriert durch immer kleiner werdende Werte.

Wiederhole das Folgende:

  • wenn die aktuellen Werte zu einer Zahl größer als k, führe den T-Iterator weiter. Dies sollte die Summe verringern.
  • wenn die aktuellen Werte zu einer Zahl kleiner als summieren k, schreite den S-Iterator voran. Dies sollte die Summe erhöhen.
  • wenn die aktuellen Werte summieren k, dann mit Erfolg beenden.

Diese zweite Phase sollte höchstens 2 N fortschreiten und ist daher O (n). Also ist die Gesamtkomplexität O (n log n).

Dies hat die gleiche Komplexität wie wiederholte binäre Suche, aber dieser Algorithmus sollte schneller sein, insbesondere für große n.


3 für die Antwort № 2

Der Algorithmus, den Sie angegeben haben, hat tatsächlich Laufzeit O (n log n), vorausgesetzt, die Gesamtzahl der Elemente in beiden Arrays ist O (n). Sie können dies hier sehen:

  • Sortiere eines der Arrays (O (n log n))
  • Für jedes Element des anderen Arrays: (O (n) Iterationen)
    • Führen Sie eine binäre Suche durch, um festzustellen, ob sich das Komplementärelement im anderen Array befindet (O (log n) -Zeit).

Der erste Schritt braucht Zeit O (n log n), und dieDer zweite Schritt besteht aus O (n) Iterationen eines O (log n) -Algorithmus, der also auch die Zeit O (n log n) benötigt. Da O (n log n) + O (n log n) = O (n log n) ist, läuft Ihr Algorithmus in der Zeit O (n log n). Es sieht also so aus, als hättest du genau den Algorithmus, nach dem du suchst!

Hoffe das hilft!


3 für die Antwort № 3

Sortieren beide die Arrays. Geh durch sie hinein Gegenteil Richtungen. Wenn die Summe der beiden Elemente kleiner als k ist, schreite den "ansteigenden" Zeiger, wenn er größer als k ist, schreite den abnehmenden Zeiger. Diese Methode ist möglicherweise etwas langsamer als das Sortieren nur eines der Arrays, aber der letzte Durchlauf ist definitiv schneller. Und wahrscheinlich kürzer, weil der Kopf- und der Schwanzteil der beiden Arrays übersprungen werden können (weggeschnitten).


2 für die Antwort № 4

Dein Ansatz scheint korrekt zu sein; Sortieren Sie zuerst die Arrays, dann zwei O (n log n) -Operationen und führen Sie dann n binäre Suchen durch, die jeweils O (log n) sind.


2 für die Antwort № 5

Die Sortierung ist O (n log n). Dann haben Sie für jedes O (n) erste Elemente eine O (log n) Suche nach einem passenden Element. Das klingt wie O (n log n) insgesamt (da O (f) + O (f) = O (f) für jede Funktion f).


0 für die Antwort № 6

Noch eine andere Methode: Speichern Sie eines der Arrays in einer Hashtabelle (O (N)). Mache einen linearen Durchlauf durch den anderen (O (N)) und suche für jedes Element nach k-elem in der Hashtabelle. Gesamtlaufzeit: 2 * O (N): = O (N). Profitieren!