2017-03-25 3 views
1

Mit Bezug auf die question, habe ich die akzeptierte Antwort Java Collections API verwendet, um den Index zu erhalten. Meine Frage ist, gibt es so viele andere Methoden, um das gegebene Problem zu lösen, welches die optimale Lösung wäre?Algorithmuskomplexität: Finden des Startindex eines Sub-Array in einem größeren Array

  1. Verwenden zwei Schleifen
  2. Verwenden Sortieren und Binärsuche
  3. Verwenden Sortieren und Mischen
  4. Verwendung
  5. Verwenden Collections api
+0

Probieren Sie es aus und Benchmark sie? Obwohl ich sagen würde, dass derjenige, der den geringsten Code erfordert, oft der beste ist. – UnholySheep

Antwort

2
  1. Verwenden zwei Schleifen Hashing O(n^2) Zeit dauern wird,
  2. Verwenden Sie das Sortieren und binäre Suche wird O(nlog n) Zeit
  3. Gebrauch nehmen Sortieren und Mischen O(nlog n) Zeit
  4. Verwendung Hashing O(k * n) Zeit mit einem anderen Overhead und zusätzlichem Platz nehmen.
  5. Verwenden Kollektionen api nimmt O(n^2) Zeit als seine Verwendung nativer Algorithmus unter der Haube

Sie es zusammen mit der Art und Weise optimal tun können mit Knuth–Morris–Pratt algorithm in linearer O(n + m) Zeitkomplexität oben erwähnt, wo n und m sind die Längen der beiden Arrays.

KMP-Algorithmus ist im Grunde ein Muster-Matching-Algorithmus (die Startposition einer Nadel im Heuhaufen zu finden), der auf Zeichenkette funktioniert. Aber Sie können es einfach für Integer-Array verwenden.

Sie können einige Benchmark-Tests für alle diese Implementierungen durchführen und wählen, welche für Ihre Anforderungen effizient genug ist.

+0

Danke. Aber es scheint, dass der gegebene Algorithmus für Strings ist. Ist es gut für Integer-Arrays? – deadbug

+1

Ja, anstatt Zeichenarray (string) zu vergleichen 'str1 [i] == str2 [j]' wird das Ganzzahlarray 'arr1 [i] == arr2 [j] 'verglichen. Ein Vergleich des Zeichens von Zeichenkette vergleicht ein Byte und für Ganzzahl seine vier Bytes. Nichts anderes als das. –

Verwandte Themen