La prima è corretta, e davvero ben pensato.
Il secondo non è. Quell'algoritmo per calcolare i fib ha una complessità temporale molto più alta di O (n^4) (EDIT: che era quello che veniva chiesto quando ho scritto questa risposta - la domanda è stata aggiornata nel frattempo). Non è nemmeno polinomiale. Il ragionamento è il seguente (#fib notazione (x): numero di volte fib è chiamato a calcolare fib (x)):
- fib (1): #fib (1) = 1 (restituisce direttamente la risultato)
- fib (2): #fib (2) = 3 (uno per fib (2), che lo chiama per fib (0) e fib (1))
- fib (3): #fib (3) = 5 (uno per fib (3), che lo chiama per fib (2) e fib (1), dando 3 + 1 chiamate in più)
- fib (4): #fib (4) = 9
- fib (5): #fib (5) = 15
- fib (6): #fib (6) = 25
- ...
- fib (i): #fib (i) = 1 + #fib (i-1) + #fib (i-2)
Quindi, si ha:
- #fib (i) ~ = #fib (i-1) + #fib (i-2)
Da questo, sarebbe un'ipotesi ragionevole che il calcolo fib (i) prende "su "(in realtà, solo un po 'meno di) 2 volte il tempo per calcolare fib (i-1). Quindi, potresti "indovinare" che O (#fib (i)) = O (2^i). Questa è la risposta corretta, che puoi dimostrare facilmente per induzione.
Giusto per finire sulla sequenza di Fibonacci, ci sono algoritmi molto più veloci per calcolare il numero n-esimo. Per esempio, un algoritmo con tempo lineare (cioè, O (n)) è quello di memoizzare quella funzione che hai scritto (cioè, fai in modo di consultare una mappa per verificare se conosce il risultato per n, è quindi di restituirla immediatamente, altrimenti calcola lo memorizza e restituiscilo). C'è anche un closed formula to calculate the n-th fib, quindi un algoritmo a tempo costante (cioè, O (1)).
Infine, un esempio di O (n^4) algoritmo è nulla con 4 cicli interni, ogni ciclo in esecuzione "di" n volte.
Ad esempio, calcolare il volume di n cubi di lato n (in modo non ottimale):
int volume = 0;
for (int cube = 0; cube < n; cube++)
for (int x = 0; x < n; x++)
for (int y = 0; y < n; y++)
for (int z = 0; z < n; z++)
volume++;
return volume;
fonte
2012-10-14 06:10:12
2) Fibonacci - È più di O (2^n) iso O (n^4). Usa 4 loop nidificati (che vanno da 1 an incrementato di 1) come un esempio di O (n^4) ;-) e 1) è un esempio intelligente :) –