斐波那契时间复杂度分析

时间:2019-04-05 00:44:20

标签: java

我正在实现一个程序,以从1到55的顺序计算第n个斐波那契数。该程序使用递归方法,记忆方法和自下而上的方法。我的所有代码都能正常工作,但是,我需要计算每种方法的每次迭代所花费的时间,并分析第n / nth-1个迭代的时间。这是我需要帮助的理解。我看到这正在创建某种类型的比率,但是该比率究竟代表什么?下表只是我的递归方法的前10个迭代。通过计算第n次迭代的时间除以nth-1次迭代即可完成计算。第6行=(4500/1700),第7行=(5600/4500),依此类推。对于我的记忆方法和自下而上的方法,我已经做了同样的事情。显然,这只是1-10之间的一个小例子...

N时间(t1 / t1-1)的值

1--5000

2--1300--0.26

3--900--0.692307692

4--1200--1.333333333

5--1700--1.416666667

6--4500--2.647058824

7--5600--1.244444444

8--18800--3.357142857

9--24100--1.281914894

10--3000--0.124481328

不确定是否需要,但我也添加了代码。

public class FibonacciNumbers {


public static int FibonacciNaive(int n) {
    if (n <= 1) {
        return n;
    }
    else{
        return FibonacciNaive(n - 1) + FibonacciNaive(n - 2);
    }
}

public static int FibonacciMemoization(int n) {
    Map<Integer, Integer> memo = new HashMap<>();
    if (n <= 1) {
        return n;
    }
    // see if we've already calculated this
    if (memo.containsKey(n)) {
        return memo.get(n);
    }

    int result = FibonacciNaive(n - 1) + FibonacciNaive(n - 2);
    // memoize
    memo.put(n, result);
    return result;

}
public static int FibonacciBottomUp(int n) {
    int fib[] = new int[n + 1];
    fib[0] = 0;
    fib[1] = 1;
    for (int i = 2; i < n + 1; i++) {
        fib[i] = fib[i - 1] + fib[i - 2];
    }
    return fib[n];
}

public static void main(String args[]) {
    try{
        FileWriter writer = new FileWriter("FF.csv");
        BufferedWriter out = new BufferedWriter(writer);
        for (int j = 1; j <= 50; j++){
            int n = j;
            long naiveTime, memoTime, buTime;
            long start, end;
            System.out.println("Value of N: " + n + "\nIteration: " + j);

            start = System.nanoTime();
            FibonacciNaive(n);
            end = System.nanoTime();
            naiveTime = end - start;
            System.out.println("Naive: " + (naiveTime) + " " + FibonacciNaive(j));

            start = System.nanoTime();
            FibonacciMemoization(n);
            end = System.nanoTime();
            memoTime = end - start;
            System.out.println("Memoization: " + (memoTime) + " " + FibonacciMemoization(j));

            start = System.nanoTime();
            FibonacciBottomUp(n);
            end = System.nanoTime();
            buTime = end - start;
            System.out.println("Bottom-Up: " + (buTime) + " " + FibonacciBottomUp(j) + "\n");

            out.write(j + "," + naiveTime + "," + memoTime + "," + buTime);
            out.newLine();
        }
        out.close();
    }
    catch (IOException e){
        System.out.println("something messed up");
    }
}

}

0 个答案:

没有答案