Zum Inhalt springen

Asymptotische Laufzeit eines Algorithmusses


Astasor

Empfohlene Beiträge

Hey, ich bins nochmal.

ich arbeite gerade an der asymptotischen Laufzeit von Algorithmen.

Muss ich da nur die Befehlsaufrufe zählen oder noch mehr?

Angenommen ich hätte folgenden Algorithmus

for j=wert to endwert do   

{

wertzuweisung; 

arithmetische Operation;

while schleife(Bedingung) { lustiger schleifeninhalt aus einzeloperationen}

noch ne wertzuweisung;

}

angenommen die bedingung trifft niemals zu.

da läuft die for schleife doch n-mal durch und die anderen operationen (n-1) mal.

n+4*(n-1), oder?

wie muss ich die while schleife gewichten? einzelne operationen sind ja immer O(1).

ich habe gelesen, das ich bei dem schleifeninhalt von while schleifen, die ausführung durch die befehlsanzahl teilen muss. stimmt das?

mfg Astasor

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich habe gelesen, das ich bei dem schleifeninhalt von while schleifen, die ausführung durch die befehlsanzahl teilen muss. stimmt das?

Das macht keinen Sinn, denn damit würdest Du nur einen Bruchteil der eigentlichen Laufzeit erhalten.

Eine Schleife wird n mal durchlaufen, wobei n >= 0 und natürliche Zahl ist. Somit werden die Befehle innerhalb der Schleife n mal ausgeführt, d.h. dann n * O(<Komplexität der Schleife>), da eine Schleife linear zur Laufzeit beiträgt. Je nach Schleife muss man dann schauen ob es n oder n-1 ist.

Du musst eben für das Landau-Symbol die Anzahl der Durchläufe ermitteln und vorher beweisen, dass die Schleife terminiert, da sonst die Laufzeit divergieren kann.

Bearbeitet von flashpixx
Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für die Antwort und deine Begründung ist einleuchtend.:)

vorher beweisen, dass die Schleife terminiert

wie mache ich das?

per Induktion?

oder einfach in dem ich allgemeingehaltene eingabefolgen abarbeiten?

oder per gegenbeweis? (müsste möglich sein, indem ich annehme das die schleife nicht terminiert und mir die anweisungen in der schleife ankucke.)

oder einfach indem ich die befehle in der schleife gegen unendlich bei gegebenen eingaben durchlaufen lasse und schau was passiert?

ich fühl mich als ob ich hier ein brett vorm kopf hätte, dann ich weis nicht, welche meiner überlegungen sind richtig und welche nutzlos.

annahme: while schleife mit (Bedingung: zahl<n) terminiert nicht.

folgerung: bei gegebenen Eingaben läuft die schleife undendlich lang.

Beweis: zahl wird bei jedem schleifendurchlauf um 1 erhöht.

Widerspruch: die bedingung gilt nicht für jede belegung von zahl. q.e.d.

Änderung:

im bestcase - wenn die while <Bedingung> immer false ergibt, läuft der schleifeninhalt der forschleife genau n mal durch.

d.h.: die while-schleife hat einen null aufwand und der ist konstant

Ergebnis: n*O(1)

ergibt die while bedingung nun mal true, dann läuft der schleifeninhalt durch und die while bedingung wird wieder aufgerufen.

also ist die komplexität der whileschleife (n+Anzahl der While-Schleifendurchläufe), oder?

Link zu diesem Kommentar
Auf anderen Seiten teilen

wie mache ich das?

Schleifeninvariante ? Wikipedia

Je nach While-Schleifen-Inhalt bietet es sich an, das ganze nicht iterativ, sondern rekursiv zu formulieren: Wenn Du z.B. den Schleifenrumpf als Induktion von n nach n-1 auffassen kannst, ist es einfacher das ganze zu beweisen (in diesem Fall hättest Du ja nur n Aufrufe).

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 4 Wochen später...

Danke für deine Hilfe, flashpixx, doch hier mal das genaue Problem. Und mit Rechenregeln, meinst du da die mathematische definition oder was man macht, wenn man T(n)= 3T(n/4)+O(n) vorgesetzt bekommt und das dann einordnen soll?

ich will zwei Rot-Schwarz-Bäume vereinigen, so dass ein Rot-Schwarz-Baum ausgegeben wird, der alle Elemente enthält.

hier mal mein Algorithmus in Pseudocode, der sehr stark an Java angelehnt ist. Die Prozedur für das Einfügen in einen RS-Baum habe ich jetzt mal weggelassen, da bekannt ist, das dass Einfügen und Reparieren in solch einen Baum zusammen O(log n) im worst case brauch.


int getBH(T){ //Bestimmung der BH um herauszufinden, welcher Baum größer ist. O(log n)

//T RS-Baum   


Node tmp<- root[T]

int bh<-1


while (tmp.left!=null){


tmp.left

if (tmp.color=black) then bh=bh+1


}

return bh

}


preOrder( x,T ){  //x knoten, wurzel wird zuerst in den größeren Baum eingefügt, dann der Rest


    RSinsert(T,x) O(logn)  //einfügen in einen Rot-Schwarz Baum O(log n)


    if knoten.links ≠ null then  //pre Order durchlauf O(n), da alle Knoten angeschaut werden müssen

        preOrder( knoten.links )


    if knoten.rechts ≠ null then

        preOrder( knoten.rechts )

}


vereineRstrees(T1,T2){


Node tmp


if (getBH(T1)>getBH(T2)) then{

tmp<-root[T2]

preOrder(x,T1)   //einfügen von T2 in T1

return T1

}



else{ 

tmp<-root[T1]

preOrder(x,T2)   //einfügen von T1 in T2

return T2

}

}

Mit so was tue ich mich noch schwer. Doch es gibt auch keine guten Bücher über das Laufzeitverhalten.

mfg Astasor

Bearbeitet von Astasor
Link zu diesem Kommentar
Auf anderen Seiten teilen

Und mit Rechenregeln, meinst du da die mathematische definition oder was man macht, wenn man T(n)= 3T(n/4)+O(n) vorgesetzt bekommt und das dann einordnen soll?

Wenn T(x) eine Funktion ist, kannst Du die rekursive Definition auflösen und entsprechend den Aufwand abschätzen.

Doch es gibt auch keine guten Bücher über das Laufzeitverhalten.

Man kann die Landau Klasse durch einen Limes ohne Probleme ermitteln, der Rest ist mathematisches Umformulieren. Ansonsten wäre wohl Priese&Erk mit "Eine Einführung in die theoretische Informatik" bzw. Robert Sedgewick mit "Algorithmen" die passenden Einstiegswerke.

Das Umformen einer Rekursionsgleichung sollte bei den Landau Klassen bekannt sein.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...