Frage Python-String 'in' Operator-Implementierungsalgorithmus und Zeitkomplexität


Ich denke an wie in zum Beispiel Operateur implementieren

>>> s1 = 'abcdef'
>>> s2 = 'bcd'
>>> s2 in s1
True

In CPython, mit welchem ​​Algorithmus wird die String-Übereinstimmung implementiert und wie hoch ist die zeitliche Komplexität? Gibt es ein offizielles Dokument oder Wiki?


17
2017-08-09 03:30


Ursprung


Antworten:


Es ist eine Kombination von Boyer-Moore und Horspool.

Sie können den C-Code anzeigen Hier:

Schnelle Suche / Zählung Implementierung, basierend auf einer Mischung aus Boyer-Moore und Horspool, mit ein paar mehr Schnickschnack an der Spitze. Für etwas mehr Hintergrund, siehe: http://effbot.org/zone/stringlib.htm.

Aus dem obigen Link:

Beim Entwurf des neuen Algorithmus habe ich die folgenden Einschränkungen verwendet:

  • sollte schneller sein als der aktuelle Brute-Force-Algorithmus für alle Testfälle (basierend auf dem echten Code), einschließlich Jim Hugunins Worst-Case-Test
  • kleiner Setup-Overhead; keine dynamische Zuordnung im schnellen Pfad (O (m) für Geschwindigkeit, O (1) für Speicherung)
  • sublineares Suchverhalten in guten Fällen (O (n / m))
  • nicht schlechter als der aktuelle Algorithmus im schlechtesten Fall (O (nm))
  • sollte sowohl für 8-Bit-Strings als auch für 16-Bit- oder 32-Bit-Unicode-Strings funktionieren (keine O (σ) -Abhängigkeiten)
  • viele Suchen im echten Leben sollten gut sein, nur wenige sollten im schlimmsten Fall sein   einigermaßen einfache Implementierung

20
2017-08-09 03:34