Avatar billede bumle90 Nybegynder
28. maj 2004 - 09:51 Der er 12 kommentarer og
1 løsning

Udregning af køretid på rekursive kald

Hej, jeg er ret meget i tvivl om hvordan jeg udregner køretiden på et rekursivt kald.
Jeg håbede at nogle herinde evt. kunne forklare mig hvordan jeg gør :)
Mvh. bumle90
Avatar billede dsj Nybegynder
28. maj 2004 - 10:14 #1
Du nævner ingen sprog, så her er lidt seudo:

startTid = nu;
kør rekursivt kald;
tid = nu - startTid;

"tid" er så tiden det rekursive kald tog.
Avatar billede yellow Nybegynder
28. maj 2004 - 10:15 #2
Hvad mener du? Sådan målt i reel tid, eller en matematisk udregnet tidskompleksitet?

Hvis reel tid, sætter du vel bare en timer i dit program med evt. mellemtider i hver rekursion.

Hvis du vil udregne tidskompleksitet ( f.eks. T(n)= O(n*log n ) ), så kræver det en del matematisk indsigt.
Generelt skal du benytte "divide and conquer"-filosofien.
Der er flere forskellige metoder til at finde Tidskompleksiteten for en rekursiv relatition. Een går ud på at "gætte" nogle kompleksiteter og så teste om de passer, men der er også andre måder.
http://ww0.java3.datastructures.net/ eller lignende bøger kan anbefales.
Avatar billede bumle90 Nybegynder
28. maj 2004 - 10:19 #3
Ja oki, jeg fik måske ikke formuleret mig skarpt nok :) sorry.
Jeg er ikke interresseret i en reel tid for rekursive kald. Og jeg søger den matematiske måde at beregne tidskompleksiteten på.
Divide and conquer er den gældende for alle rekursive kald? Jeg mener divide and conquer halverer jo hele tiden problemet, hvorimod et rekursivt kald kalder sig selv en række gange.
Avatar billede bumle90 Nybegynder
28. maj 2004 - 10:31 #4
yellow..det link du gav mig...jeg sys ik jeg kunne finde noget der...
Har du evt. andre? Eller måske tid til at forklare mig hvordan jeg gør :)
Vær ikke bekymret for matematikken :) Det kan jeg godt
Avatar billede bumle90 Nybegynder
28. maj 2004 - 10:31 #5
Det er altså den assymptotiske køretid jeg er interresseret i
Avatar billede yellow Nybegynder
28. maj 2004 - 10:39 #6
Linket var bare til en bog, der dækker emnet godt - men den skal selvfølgelig købes først ;-)

Ellers er der mange ressourcer på nettet på en alm. google søgning.
Fandt et par links (det første dækker de forskellige metoder meget godt).
http://www.cs.nyu.edu/courses/fall02/V22.0310-002/lectures/lecture-25.html
http://www.cs.mcgill.ca/~cs251/OldCourses/1997/topic4/
Avatar billede yellow Nybegynder
28. maj 2004 - 10:47 #7
Her er f.eks. et godt eksempel på hvordan tidskompleksiteten udregnes for 2 fibonacci programmer - 1 "lineært" program og et rekursivt...

http://www.brpreiss.com/books/opus5/html/page75.html
Avatar billede bumle90 Nybegynder
28. maj 2004 - 10:52 #8
ja oki...jeg kan godt udregne asymptotiske køretider for normale programmer :)
Det er ikke så svært, men det er bare de rekurssive det kniber med hehe. Men tak for det :)
Avatar billede yellow Nybegynder
28. maj 2004 - 10:54 #9
I det eksempel jeg linkede til er program nr2 rekursivt - og de viser hele udregningen af kompleksiteten.
Avatar billede bumle90 Nybegynder
28. maj 2004 - 10:55 #10
ups :p
Cool der var jeg vidst lige lidt hurtig der hæhæ :)
kigger lige igen
Avatar billede jakoba Nybegynder
28. maj 2004 - 14:36 #11
Du gør det ved at tænke dig om
    int summa ( int n ) {
        if ( n > 0 ) {
            return n + summa( n-1 );
        } else {
            return 0;
        }
    }
funktionen kalder sig selv præcis een gang for hver gang n tælles ned, så køretiden er O(N). Det er helt fint.

    int fibbo ( int n ) {
        if ( n > 1 ) {
            return fibbo( n-1 ) + fibbo( n-2 );
        } else {
            return n;
        }
    }
funktionen kalder sig selv 2 gange i hvert kald så køretiden er O(2^N).  Det er en exponentiel stigning så det bør nok kodes anderleds.

Men det er simple eksempler. metoden quicksort fx kalder også sig selv 2 gange pr rekursivt kald. men til gengæld er antallet af rekursive kald begrænset (antal elementer der skal sorteres deles i to for hver rekursion). Så alt ialt er quicksort en O(N*logN) algoritme. Og det er jo ikke alt for sølle. (i gennemsnit; dens worstcase er skrækkelig)

Det kan være noget af et hovedbrud at regne det ud. Hvis du har en konkret rekursiv funktion kan jeg prøve og kommentere udregningen for den funktion.

mvh JakobA
Avatar billede bumle90 Nybegynder
28. maj 2004 - 19:41 #12
Superlækre svar :)
Tak for hjælpen...læg et et svar og jeg deler point ud :)
Avatar billede yellow Nybegynder
31. maj 2004 - 01:54 #13
Tak :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester