我知道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