Laufzeit einer Prozedur

Neue Frage »

OhneWitz Auf diesen Beitrag antworten »
Laufzeit einer Prozedur
Folgende Aufgabe:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
// Laufzeit als Anzahl des Print-Befehls
public static void nichts(int n)
{
    for(int i=1; i<=n-1; i++)
        for(int j=i+1; j<=n; j++)
            for(int k=1; k<=j; k++)
                System.out.println("nichts");
}


Hinweis:
Es gilt:

Schreiben Sie ein Test-Programm und bestimmen Sie die Anzahl der Print-Befehle für n = 1,2,3,4,... Wie lautet die allgemeine Summenformel?

Ergebnisse des Testprogramms:
n=0 count=0
n=1 count=0
n=2 count=2
n=3 count=8
n=4 count=20
n=5 count=40
n=6 count=70
n=7 count=112
n=8 count=168
n=9 count=240
n=10 count=330

Mein Lösungsversuch

Also für die äußeren beiden Schleifen sollte gelten:


und für das gesamte Konstrukt dachte ich mir, müsste dann innerhalb der Summenformel nochmal ne Summe kommen:


Das Ganze hab ich dann erstmal auseinander gezogen:


Und anschließend die beiden Summenformeln eingesetzt + ausmultipliziert:


Und dann kam ich am Ende auf:


Wenn man das allerdings zum testen durchrechnet, kommt man auf falsche Ergebnisse. (z.B. mit n=5 = 200/12, wobei 40 rauskommen sollte)

War mein Ansatz schon komplett falsch oder hab ich irgendwo beim Rechnen Fehler gemacht?
Abakus Auf diesen Beitrag antworten »
RE: Laufzeit einer Prozedur
Zitat:
Original von OhneWitz
Also für die äußeren beiden Schleifen sollte gelten:


Hallo,

was genau soll hier gelten, du schreibst nur eine Summe hin und sonst nichts?

Wenn das die Zahl der Prints sein soll, stimmt das nicht jedenfalls. Wenn es die Anzahl der Durchläufe der beiden äußeren Schleifen sein soll, brauchst du vielleicht eine Doppelsumme.

(Wieso muss der Leser eigentlich raten, was du genau meinst?)

Grüße Abakus smile
OhneWitz Auf diesen Beitrag antworten »
RE: Laufzeit einer Prozedur
Zitat:
Original von Abakus
Zitat:
Original von OhneWitz
Also für die äußeren beiden Schleifen sollte gelten:


Hallo,

was genau soll hier gelten, du schreibst nur eine Summe hin und sonst nichts?

Wenn das die Zahl der Prints sein soll, stimmt das nicht jedenfalls. Wenn es die Anzahl der Durchläufe der beiden äußeren Schleifen sein soll, brauchst du vielleicht eine Doppelsumme.


Also als Erklärung dazu. Ich habe vorher eine andere Aufgabe bearbeitet gehabt.

code:
1:
2:
3:
4:
5:
for(int i=n; i>0; i--)
    for(int j=i; j<n; j++)
        count++;


Hierbei war das Ergebnis für die count-Inkrementierungen:


Wenn man nun diese Aufgabe mit der oberen Aufgabe vergleicht, also:
code:
1:
2:
3:
4:
5:
6:
for(int i=1; i<=n-1; i++)
        for(int j=i+1; j<=n; j++)
            for(int k=1; k<=j; k++)
                System.out.println("nichts");


Fällt einem auf, dass zwar bei den beiden äußeren Schleifen ein wenig anders gezählt wird, aber die äußerste Schleife ebenfalls n-1 mal durchlaufen wird, und wenn das "count++;" in der 2. Schleife stehen würde, würde man ebenfalls aufs gleiche Ergebnis kommen, also:



An dieser Stelle, wo bei der anderen Aufgabe das count war, steht ja aber nun noch eine weitere Schleife. Weshalb ich annehme, dass man über folgendes Konstrukt an die Anzahl der Print-Befehle kommt:



Zitat:


(Wieso muss der Leser eigentlich raten, was du genau meinst?)

Grüße Abakus smile


Dies war selbstverständlich keine Absicht. Betriebsblindheit: Wenn man stundenlang an so ner Aufgabe gesessen hat, nimmt man manche Sachen einfach als selbstverständlich hin, wo für eine außenstehende Person dann der Bezug fehlt.

Ich hatte jedenfalls versucht, die Situation so genau wie möglich zu beschreiben.
Abakus Auf diesen Beitrag antworten »
RE: Laufzeit einer Prozedur
Zitat:
Original von OhneWitz
Also als Erklärung dazu. Ich habe vorher eine andere Aufgabe bearbeitet gehabt.

code:
1:
2:
3:
4:
5:
for(int i=n; i>0; i--)
    for(int j=i; j<n; j++)
        count++;


Hierbei war das Ergebnis für die count-Inkrementierungen:


Also von hier stammt die Formel dann, ok.

Wenn wir annehmen, ist also. Letzteres ist ein einfacherer Ausdruck für deine Summe (stimmt soweit).

Mein Ansatz zu den 3 Schleifen wäre von innen nach außen vorzugehen und das jeweils als Summe zu schreiben:



Das wird jetzt nacheinander ausgerechnet:









Letzteres ist dann noch sauber weiter zu rechnen... dein Ansatz sieht ähnlich, aber doch anders aus.

Grüße Abakus smile
OhneWitz Auf diesen Beitrag antworten »

Vielen Dank schonmal. Ich schau mir das morgen früh genauer an. Hab für heute genug davon. smile

Schönen Abend! smile
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »