Ich verstehe, dass KMP-Algorithmus hängt von der Helfer-Array, dass es Präfixe, die Suffixe ähnlich sind. Es wird nicht effizient, wenn die obige Bedingung nicht erfüllt ist, da im Helper-Array alle Nullen enthält. Wäre die Laufzeit O (m + n)? Wenn ich richtig bin, was ist ein besser Teilstring-Algorithmus in diesem Fall?Wann ist es gut, den KMP-Algorithmus zu verwenden?
Antwort
Um zu verstehen, wann KMP ein guter Algorithmus ist, ist es oft hilfreich, die Frage "Was ist die Alternative?" Zu stellen.
KMP hat den Vorteil, dass es im ungünstigsten Fall effizient ist. Die Vorlaufzeit ist immer O (n) und die Suchzeit ist immer O (m). Es gibt keine Worst-Case-Inputs, keine Wahrscheinlichkeit, Pech zu haben, etc. In Fällen, in denen Sie sehr lange Strings (large n) innerhalb wirklich großer Strings (large m) suchen, kann dies im Vergleich zu anderen Algorithmen sehr wünschenswert sein der naive (der in schlechten Fällen Zeit braucht Θ (Mn)), Rabin-Karp (pathologische Eingaben können Zeit brauchen Θ (Mn)), oder Boyer-Moore (Worst-Case kann Θ (Mn) sein). Sie haben recht, dass KMP nicht unbedingt notwendig ist, wenn es nicht viele überlappende Teile der Saite gibt, aber die Tatsache, dass Sie sich nie darum kümmern müssen, ob es einen schlechten Fall gibt, ist definitiv eine gute Sache!
KMP hat auch die nette Eigenschaft, dass die Verarbeitung ein einziges Mal durchgeführt werden kann. Wenn Sie wissen, dass Sie nach dem gleichen Teilstring viele Male suchen werden, können Sie die O (n) Preprocessing-Arbeit einmal durchführen und dann die Möglichkeit haben, in einer beliebig langen Länge zu suchen (m).
- 1. Wann ist es gut, FTP zu verwenden?
- 2. Wann ist es gut, verschachtelte Funktionen in Python zu verwenden?
- 3. Wann ist es gut Embedded Skriptsprache wie Lua zu verwenden
- 4. Wofür ist XML gut und wann sollte ich es verwenden?
- 5. Ist es gut, einen Formbuilder zu verwenden?
- 6. Wann ist es angebracht, NOLOCK zu verwenden?
- 7. Wann ist es erforderlich, Lebensdauern zu verwenden?
- 8. Wann ist es sicher, .toString() zu verwenden?
- 9. Wann ist Q_NULLPTR zu verwenden?
- 10. Wann ist VK_IMAGE_LAYOUT_GENERAL zu verwenden?
- 11. Wann AzureQueueSink zu verwenden ist
- 12. Verwirrt über RegionBootstrap und wann es zu verwenden ist
- 13. Wann ist ccache zu verwenden?
- 14. Ist es gut, JQuerys Validierungs-Plugin zu verwenden?
- 15. Wann ist @atomic zu verwenden?
- 16. Ist es gut jQuery zu verwenden, um mit Winkel 2+
- 17. Ist es gut CookieStor für unter Szenario zu verwenden
- 18. Ist es gut, Tabellen in HTML 5 zu verwenden?
- 19. Ist es gut, elasticsearch für Container zu verwenden?
- 20. Ist es gut, filter_var mit htmlentities in PHP zu verwenden?
- 21. Wann socket.io zu verwenden und wann Ajax zu verwenden
- 22. Wann ist es angebracht, Django-Kontextprozessoren zu verwenden?
- 23. Wann ist es semantisch korrekt, das hr-Element zu verwenden?
- 24. Wann ist es angebracht, das KnownType-Attribut zu verwenden?
- 25. Wann ist es praktisch, einen Parsergenerator zu verwenden?
- 26. Android: Wann ist es angebracht, FragmentTransaction.remove zu verwenden?
- 27. Wann ist es angebracht, "delete this" zu verwenden?
- 28. Wann ist es sinnvoll, eine Karte zu verwenden?
- 29. SignInManager, was ist es und wie, wann zu verwenden?
- 30. Wann ist es nicht angemessen, abgeleitete Tabellen zu verwenden?
Warum ist das der Fall: Es gibt keine Worst-Case-Eingaben, keine Wahrscheinlichkeit, Pech zu bekommen? Wenn es in der Musterzeichenfolge kein wiederholtes Muster gibt, würde das Helferfeld alle Nullen enthalten, was bedeutet, Bei jedem Zeichen der Zeichenfolge müssen wir zurück zum Anfang der Musterzeichenfolge gehen? – Jun
@Jun Sie sind absolut richtig, dass das Fallback-Array nur Nullen wäre und dass wir bei jeder Nichtübereinstimmung zurück zum Anfang der Musterzeichenfolge gehen müssten. Wenn dies jedoch geschieht, werden wir auch in der Eingabezeichenfolge eine entsprechende Entfernung vorrücken. Jedes Zeichen des Eingangs wird höchstens zweimal gelesen. – templatetypedef
uh, ich bekomme es jetzt! Vielen Dank! – Jun