Je sais que la fonction récursive régulière pour l'algorithme fibonacci est O (2^n) car elle s'appelle deux fois pour chaque appel suivant, doublant son coût. Cependant, après avoir ajouté ce que j'ai vu décrit comme une optimisation (une hashtable de solutions à la séquence), comment déterminez-vous combien cela réduit la complexité, voire pas du tout?Comment déterminer le Big O d'un algorithme récursif qui inclut une optimisation?
Par exemple:
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. "Je sais que la fonction récursive régulière pour l'algorithme de fibonacci est O (n^2)" - ce n'est pas, c'est O (2^n). 2. Vous ne remplissez jamais 'numbers'. 3. Une fois que vous avez implémenté une mémo * real *, vous ne calculez chaque nombre qu'une seule fois, donc le temps d'exécution de 'n' sera O (n) – alfasin
J'ai fait une faute de frappe, désolé – Remixt
Ce n'est pas 2^n non plus, mais phi^n, où phi = (sqrt (5) +1)/2 = 1.618 ... est le nombre d'or. Fibonacci (30) prend environ 2 millions de pas pour calculer naïvement, plutôt qu'un milliard. (Techniquement c'est O (2^n), mais seulement dans le même sens que c'est O (2^2^n): grand O est une borne supérieure.) – Charles