0 Daumen
306 Aufrufe

Frage:

Ich möchte die Laufzeit dieses Algorithmus berechnen.

Code:

i=n;

while (i>1) {
j = i;
 while(j < n) {
   j = 2*j;
}
 i -= 1;
}
Avatar von

1 Antwort

0 Daumen

Antwort mit KI erzeugt

Analyse der Laufzeit des gegebenen Algorithmus in Theta-Notation

Um die Laufzeit des gegebenen Algorithmus zu analysieren, betrachten wir die beiden ineinander verschachtelten Schleifen und analysieren, wie oft sie ausgeführt werden.

Der äußere while-Schleifenblock lautet:
cpp
i = n;

while (i > 1) {
   j = i;
   while(j < n) {
      j = 2*j;
   }
   i -= 1;
}


Äußere Schleife
Die äußere Schleife beginnt mit \( i = n \) und reduziert \( i \) in jedem Schritt um 1, bis \( i \) größer als 1 ist. Daher wird die äußere Schleife \((n-1)\) mal durchlaufen.

Innere Schleife
Innerhalb der äußeren Schleife wird eine zweite Schleife definiert mit \( j = i \):

cpp
j = i;
while(j < n) {
   j = 2*j;
}


Diese innere Schleife verdoppelt \( j \) in jedem Schritt, solange \( j < n \) ist. Um die Anzahl der Durchläufe zu berechnen, bestimmen wir nach wie vielen Iterationen \( j \) mindestens \( n \) erreicht.

Wenn \( j \) initial \( i \) ist:
- Nach dem ersten Durchlauf: \( j = 2i \)
- Nach dem zweiten Durchlauf: \( j = 4i \)
- Nach dem \( k \)-ten Durchlauf: \( j = 2^k \cdot i \)

Die Schleife wird beendet, wenn:
\( 2^k \cdot i \geq n \)

Wir müssen \( k \) berechnen:
\( 2^k \cdot i \geq n \)
\( 2^k \geq \frac{n}{i} \)
\( k \geq \log_2{\left(\frac{n}{i}\right)} \)

Daher hängt die Anzahl der Durchläufe der inneren Schleife logarithmisch von \( \frac{n}{i} \) ab.

Gesamtzahl der Iterationen
Für das gesamte Programm können wir nun die Anzahl der Iterationen der innere Schleife in Bezug auf die äußere Schleife summieren. Summieren der Anzahl der Iterationen über alle \( i \) von \( i = n \) bis \( i = 2 \):

\( \sum_{i=2}^{n} \log_2{\left(\frac{n}{i}\right)} \)

Die Summe \( \sum_{i=2}^{n} \log_2{\left(\frac{n}{i}\right)} \) ist schwer zu berechnen, aber wir können eine Abschätzung machen. Wir wissen, dass \(\log_2{\left(\frac{n}{i}\right)}\) höchstens \(\log_2{n}\) ist. Für große \( n \) kann diese Summe näherungsweise als \( n \log_2{n} - (\log_2(2) + \log_2(3) + \cdots + \log_2(n)) \) geschrieben werden.

Da \(\log_2(i)\) eine Harmonic-Reihe ist, kann sie näherungsweise als \(\log{n!}\) dargestellt werden:

\( \log_2(n!) \approx n \log_2{n} - n + O(\log_2{n}) \)

Hier spielt das \( n \log_2{n} \) die dominierende Rolle für große \( n \).

Ergebnis
Durch diese Abschätzung haben wir gezeigt, dass die Laufzeit des Algorithmus wesentlich durch \( \log_2{\left(\frac{n}{i}\right)}\) in der inneren Schleife dominiert wird und ungefähr durch \( i = n \) Anzahlen in der äußeren Schleife mal Zahl der logarithmischen Ausführungen bestimmt wird. Somit ergibt sich:

\( \theta(n \log{n}) \)

Die Laufzeit des Algorithmus in Theta-Notation ist \(\theta(n \log{n})\).
Avatar von

Ein anderes Problem?

Stell deine Frage

Ähnliche Fragen

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community