Schleifen & O Notation

Xpisto

Aktives Mitglied
Hey Leute, ich hab einfach ein enormes Problem aus gegebenen Programmcodes die O Notation zu bestimmen, hat einer einen Tipp woran ich erkenne welche Zeitkomplexität der gegebene Programmteil besitzt? ich wäre euch überaus dankbar.

Z.b

Java:
 O-Notation in 
Abhängigkeit von der Eingabegröße n. Hinweis: Der Aufwand für die Initialisierung von 
arr kann dabei vernachlässigt werden. 
   
static int[][][] func(int n) 
{ 
     int[][][] arr = new int[n][n][n]; 
        for(int i=1; i<3; i++) 
         { 
             for(int j=0; j<arr.length; j++) 
             { 
                  for(int k=0; k<arr.length; k++) 
                  { 
                   arr[i][j][k] = n; 
                     } 
             } 
         } 
return arr; 
}

Laut Lösung wäre das O(n²) Irgendwo auch nachvollziehbar, aber mir fehlt halt das verständnis von alleine drauf zu kommen, wie komme ich denn auf sowas?

Würd mich echt freuen wenn mir jemand einen tipp gibt, ich hab echt keine ahnung wie ich eine allegemeine faustregel aufstellen kann. Ich mach das eher nach gefühl, aber da muss es doch was geben was bombensicher ist.
 

njans

Top Contributor
Java:
      for(int i=1; i<3; i++)  // 3 mal das Ganze
         { 
             for(int j=0; j<arr.length; j++) // n mal das Ganze
             { 
                  for(int k=0; k<arr.length; k++)  // n mal das Ganze

Daraus ergibt sich O(3*n*n) = O(3n²) = O(n²)
 

Xpisto

Aktives Mitglied
Ok dass lässt sich schon gut nachvollziehen, hier hätte ich z.b. ein O(log (n)) wie kommt das zu stande?

for(i=1; i<n; i*=2)
System.out.println(i);



Oder sowas hier

for(i=1; i<n; i++)
System.out.println(i);
for(i=n; i>0; i--);
System.out.println(i);

Das ergebnis ist O(n) aber ich würde sagen O(n²)..... Begründung: Erste schleife läuft n male und zweite ist auch abhängig von n, das n gibt die startgröße an und somit auch die anzahl der durchläufe.


Ich bin echt zu blöd :( Und dabei ist es auch so wichtig für die kommende klausur.
 
Zuletzt bearbeitet:

XHelp

Top Contributor
eq.latex
gibt an, wie oft du n durch 2 teilen kannst. Da
eq.latex
und log(2) eine konstante ist, kannst du bei O-Notationen auf die Basis nicht achten

P.S. log(n) gibt auch an wie viele Stellen die Binärdarstellung von n brauchen würde.
 
G

gassst

Gast
for(i=1; i<n; i++)
System.out.println(i);
for(i=n; i>0; i--);
System.out.println(i);

Das ergebnis ist O(n) aber ich würde sagen O(n²)..... Begründung: Erste schleife läuft n male und zweite ist auch abhängig von n, das n gibt die startgröße an und somit auch die anzahl der durchläufe.

Und wo kommst du da auf n^2 ? Warum gehst du nicht einfach vor und zählst die Iterationen (oder führst den Code aus und zählst die prinln()s), wie ich gesagt hab:
für n = 10 wird die erste Schleife 10 mal durchlaufen, die zweite Schleife 10 mal, also insgesamt 20 mal (O(n)), nicht 100 mal (O(n^2))
 

Xpisto

Aktives Mitglied
Was meinst du genau mit iterationen? Sry ich bin nicht so gut in Java. Das mit dem zählen ist keine schlechte idee, nur eins versteh ich nicht so recht vllt brauch ich ncoh ein zwei denkanstöße bevor es klick macht, wenn du sagst n= 10 udn es kommt 20, ach schwer zu beschreiben was ich meine.... Das 10*10 = 100 und n² nicht mehr klappt hab ich jetzt auch verstanden, hast du ein anderes beispiel was mir vllt die augen öffnet?

Vllt 2^n oder n³.

Ich versuchs wirklich nachzuvollziehen und streng mich an ^^

Danke schonmal für die netten Tipps von euch allen!
 

HoaX

Top Contributor
Wenn die Schleifen geschachtelt sind, dann wird multipliziert. Sind die Schleifen sequenziell(nacheinander) dann addiert:

Pseudocode:
Code:
//Zwei mal geschachtelt, O(n) * O(n) = O(n²)
for(0..n) {
    for(0..n) {
        machWas();
    }
}

Code:
//Zwei mal geschachtelt, O(n) * O(n/2) = O(n²/2) = O(n²)
for(0..n) {
    for(0..(n/2)) {
        machWas();
    }
}

Code:
//Genauso wie zuvor O(n²)
for(0..n) {
    for(0..(n/2)) {
        machWas();
    }
}

// Hier nochmal O(n)
for(0..n) {
    machNochWasAnderes();
}

// Zusammen dann O(n²) + O(n) = O(n² + n) = O(n²)

Ansonsten bring du doch noch ein Beispiel und schreib dazu bei welcher Zeile du welchen Schluss ziehst, also + oder * und auf was du kommst.
 

Xpisto

Aktives Mitglied
Danke schonmal für deine Hilfe, ich hab hier ein paar Beispiele und meien Lösungen, bitte nicht zu streng sein :)

Java:
public static void eins(int n) 
  { 
    int i = 1; 
    while (i < n) 
    { 
      System.out.println(i); 
      i = i * 2; 
    } 
  } 

/*
Schau mal:

n=10;  dann kommen folgende println raus 2,4,8,16

O(n/2 - 1) = O(n)  richtig begründet oder zufalltreffer oder gar nicht richtig?
*/
   
  public static void zwei(int n) 
  { 
    int i = 1; 
    while (i < n) 
    { 
      for (int j = 1; j <= 10; j++) 
        System.out.println(j); 
      i = i + 2; 
    } 
  } 

/* O(n) mit der begründung die whileschleife wird O(n-1) = O(n) und die for lassen wir aussen vor, da keine beziehung zu n vorhanden ist (Vorfaktor?)*/
   
  public static void drei (int n) 
  { 
    int i = 1; 
    while (i < n) 
    { 
      for (int j = 1; j <= i; j++) 
        System.out.println(j); 
      i = i + 2; 
    } 
  } 

/* fällt mir nichts zu ein.....*/

void proz1(int n) 
{ 
    int k=0; 
    int p=0;  
 
    while (p != n) 
    {   
       if(p < 7) 
       {    
          k++; 
       } 
 
       while (k > 7) 
       {   
          k--; 
       } 
       p++; 
   } 
} 
 
/*Aufrufe sind bei n=5 --> 1.Durchlauf k=1,p=1| 2.Durch k=2,p=2 | 3.D k=3,p=3 | 4.D k=4,p=4 | 5.D k=5, p=5   somit bei n=5 ; 5 Aufrufe also O(n)*/
 
 void proz2(int n) 
{ 
    int k=1; 
    int p=1;  
 
    while (p < n) 
    { 
       while(k < n) 
       {    
          k = 2 * k; 
       } 
       p++; 
    } 
} 

/*hier hab ich bei n=5 folgende aufrufe --> 4 mal wird die erste whileschleife aufgerufen und 3 mal die zweite whileschleife, beide sind von n abhängig also insgesamt wurden 7 aufrufe getätigt..... 
Ich versuch irgendwie versuchen das zu rechnen z.b für n 5 bei n² = 25 wir haben 7 aufrufe also nein dann kann ich alle n hoch 3-4 ausschliessen wenn ² schon nicht geht... ich find keinen vernünftigen Ansatz dazu...*/

public long func(int n) 
{ 
    long l = 0; 
    for(int i=0; i<10000; i++) 
    { 
        for(int j=0; j<n; j++) 
        { 
            for(int k=1; k<n; k++) 
            { 
                l++; 
            } 
        } 
    } 
    return l; 
} 

/*hier würde ich einfach O(n²) sagen weil die erste schleife nicht abhängig von n ist, also ist das ein vorfaktor, die zweiteschleife wird n mal durchlaufen n-1 mal durchlaufen also O(n*n-1) = O(n²) hab ich das richtig erklärt?*/


Danke dass du mir hilfts :)
 

HoaX

Top Contributor
Code:
public static void eins(int n) 
  { 
    int i = 1; 
    while (i < n) 
    { 
      System.out.println(i); 
      i = i * 2; 
    } 
  } 
/*
Schau mal:
 
n=10;  dann kommen folgende println raus 2,4,8,16
 
O(n/2 - 1) = O(n)  richtig begründet oder zufalltreffer oder gar nicht richtig?
*/
Nö, erstens: Wieso 2,4,8,16? wenn n=10 ist, wie soll dann 16 ausgegeben werden? Es wird 1,2,4,8 ausgegeben!
Noch wäre deine Formel korrekt, aber nimm doch mal n=20, dann kommt nämlich 1,2,4,8,16 ... also falsche Formel.
Du verdoppelst ja immer die Zahl, also muss man überlegen wie oft man n durch 2 teilen kann -> O(log2(n))



Weiter gehts...
Code:
  public static void zwei(int n) 
  { 
    int i = 1; 
    while (i < n) 
    { 
      for (int j = 1; j <= 10; j++) 
        System.out.println(j); 
      i = i + 2; 
    } 
  } 
 
/* O(n) mit der begründung die whileschleife wird O(n-1) = O(n) und die for lassen wir aussen vor, da keine beziehung zu n vorhanden ist (Vorfaktor?)*/
Jein, O(n) stimmt, aber: die while-Schleife läuft n/2, da du ja immer +2 machst, die for-Schleife läuft immer 10 mal, also O(n/2) * O(10) = O(n)
 
Zuletzt bearbeitet:

Xpisto

Aktives Mitglied
Ich sitz hier mit dem kollegen und wir sind wirklich am verzweifeln, ich versteh es nicht ..... Ich möcht dich auch ungern damit nerven, aber du bist derzeit unsere einzige hoffnung ^^

Vorab, wie siehts denn mit den andewren as, total daneben oider was brauchbares dabei?

Wieso ist dir so klar dass du n/2 teilen muss, woraus ewird das ersichtlich? Also du sagst j das so selbstverständlich und ich kanns nicht nachvollziehen, das demotivert mich echt :( Bin ich zu blöd oder hab ich irgendwo eine lücke? Das mit der ausgabe hast recht, hab mich vertan aber eher wegen flüchtigkeit als wegen mangelden verständnis.
 

HoaX

Top Contributor
Wieso ist dir so klar dass du n/2 teilen muss, woraus ewird das ersichtlich? Also du sagst j das so selbstverständlich und ich kanns nicht nachvollziehen, das demotivert mich echt :( Bin ich zu blöd oder hab ich irgendwo eine lücke? Das mit der ausgabe hast recht, hab mich vertan aber eher wegen flüchtigkeit als wegen mangelden verständnis.
Das sind halt Mathegrundlagen: Deine Methode multipliziert immer *2 bis das Ergebnis x > n ist. Als Potenz ausgedrückt 2 hoch x > n. Und x ist deine gesuchte Anzahl durchläuft, dein O. Umgedreht kannst du dich auch fragen wie oft muss ich n durch 2 teilen, bis es 1 ist. Die Anzahl der Schritte bleibt gleich. Und um 2 hoch x = n nach x aufzulösen schreibt man x = log2(n).
 

HimBromBeere

Top Contributor
Bei der O-Notation interessiert dich grundsätzlich nur die höchste Potenz von n (=Anzahl sich widerholender gleicher Schritte). D.h. wenn du sowas hast wie O(n^2 + n -3) ist das einfach die Ordnung O(n^2), weil alle anderen Potenzen halt kaum noch ins Gewicht fallen. Auch etwaige Vorfaktoren sind weitgehend irrelevant (in deinem Fall 3*n^2), wichtig ist meist nur, wie sich die Laufzeit mit steigender Anzahl Schritte funktionell entwickelt.
 
R

Razuer

Gast
Das sind halt Mathegrundlagen: Deine Methode multipliziert immer *2 bis das Ergebnis x > n ist. Als Potenz ausgedrückt 2 hoch x > n. Und x ist deine gesuchte Anzahl durchläuft, dein O. Umgedreht kannst du dich auch fragen wie oft muss ich n durch 2 teilen, bis es 1 ist. Die Anzahl der Schritte bleibt gleich. Und um 2 hoch x = n nach x aufzulösen schreibt man x = log2(n).


Hallo Hoax, auch ich verzweifle irgendwie an deiner Erklärung. Also nicht dass sie falsch wäre nein, nein. Trotzdessen du es eigentlich schon recht ausführlich erklärst hast ergibt sich für mich kein genauer Zusammenhang...

Ziel des ganzen ist ja iwie auf die ONotation zu kommen und trotz genauster Erklärung komm ich nicht drauf klar, inwiefern man auf den LOG kommen kann / bzw. kommen muss wenn man konstant +2 rechnet - warum soll ich mich dann fragen wie oft man durch teilen muss ? und warum kommt da der log raus? könnte sich vll einer der es wirklich gut kann irgendwie für mathedummies erklären :( ? bitte wäre wirklich sehr hilfreich!
 
R

Razuer

Gast
Wenn ich jetzt den vorangegangen Quelltext nehme:

Java:
public static void zwei(int n) 
  { 
    int i = 1; 
    while (i < n) 
    { 
      for (int j = 1; j <= 10; j++) 
        System.out.println(j); 
      i = i + 2; 
    } 
  }

Und ich für n bspw. jetzt den Wert 10 nehme erfolgt der Ablauf wiefolgt:

i=1 >>

while (1<10) [Bedingung erfüllt betritt die while Schleife)

for(int j=1; j<=10; j++)

3= 1+2 (für j=1)
5=3+2 (für j=2)
7=5+2 (für j=3)
9=7+2 (für j=4)
11=9+2 (für j=5)
13=11+2 (für j=6)
..
...
...
21 = 19+2 (für j=10)

die for Schleife wird somit 10 mal ausgeführt. mit der while passiert ja eigentlich nichts mehr. Sie wird das erste mal betreten und gut ist.

Nur wieso kommt man jetzt auf die Idee dass es dann direkt n/2 sein muss? Laut der Begründung von Hoax ist es sofort klar, dass man n/2 rechnen muss! ? das * 10 würde sich für mich noch insofern erklären, da die for Schleife halt 10 mal aufgerufen wird aber warum n/2?

Gibts da irgendwie sone Gegenrechnung wie man auf die n/2 kommen kann? also kann man es irgendwie zurückrechnen, damit es sich irgendwie nachvollziehen lässt?

Auch wenn es euch vielleicht auf die Nerven geht aber es wäre wirklich mehr als nett wenn mir jemand helfen könnte diesen (anscheinend) doch recht simplen Zusammenhang zu erklären :S
 

HoaX

Top Contributor
...
Ziel des ganzen ist ja iwie auf die ONotation zu kommen und trotz genauster Erklärung komm ich nicht drauf klar, inwiefern man auf den LOG kommen kann / bzw. kommen muss wenn man konstant +2 rechnet - warum soll ich mich dann fragen wie oft man durch teilen muss ? und warum kommt da der log raus? könnte sich vll einer der es wirklich gut kann irgendwie für mathedummies erklären :( ? bitte wäre wirklich sehr hilfreich!
Wenn du meine Erklärung nochmal liest, dann siehst du dass da *2 steht, nicht +2!
 

Paddelpirat

Bekanntes Mitglied
@Razuer Ich hab den Eindruck du verstehst den Code nicht ganz richtig. Deswegen setz ich mal zusätzliche geschweifte Klammern rein:

Java:
public static void zwei(int n) 
  { 
    int i = 1; 
    while (i < n) 
    { 
      for (int j = 1; j <= 10; j++) {
        System.out.println(j);
      } 
      i = i + 2; 
    } 
  }

Angenommen n=10. Du kommst in die while-Schleife rein mit i=1 (< 10 erfüllt).
Dann gehst du in die for-Schleife mit j=1 (<=10).
jetzt wird j ausgegeben:
1
2
...
10

Diese 10 Ausgaben sind allerdings nicht von n abhängig, also sind sie in der O-Notation nur als eine Konstante verborgen.
Jetzt ist die for-Schleife fertig und du erhöhst i um 2. Also ist i nun 1+2=3
Dann kommst du wieder oben in der while-Schleife an und überprüfst: 3 < 10 (erfüllt), gehst also in die for-Schleife und so weiter.

So nun ist die while-Schleife aber von n abhängig und du erhöhst i in jedem Durchlauf um 2, also kommst du doppelt so schnell bei n an, als wenn du i in jedem Schritt um 1 erhöhen würdest. Somit hast du dann deine n/2.
 
R

Razuer

Gast
Danke für eure Antworten!

Den Code als solches habe ich wirklich gerade erst vor paar minuten gepeilt ^^

die for schleife an sich wird 10 mal ausgeführt

aber beim fünften durchlauf ist i nicht mehr kleiner n da nämlich 11 nicht < 10 ist soweit leuchtet ein.

also wenn ich n/2 rechne erhalte ich 5 der zusammenhang ist schon einmal hergestellt. problem ist trotzdem die "erkenntnis" also für "euch" ist es ja schon einmal "direkt" klar dass es n/2 sein muss! wenn man etwas +2 macht dass man automatisch durch 2 teilen muss

ich würde jetzt maximal auf n/2 kommen indem ich halt meine werte einsetze und schaue was ich mit den werten von 10 und 5 anfange ... ja 10/5 = 2 hurra ...

man ich weiß einfach nicht wie ich es verständlich beschreiben soll dabei erklärt ihr es ja schon richtig für dumme ^^

ich denke dass mir diese aussage
also kommst du doppelt so schnell bei n an, als wenn du i in jedem Schritt um 1 erhöhen würdest. Somit hast du dann deine n/2.
dann noch am ehesten hilft
 

Paddelpirat

Bekanntes Mitglied
Okay zum besseren Verständnis eine kleine Aufgabe für dich: Schreib mir mal den Code so um, dass du statt der while-Schleife eine weitere for-Schleife hast. Also:

Java:
public static void zwei(int n) 
  { 
    //int i = 1; <----Das brauchst du in dem Fall an dieser Stelle nicht mehr, sondern in der for-Schleife
    for(?;?;?) { //<----Hier geeignete werte einsetzen
    { 
      for (int j = 1; j <= 10; j++) {
        System.out.println(j);
      } 
    } 
  }
 

Xpisto

Aktives Mitglied
Ich sitze gerade mit Razuer an einem Tisch und deshalb poste ich mal die lösung der "aufgabe"^^

Java:
public static void zwei(int n) 
  { 
    //int i = 1; <----Das brauchst du in dem Fall an dieser Stelle nicht mehr, sondern in der for-Schleife
    for(int=1;i<n;i++) { //<----Hier geeignete werte einsetzen
    { 
      for (int j = 1; j <= 10; j++) {
        System.out.println(j);
      } 
    } 
  }
 

Paddelpirat

Bekanntes Mitglied
Fast richtig. Wieso schreibst/t du/ihr nur i++? Ihr erhöht den wert in der while Schleife doch um 2 in jedem Schritt.

Edit: und in dem ersten Term muss
Code:
int i=1
stehen :) (das i fehlt)
 

Paddelpirat

Bekanntes Mitglied
Okay, wenn du das korrigiert hast, kannst du die for-Schleife mal so schreiben, dass du in jedem Schritt i nur um 1 erhöhst. Wie muss dann der mittlere Term der for-Schleife aussehen?
 

Xpisto

Aktives Mitglied
1.Aufgabe 2er Schritte
Java:
public static void zwei(int n) 
  { 
 
    for(int i=1;i<n;i+2) { 
    { 
      for (int j = 1; j <= 10; j++) {
        System.out.println(j);
      } 
    } 
  }

2.Aufgabe 1er Schritte
Java:
public static void zwei(int n) 
  { 

    for(int i=0;i<n;i++) { 
    { 
      for (int j = 1; j <= 10; j++) {
        System.out.println(j);
      } 
    } 
  }


So wenn ich deine Aufgabe richtig verstanden habe ^^
 

AmunRa

Gesperrter Benutzer
Nein zweiter Teil ist nicht richtig ,
da ja jetzt die schleife 10 x ausgeführt wird. und nicht wie zuvor nur 5 mal (spreche von der äusseren Schleife)
 

AmunRa

Gesperrter Benutzer
ja nur du hast den mittleren Term nicht richtig angepasst



(P.S unwichtig: du hast den ersten Term der schleife auch verändert dort sollte noch immer int i = 1 stehen und nicht int i=0)
 

Paddelpirat

Bekanntes Mitglied
Genau genommen sind beide Aufgabenteile noch nicht ganz korrekt. Ich geb mal die Lösung für den ersten Teil an, da es nur eine Kleinigkeit ist:

Java:
public static void zwei(int n) 
  { 
 
    for(int i=1;i<n;i+=2) { //i+=2 bedeutet i=i+2 
    { 
      for (int j = 1; j <= 10; j++) {
        System.out.println(j);
      } 
    } 
  }

Zum zweiten Teil habe ich gesagt, dass insb. der mittlere Term der for-Schleife verändert werden muss, also nochmal :) Denn so wie du es geschrieben hast, liefert die Methode ein anderes Ergebnis als in Aufgabe 1.

Java:
public static void zwei(int n) 
  { 

    for(int i=1;?;i++) { //Hier das Richtige für ? einsetzen.
    { 
      for (int j = 1; j <= 10; j++) {
        System.out.println(j);
      } 
    } 
  }

Edit: Vielleicht solltet ihr auch einfach mal ein kleines TestProgramm schreiben, was die Methode
Code:
zwei
aufruft....
 
Zuletzt bearbeitet:

Xpisto

Aktives Mitglied
Achso du möchtest dass die gleiche Ausgabe erzeugt wird, dann würd ich auf anhioeb sagen

Java:
public static void zwei(int n) 
  { 
 
    for(int i=1;i<=n/2;i++) { //für n=10 wird die for 5 mal aufgerufen
    { 
      for (int j = 1; j <= 10; j++) {
        System.out.println(j);
      } 
    } 
  }
 

XHelp

Top Contributor
Wenn du die Zahl 10 hast und immer +2 rechnest, bis du die Zahl erreichst, dann machst du ja: 10<=2+2+2+2+2, was genau das selbe ist wie 10<=5*2. Die 2 hast du, 10 ist dein n, also musst du es nach 5 umstellen: 10/2<=5; also ist deine Gesuchte Laufzeit: n/2.

Aber ein Tipp, der ernst gemeint ist, aber bis jetzt nicht gefallen ist: nimm es einfach hin! Wenn die entweder die Grundlagen in Programmieren oder Mathematik fehlen, dann musst du die entweder selber nachholen... oder eben die Beispiele auf den 2 Seiten einfach nur auswendig lernen.
Ich nehme mal an das brauchst du für irgendein Fach/Prüfung - da gibt es nur eine kleine Anzahl an "Möglichkeiten", die abgefragt werden.
 

Xpisto

Aktives Mitglied
Ja das Problem mit dem Auswendig lernen ist ja kein problem, zumal wir in unserere prüfung an der uni ein dina 4 blatt als hilfe mitnehmen dürfen. Allerdings erkenne ich aus den verschiedenen Ausfgaben selten parallelen.

Also was wäre jetzt ein programm faustregel log n ?
 

XHelp

Top Contributor
Wenn du von n bis 1 immer
Code:
/x
machst, oder von 1 bin immer
Code:
*x
. Aber "Faustregel" gibt es da nicht.
 

HimBromBeere

Top Contributor
DAS soll O(n3) sein?! Nie im Leben! Wie du siehst, wird die Anzahl der Durchläufe jedes Mal vervierfacht, dabei kommen etwa 20ms Zeit drauf... es ist also ein linearer Anstieg der Laufzeit bei exponentiellem Anstieg der Durchläufe... gib mal einen Tipp ab, worauf das hindeuten könnte...
 

Xpisto

Aktives Mitglied
ich weiss wirklich nicht wie ichs machen soll, wär super wenn du mir das erklärst, weil es könnte morgen in der prüfung eine kleine aufgabe dazu geben aber nur vielleicht!
 

XHelp

Top Contributor
Es gibt nicht so viele Standard-O-Klassen. Rechne doch alle durch, dann wirst du sehen, dass eine Klasse perfekt reinpasst.
 

xKoRe

Mitglied
Bei der O Notation gibt es zwei Unterschiede. Der exakte Aufwand und die Aufwandsklasse. Wobei bei beiden mit der Abhängigkeit von (meist) einer Variable geredet wird.

Standardmässig nennen wir sie mal n.

Hast du also eine Schleife die über n Elemente geht, sprechen wir vom Aufwand x*n (Wobei x die Anzahl der Berechnungen/Aufwände pro durchlauf ist. Was man da alles mitrechnet, hängt in der Regel vom Prüfer oder dem Ziel der Aufwandsberechnung ab.). Die Aufwandsklasse wäre, sofern bei x * n --> x selbst nicht mehr weiter abhängig von n ist: n. D.h. auch 3*n liegt noch in O(n). Hast du ein Konstrukt wie n^3 + n^2 + n gewinnt das Höchste bei der Aufwandsklasse: O(n^3).

Aufwandsklassen (nach Reihenfolge weitesgehend)

log(n)
n
n * log(n)
n^2
n^2
.
.
.
2^n
3^n

etc.

Es gibt Pauschal keine Formel von der ich wüsste mit der du aus einer Berechnung die Aufwandsklasse bestimmst. Das klappt lediglich durch nachdenken und Begründen.

Ein paar Tipps:
logx(n) ist im Prinzip das gegenstück zu x^n --> wächst der Aufwand also exponentiell um den Faktor n, haben wir x^n. Sinkt er um einen n Faktor, logx(n).

d.h. eine Schleife, in der sich beispielsweise die Zählvariable immer verdoppelt bis sie am "Ende" angelangt ist, hätten wir einen logarithmischen Aufwand. (sogar zweierlogarithmus)

Ansonsten gilt noch: Haben wir eine Schleife in einer Schleife, multiplizieren wir deren Aufwand miteinander und erhalten somit den neuen Aufwand.

äussere Schleife n, innere Schleife n^2
--> Zusammen n^3

viel Erfolg
 
G

gaaaaast12341

Gast
Hi, eine frage, folgender Code ist gegeben


Java:
For (int i= 0; i<10*n*n; i+=2)   // 10*n/2*n/2
{

           For(int j=1; j <= 223; j++)    //223
            { 
                   For(int z=1; Z< n*n;z++)   // n^2
                    {  tuwas();
                     }
              }
   }
Muesste doch O(n^4) sein oder?
 

XHelp

Top Contributor
xKoRe, entweder hast du dich falsch ausgedrückt oder ich muss dir widersprechen:
Bei der O-Notation gibt es keinen "exakten Aufwand". Es gibt natürlich eine exakte Laufzeit, aber das hat nichts mehr mit O-Notation zu tun. Darüber hinaus ist O(3n) genau die selbe Menge wie auch O(n), O(n+100), O(n+log(n)) usw.
 

XHelp

Top Contributor
Das alles bezieht sich auf die Aussage mit dem exaktem Aufwand. Da gibt es bei O-Notation kein "entweder ist es das oder das". Das ist alles das selbe.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Fynx_HD Arrays übergeben, Mehrdimensionale Arrays Zeilenabtrennung in schleifen Java Basics - Anfänger-Themen 8
T schleifen Java Basics - Anfänger-Themen 3
Kingdako Wie löse ich eine Mathematische Formel mit Arrays und Schleifen? Java Basics - Anfänger-Themen 32
S Erste Schritte While Schleifen Java Basics - Anfänger-Themen 11
M geschachtelte for-Schleifen - Einmaleins ausgeben Java Basics - Anfänger-Themen 3
Mikejr Schleifen Java Basics - Anfänger-Themen 4
java-starter Erste Schritte Mit While Schleifen Programme schreiben Java Basics - Anfänger-Themen 4
K geschachtelte "for-Schleifen" Java Basics - Anfänger-Themen 3
Alen123 Potenzen in Schleifen Java Basics - Anfänger-Themen 26
Alen123 String wiederholen mit Schleifen Java Basics - Anfänger-Themen 1
A Schleifen und Boolsche Ausdrücke Java Basics - Anfänger-Themen 42
W Schleifen Java Basics - Anfänger-Themen 36
S Interaktive Abfrage, Hilfe mit Schleifen! Java Basics - Anfänger-Themen 6
Mojtaba1986 Hausaufgabe (Schleifen) Java Basics - Anfänger-Themen 33
A Schleifen Verzweigungen Java Basics - Anfänger-Themen 18
C Sind die while-Schleifen richtig in for-Schleifen ersetzt worden? Java Basics - Anfänger-Themen 8
D Schleifen Problem Java Basics - Anfänger-Themen 2
H Muster mit verschachtelten Schleifen kreieren. Java Basics - Anfänger-Themen 2
A Schleifen in Java Java Basics - Anfänger-Themen 4
A Schleifen, Hilfe! Java Basics - Anfänger-Themen 6
C Schleifen Durchlauf Java Basics - Anfänger-Themen 7
M While-Schleifen-Fehler Java Basics - Anfänger-Themen 4
J Schleifen Wiederholendes Zeichenmuster Java Basics - Anfänger-Themen 4
K For-Schleifen Ablauf Java Basics - Anfänger-Themen 5
L Anzahl der Aufrufe von Schleifen bestimmen Java Basics - Anfänger-Themen 1
S Hilfe bei Java Aufgabe (Schleifen) Java Basics - Anfänger-Themen 25
B Verschachtelte For Schleifen Java Basics - Anfänger-Themen 8
G Input/Output Schleifen Durchlauf Java Basics - Anfänger-Themen 5
A Erste Schritte Schleifen Java Basics - Anfänger-Themen 5
J Muster und Schleifen Java Basics - Anfänger-Themen 33
H ERGÄNZUNGSFRAGE: Klammersetzung bei if-else Anweisungen und Schleifen Java Basics - Anfänger-Themen 2
scratchy1 Argumente mit verschiedenen Schleifen ausgeben Java Basics - Anfänger-Themen 3
C Schleifen Java Basics - Anfänger-Themen 12
E geschachtelte for-schleifen Java Basics - Anfänger-Themen 6
L Übungsaufgabe zu Schleifen Java Basics - Anfänger-Themen 7
W Erste Schritte Rechnen mit Schleifen? Denkanstoß gesucht Java Basics - Anfänger-Themen 15
A Erste Schritte for-Schleifen vereinfachen Java Basics - Anfänger-Themen 5
S Immer das selbe mit den Schleifen Java Basics - Anfänger-Themen 24
kokojamboo92 Schleifen und Arrays Java Basics - Anfänger-Themen 7
N Problem mit Schleifen Java Basics - Anfänger-Themen 20
O Array, geschachtelte For-Schleifen Java Basics - Anfänger-Themen 34
S While-Schleifen Ausgabe als String? Java Basics - Anfänger-Themen 1
R Threads Pause zwischen zwei Schleifen Java Basics - Anfänger-Themen 1
D verschachtelte Schleifen Java Basics - Anfänger-Themen 6
H Schleifen (anfänger) Java Basics - Anfänger-Themen 13
C Variablen in Schleifen außerhalb verwenden Java Basics - Anfänger-Themen 2
L Schachbrettnummerierung mit Schleifen.. Java Basics - Anfänger-Themen 3
H Schleifen Java Basics - Anfänger-Themen 8
L Zahlentripel und for-Schleifen Java Basics - Anfänger-Themen 2
T Spezielle Aufgabe zu Schleifen Java Basics - Anfänger-Themen 3
T Erste Schritte Schleifen-Stop Java Basics - Anfänger-Themen 14
kilopack15 Rekursion und Schleifen Java Basics - Anfänger-Themen 27
I Mehre While-Schleifen hintereinander Java Basics - Anfänger-Themen 13
P Terminieren diese Schleifen Java Basics - Anfänger-Themen 6
L Was heißt terminieren bei Schleifen? Java Basics - Anfänger-Themen 3
I Brauche Hilfe bei Schleifen Java Basics - Anfänger-Themen 18
C Erste Schritte While-Schleifen-Problem Java Basics - Anfänger-Themen 3
W Schleifen bei Greenfoot Java Basics - Anfänger-Themen 4
B Operatoren Stopp von Schleifen Java Basics - Anfänger-Themen 9
K Loop ohne Schleifen Java Basics - Anfänger-Themen 2
V Rechenzeichen bei Termen - Darstellung bei Schleifen Java Basics - Anfänger-Themen 7
E Muster auf der Konsole ausgeben lassen (Schleifen) Java Basics - Anfänger-Themen 7
C Erste Schritte Probleme bei Aufgaben zu Schleifen Java Basics - Anfänger-Themen 11
F OOP Schleifen und Probleme mit Setter und Getter Java Basics - Anfänger-Themen 1
L Blöcke bei verschachtelten Schleifen Java Basics - Anfänger-Themen 3
L Kurze Frage zu verschachtelten Schleifen Java Basics - Anfänger-Themen 3
E Erste Schritte Sternchenpyramide mit For-Schleifen erstellen Java Basics - Anfänger-Themen 9
H Best Practice Wie mit break verschachtelte Schleifen komplett verlassen? Java Basics - Anfänger-Themen 2
arti28 Erste Schritte For-Schleifen und While-Schleifen, String als Muster ausgeben. Java Basics - Anfänger-Themen 3
T [Schleifen] Schleifenproblem Java Basics - Anfänger-Themen 4
F Verschachtelte Schleifen Java Basics - Anfänger-Themen 4
J Hilfe verschachtelte Schleifen Java Basics - Anfänger-Themen 5
O Geschachtelte For-Schleifen Java Basics - Anfänger-Themen 1
D Zeichnen, Schleifen Java Basics - Anfänger-Themen 7
S Zeichnen , Schleifen Java Basics - Anfänger-Themen 4
L Schleifen und Array, nur letzte Eingabe wird ausgegeben Java Basics - Anfänger-Themen 3
Z Frage zu for-Schleifen Java Basics - Anfänger-Themen 5
M Wie kann ich eine Ausgabe vervielfachen? (Schleifen) Java Basics - Anfänger-Themen 4
Z Schleifen Beispiel: Fakultät Java Basics - Anfänger-Themen 26
T Erneute Frage zu Schleifen Java Basics - Anfänger-Themen 4
V Schleifen die nicht voneinander abhängen! (für CAN-BUS) Java Basics - Anfänger-Themen 10
T Anfängerfrage zu Schleifen und Arrays Java Basics - Anfänger-Themen 5
S for-Schleifen Problem Java Basics - Anfänger-Themen 4
W Methoden While Schleifen Ergebnis im String speichern Java Basics - Anfänger-Themen 5
F Erste Schritte Hilfe bei Übung zu String equals() und Schleifen Java Basics - Anfänger-Themen 8
J Anzahl von for-Schleifen in Abhängigkeit von Zahleneingabe erzeugen Java Basics - Anfänger-Themen 1
X Methoden Logik-Problem mit Schleifen. Java Basics - Anfänger-Themen 7
J MouseListener für Schleifen-Objekte Java Basics - Anfänger-Themen 13
W Aufgabe mit Schleifen Java Basics - Anfänger-Themen 8
M Sektkelch mit Schleifen Java Basics - Anfänger-Themen 9
F Methoden JTable + 2 For-Schleifen Java Basics - Anfänger-Themen 4
I Listen, for - Schleifen Java Basics - Anfänger-Themen 8
N Schleifen Problem Java Basics - Anfänger-Themen 3
L Histogram mittels Schleifen und Arrays Java Basics - Anfänger-Themen 9
A Ausgabe von Schleifen nebeneinander? Java Basics - Anfänger-Themen 3
T durchlaufene while-Schleifen zählen Java Basics - Anfänger-Themen 3
L schleifen fehler Java Basics - Anfänger-Themen 12
X Array Ausgabe bei Verwendung von 2 Schleifen erklären Java Basics - Anfänger-Themen 8
K Schleifen und Exceptions Java Basics - Anfänger-Themen 8
J Schachbrett mit Hilfe von while-Schleifen Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben