Mein String ist vom Typ "abacsdsdvvsg"
oder "a a a a a a a"
Und ich benutze String[] stringArray = s.split("");
oder String[] stringArray = s.split(" ");
ich frage mich, wie komplex (in O(string length)
) für die obige Aufteilung wäre?
PS: Ich weiß, wie man O (...) berechnet, wenn Code angegeben wird. Hier kenne ich den Algorithmus der Split-Funktion nicht.
8
Antworten:
Die Komplexität hängt von der Regex ab, mit der Sie die Aufteilung durchführen. (Ja, das Argument, das Sie String.split (...) geben, ist ein regulärer Ausdruck!)
Für Ihr Beispiel wird es ,
O(N)
wennN
die Anzahl der Zeichen in der Eingabe String ist.Der Split-Algorithmus ist ziemlich einfach und basiert auf einer vorhandenen Regex-Implementierung. Eine allgemeine Beschreibung lautet:
Matcher.find(...)
diese Option , um die nächste Wortgrenze zu findenDie Suche nach den Unterbrechungen zwischen "Wörtern"
O(N)
ist je nach Regex (demfind
Aufruf) oder komplexer . Die Erstellung der Liste, des Ergebnisarrays und der Teilzeichenfolgen erfolgtO(N)
im schlimmsten Fall.Die genauen Details finden Sie im Quellcode, den Sie über Google finden. (Suchen Sie nach einer
"java.lang.String" source
, wählen Sie eine aus und führen Sie einen Drilldown zu der Java-Version durch, an der Sie interessiert sind. Oder durchsuchen Sie die Dateien in der ZIP-Datei des Quellcodes, die in Ihrer JDK-Installation enthalten ist.)quelle
Es ist O (n) in Ihren speziellen Fällen, in denen Sie durch Trennzeichen mit einer Länge von 1/0 Zeichen teilen. Im Allgemeinen ist es O (n + k) mit einem k-Zeichen-Trennzeichen, das mit dem KMP-Algorithmus implementiert werden kann. Java String Split akzeptiert auch reguläre Ausdrücke als Trennzeichen. In diesem Fall hängt die Komplexität vom verwendeten Matching-Algorithmus ab. Ein üblicher Regex-Matching-Algorithmus ist der Thompson NFA-Algorithmus.
quelle