我正在实现一个程序,以从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");
}
}
}