Laufzeitkomplexität in der O-Notation

the snake II

Erfahrenes Mitglied
Ich brauche Hilfe bei folgender Übungsaufgabe:


Bestimmen Sie die Laufzeitkomplexität der folgenden Funktion bar nur in Abhängigkeit von der Eingabegröße n in Form der O-Notation, wenn die Funktion foo(i,j,n) bei jedem aufruf 2j Schritte braucht. Betrachten Sie m als Konstante.

Tipp:

latex2png.png

Code:
int bar (int m, int n) {
	int i, j;
	for (i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
		{
			foo(i,j,n);
		} 
	}
}

Die Anzahl der Durchläufe der äußeren for-Schleife ist unabhängig von der Eingabegröße. Also O(1)...?
Die Anzahl der Durchläufe der inneren Schleife ist proportional zu n. Also O(n)...?
Das Ergebnis ist dann: O(1) * O(n) * ?

Was zeigt mir der Tipp? Und wie rechne ich alles zusammen?


Mit vielem Dank im Vorraus,

André
 
Hallo André,

deine bisherige Analyse sieht mir schon korrekt aus. O(1) Durchläufe der äußeren Schleife, O(n) Durchläufe der inneren Schleife. Die innere Schleife benötigt pro Durchlauf 2j Schritte, wobei j der Schleifenzähler ist. j nimmt nacheinander die Werte 0, 1, …, n-1 an. Insgesamt benötigen alle Aufrufe von foo also ?j=0n-1 2j Schritte. Mit dem gegebenen Tipp solltest du den Rest schaffen.

Grüße,
Matthias
 
Hallo André,

deine Rechnung kann so nicht stimmen. Du kannst das O(n) in deinem Ansatz nicht einfach unter den Tisch fallen lassen. O(n*2n) ? O(2n)!

Ich hab dir die Summe der Schritte in der inneren Schleife doch schon hingeschrieben. Die müsstest du jetzt (mit dem gegebenen Tipp) nur noch umformen und dann argumentieren, wieso das dann asymptotisch schon die Gesamtanzahl der Schritte ist.

Grüße,
Matthias
 

Neue Beiträge

Zurück