Was ist die zeitliche Komplexität der String#substring()
Methode in Java?
quelle
Was ist die zeitliche Komplexität der String#substring()
Methode in Java?
Neue Antwort
Ab Update 6 in Java 7 Lebzeiten das Verhalten substring
geändert , um eine Kopie zu erstellen - so dass jeder String
auf eine bezieht , char[]
die sich nicht mit einem anderen Objekt geteilt, soweit mir bekannt ist . Zu diesem Zeitpunkt substring()
wurde also eine O (n) -Operation, bei der n die Zahlen in der Teilzeichenfolge sind.
Alte Antwort: vor Java 7
Undokumentiert - aber in der Praxis O (1), wenn Sie davon ausgehen, dass keine Speicherbereinigung erforderlich ist usw.
Es wird einfach ein neues String
Objekt erstellt, das sich auf denselben Basiswert bezieht, char[]
jedoch unterschiedliche Offset- und Zählwerte aufweist. Die Kosten sind also die Zeit, die benötigt wird, um die Validierung durchzuführen und ein einzelnes neues (relativ kleines) Objekt zu erstellen. Das ist O (1), soweit es sinnvoll ist, über die Komplexität von Vorgängen zu sprechen, die je nach Speicherbereinigung, CPU-Caches usw. zeitlich variieren können. Insbesondere hängt dies nicht direkt von der Länge der ursprünglichen Zeichenfolge oder des Teilstrings ab .
In älteren Java-Versionen war es O (1) - wie Jon sagte, wurde gerade ein neuer String mit demselben zugrunde liegenden Zeichen [] und einem anderen Versatz und einer anderen Länge erstellt.
Dies hat sich jedoch tatsächlich geändert, beginnend mit Java 7 Update 6.
Die char [] -Freigabe wurde entfernt und die Felder Versatz und Länge wurden entfernt. substring () kopiert jetzt nur alle Zeichen in einen neuen String.
Ergo ist der Teilstring in Java 7 Update 6 O (n)
quelle
char[]
...Es ist jetzt lineare Komplexität. Dies erfolgt nach Behebung eines Speicherverlustproblems für Teilzeichenfolgen.
Denken Sie also ab Java 1.7.0_06 daran, dass String.substring jetzt eine lineare Komplexität anstelle einer konstanten hat.
quelle
Hinzufügen von Beweisen zu Jons Antwort. Ich hatte den gleichen Zweifel und wollte überprüfen, ob die Länge der Zeichenfolge Auswirkungen auf die Teilzeichenfolgenfunktion hat. Der folgende Code wurde geschrieben, um zu überprüfen, von welchem Parameter Teilzeichenfolge tatsächlich abhängt.
Die Ausgabe bei der Ausführung in Java 8 lautet:
Der Nachweis der Teilzeichenfolgenfunktion hängt von der Länge der angeforderten Teilzeichenfolge ab, nicht von der Länge der Zeichenfolge.
quelle
O (1) Da die ursprüngliche Zeichenfolge nicht kopiert wird, wird lediglich ein neues Wrapper-Objekt mit unterschiedlichen Versatzinformationen erstellt.
quelle
Überzeugen Sie sich selbst davon, aber Javas Leistungsnachteile liegen woanders, nicht hier in der Teilzeichenfolge eines Strings. Code:
Ausgabe:
Ob es O (1) ist oder nicht, hängt davon ab. Wenn Sie nur auf denselben String im Speicher verweisen , stellen Sie sich einen sehr langen String vor. Sie erstellen einen Teilstring und beenden den Verweis auf einen langen String. Wäre es nicht schön, Speicher für lange Zeit freizugeben?
quelle
Vor Java 1.7.0_06: O (1).
Nach Java 1.7.0_06: O (n). Dies wurde aufgrund eines Speicherverlusts geändert. Nachdem die Felder
offset
undcount
aus String entfernt wurden, wurde die Teilstring Implementierung O (n).Weitere Informationen finden Sie unter: http://java-performance.info/changes-to-string-java-1-7-0_06/
quelle