Ich analysiere einige Laufzeiten verschiedener For-Loops, und wenn ich mehr Wissen bekomme, bin ich neugierig, dieses Problem zu verstehen, das ich noch nicht herausgefunden habe. Ich habe diese Übung mit dem Titel "Wie viele Sterne werden gedruckt":
for (int i = N; i > 1; i = i/2) System.out.println("*");
Die Antworten zur Auswahl sind
A: ~log N
B: ~N
C: ~N log N
D: ~0.5N^2
Die Antwort sollte also A sein und ich stimme dem zu, aber auf der anderen Seite. Sagen wir, N = 500
was wäre Log N
dann? Es wäre 2.7. Was ist, wenn wir das N=500
bei unserer obigen Übung sagen ? Das würde definitiv mehr als 2,7 Sterne drucken? Wie hängt das zusammen?
Weil es Sinn macht zu sagen, wenn die for-Schleife so aussah:
for (int i = 0; i < N; i++)
es würde N
Sterne drucken .
Ich hoffe, hier eine Erklärung dafür zu finden, vielleicht interpretiere ich all diese Dinge falsch und denke schlecht darüber nach. Danke im Voraus.
quelle
i = i/2
die Basis zwei ist , weil die Schleife durch zwei wiederholte Multiplikation rückwärts fährt.Antworten:
Sie haben das Schlüsselmerkmal der Logarithmusbasis übersehen .
Da
i
in jeder Iteration durch 2 geteilt wird, ist die Laufzeit mit Basis 2 logarithmischWas Sie sehen, ist
(Logarithmus mit Basis 10)
Der Grund, warum die Basis in Laufzeitdiskussionen häufig weggelassen wird (und Ihr Rechner wahrscheinlich keine Schaltfläche für Protokoll 2 hat ), ist, dass aufgrund der Mechanismen der logarithmischen Mathematik eine andere Basis einem konstanten Faktor entspricht und somit ist nicht relevant, wenn Sie ohnehin konstante Faktoren ignorieren. Es kann leicht berechnet werden:
quelle
Zusätzlich zu Michael Borgwardts Antwort sollte das Tilde-Zeichen vor jeder Antwort als "proportional zu" gelesen werden. Wenn Sie also N verdoppeln (z. B. von 500 auf 1000), sehen Sie, dass sich die Laufzeit (oder in diesem Fall die Anzahl der gedruckten Sterne) um einen Faktor erhöht, der gleich (log1000 / log 500) ist. welche unabhängig von welcher Basis Sie verwenden.
quelle
~
ist eine Abkürzung für≅
.∝
Symbol nicht~
! Das~
wird verwendet, um Äquivalenzrelationen oder ungefähre Gleichungen anzuzeigen (siehe Wikipedia-Seite über Tilde ).