Mir wurde gesagt, dass Code wie zum Beispiel:In Java, für eine Zeichenfolge x, was sind die Laufzeitkosten von s.length()? Ist es O (1) oder O (n)?
for (int i = 0; i < x.length(); i++) {
// blah
}
ist eigentlich O (n^2) wegen der wiederholten Aufrufe von x.length()
. Stattdessen sollte ich verwenden:
int l = x.length();
for (int i = 0; i < l; i++) {
// blah
}
Ist das wahr? Ist die Stringlänge als privates Ganzzahlattribut der String-Klasse gespeichert? Oder läuft String.length()
wirklich die ganze Saite, nur um ihre Länge zu bestimmen?
Auch wenn die Länge der Zeichenfolge O (n) ist, wäre die Gesamtkomplexität immer noch nicht O (n^2). Die Länge wird einmal berechnet und als Grenzwert in der for-Schleife verwendet. Sie wird nicht bei jeder Iteration berechnet. –
Soweit ich weiß, werden Grenzwerte nicht zwischengespeichert. Was wäre, wenn die Grenze in der Schleife geändert würde? –
Die Grenze wird jedes Mal berechnet. Denken Sie daran, dass die Prüfung der for-Schleife nur ein beliebiger Ausdruck ist. Der Compiler kümmert sich nicht wirklich darum, was da drin ist und kann keine Annahmen machen. Sie könnten leicht eine Methode aufrufen, die jedes Mal etwas anderes zurückgibt. – Herms