Sie müssen wirklich in Implementierungsdetails nach einer vollständigen Antwort suchen. Aber zu Beginn gibt es V8 runtime-strings.cc und builtins-string-gen.cc. Es ist ein tiefer Tauchgang - und ich kenne C++ nicht, also bin ich mir nicht ganz sicher, ob ich überhaupt die richtigen Dateien anschaue, aber sie scheinen je nach Größe der Nadel und Tiefe unterschiedlich zu sein Rekursion benötigt, um einen Suchbaum zu erstellen.
beispielsweise in builtins-string-gen.cc ein Block unter ES6 #sec-string.prototype.replace
es, dass, wenn überprüft die search_string
mit einer Länge von 1 hat, und wenn die subject_string
Länge größer ist als 255 (0xFF
). Wenn diese Bedingungen wahr sind, sieht es aus wie Runtime_StringReplaceOneCharWithString
in runtime-strings.cc wird aufgerufen, die wiederum versuchen, StringReplaceOneCharWithString
zuerst mit einem Baum-traversable subject_string
aufrufen.
Wenn diese Suche das Rekursionslimit erreicht, führt die Laufzeitumgebung einen weiteren Aufruf an StringReplaceOneCharWithString
, aber dieses Mal mit einem abgeflachten subject_string
.
Also, meine teilweise begründete Vermutung hier ist, dass Sie immer eine Art linearer Zeit betrachten. Möglicherweise O (mn) wenn Sie das Rekursionslimit erreichen und eine naive Nachfolge-Suche durchführen. Ich weiß nicht sicher, dass es eine naive Suche ist, aber eine abgeflachte Zeichenfolge bedeutet für mich, dass ich Schritt für Schritt die subject_string
statt durch einen Suchbaum durchquere.
Und möglicherweise etwas weniger als O (mn), wenn der Baum-Traversal nicht die Rekursion Grenze nicht getroffen, obwohl ich nicht ganz sicher bin, was sie gewinnen durch die subject_string
rekursiv zu Fuß.
Für eine tatsächliche was die Zeitkomplexität Implementierungen für Javascript ist, werden Sie wahrscheinlich die Laufzeit Devs direkt oder sehen fragen, ob, was sie tun, wie andere string searching algorithms ist, um herauszufinden, welche Fälle in welcher Zeit laufen Komplexität.
Sind Sie sicher, dass der Rückgabewert von 'str.replace (" Hi ")'? –
Die Definition ist 'string.replace (searchvalue, newvalue)' –
Entschuldigung, ich habe es gerade bearbeitet @ ibrahimmahrir –