我知道Fibonacci算法的规则递归函数是O(2^n),因为它为每个后续调用调用自己两次,使其成本加倍。但是,在添加我所描述的优化(对序列的解决方案哈希表)之后,如何确定它有多少可以降低复杂性?如何确定包含优化的递归算法的大O?
例如:
import java.util.*;
public class Solution {
static Hashtable<Integer, Integer> numbers = new Hashtable<Integer, Integer>();
public static int fibonacci(int n) {
if(n == 0 || n == 1){
return n;
}else if(numbers.containsKey(n)){
return numbers.get(n);
}else {
int result = fibonacci(n-1) + fibonacci(n-2);
numbers.put(n, result);
return result;
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
scanner.close();
System.out.println(fibonacci(n));
}
}
1.“我知道斐波纳契算法的正则递归函数是O(n^2)” - 不是,它是O(2^n)。 2.你永远不会填充'数字'。 3.一旦你实现了一个真正的记忆,你将只计算一次每个数字,所以'n'的运行时间将是O(n) – alfasin
我犯了一个错误,对不起 – Remixt
它也不是2^n,但phi^n,其中phi =(sqrt(5)+1)/ 2 = 1.618 ...是黄金比例。斐波纳契(30)需要大约200万步来计算天真,而不是10亿。 (从技术上讲,它是O(2^n),但只是在同样的意义上,它是O(2^2^n):大O是一个上界。) – Charles