Avatar billede jakoba Nybegynder
09. november 2003 - 21:12 Der er 15 kommentarer og
1 løsning

beregning af køretids-orden for funktion. O(___)

Jeg har leget med fibonacci tal og lavet forskellige metoder til udregning af fibonacci(n).

Men jeg kan ikke finde en god måde a beslutte hvilken orden metoden L i den lille lære-klasse (LearnFib) skal have. Det er nemt at se a den efterhånden tenderer imod konstant tid O(k), men før den kommer såvidt er den hvad ???


import java.io.*;
import java.lang.*;

class LearnFib {
   
    private static long[] memory = new long[100];
   
    public LearnFib ( ) {
        memory[0] = 0;
        memory[1] = 1;
        for (int i=2; i<memory.length; i++ ) memory[i] = -1;
    } //endconstructor LearnFib
   
    public long L ( int nr ) {
        if ( memory[nr] >= 0 ) return memory[nr];
        return ( memory[nr] = L(nr-1) +L(nr-2) );
    } //endmethod L  Order ?? funktion
   
} //endclass LearnFib

public class TestFib {
 
    public static long fibOn ( int nr ) {
        long[] acc = { 0, 1 };
        int i;
        for ( i=0; i<nr; ) {
            acc[i&1] += acc[++i&1];
        }
        return acc[i&1];
    } //end fibonacci Order N function
 
    public static long fibOnn ( int nr ) {
        switch (nr) {
          case  0: return 0;
          case  1: return 1;
          default: return fibOnn(nr-1) +fibOn(nr-2);
        }
    } //end fibonacci Order N^2 function
 
    public static long fibOEn ( int nr ) {
        switch (nr) {
          case  0: return 0;
          case  1: return 1;
          default: return fibOEn(nr-1) +fibOEn(nr-2);
        }
    } //end fibonacci Order 2^N function
 
    public static void main (String[] args) {
        LearnFib fib = new LearnFib();
        for (int i=0; i<40; i++ ) {
            System.out.println ( "O(L?) " +i + " giver " +fib.L( i ) );
            System.out.println ( "O(n)  " +i + " giver " +fibOn( i ) );
            System.out.println ( "O(nn) " +i + " giver " +fibOnn( i ) );
            System.out.println ( "O(En) " +i + " giver " +fibOEn( i ) );
        }
    } //end main

} //endclass TestFib

( og hvorfor pokker er det forbudt at skrive '?' efter efter spørgsmålet i titlen )

mvh JakobA
Avatar billede arne_v Ekspert
09. november 2003 - 21:52 #1
Hvad er forskellen på fibOnn og finOEn koden ?
Avatar billede arne_v Ekspert
09. november 2003 - 21:54 #2
Og de må vel være 2^n ikke n^2 !?
Avatar billede arne_v Ekspert
09. november 2003 - 21:55 #3
Ah - finOnn kalder fibOn - så skal det nok passe !
Avatar billede arne_v Ekspert
09. november 2003 - 21:58 #4
Jeg er overbevist om at L er O(n).

Den vil beregne L(nr-1) hele vejen ned og så er alle L(nr-2)
fundet.
Avatar billede erikjacobsen Ekspert
09. november 2003 - 21:59 #5
Det kommer jo an på hvordan den kaldes. Nummer 2 og efterfølgende
kald er jo O(1).
Avatar billede arne_v Ekspert
09. november 2003 - 22:02 #6
Det er korrekt.
Avatar billede jakoba Nybegynder
09. november 2003 - 22:35 #7
ja fibOnn metoden er nok lidt søgt.

Allerførste kald af fib.L tror jeg også må være O(n).
Lad os sige det var L(35), men når så næste kald er L(38)? Det føles grumt at sølle 3-trin skal kaldes O(n). men kan man køre sådan en random-situation ind under O(logN).
Avatar billede erikjacobsen Ekspert
09. november 2003 - 22:56 #8
Man skal vist over i amortiseret tid: hvad er tidskompleksiteten når
man laver tilstrækkeligt mange kald, nogle er billige, nogle (få) er dyre,
så hvad er "gennemsnittet". Det afhænger så her af hvad man skal bruge
det til. Hmm, og hvad *kan* man bruge det til? ;)
Avatar billede arne_v Ekspert
09. november 2003 - 23:03 #9
Jeg vil mene at:

time = k * max(1, (n - max(all previous n)))

Om du vil kalde den O(n) eller ej - tja ...
Avatar billede arne_v Ekspert
16. november 2003 - 22:00 #10
Skal vi have den her lukket ?
Avatar billede jakoba Nybegynder
16. november 2003 - 22:13 #11
Jeg ville gerne men det er svært når i ikke lægger nogen svar :-))
Avatar billede arne_v Ekspert
16. november 2003 - 22:15 #12
svar
Avatar billede jakoba Nybegynder
16. november 2003 - 22:19 #13
jeg går ud fra erik er beskeden som sedvanlig.

takker
Avatar billede erikjacobsen Ekspert
16. november 2003 - 22:23 #14
Hva'? Var der nogen der sagde mit navn? Nåh, jah, skidt med pointene ;))
Avatar billede arne_v Ekspert
16. november 2003 - 22:25 #15
Jeg skal gerne overføre din halvdel af "byttet" hvis du vil
Avatar billede erikjacobsen Ekspert
16. november 2003 - 22:29 #16
Nej, tak, Arne - det ville bare få det til at se ud som om jeg tog det alvorligt ;)
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