Complessità dell'algoritmo ricorsivo di Fibonacci


13

Utilizzando il seguente algoritmo ricorsivo di Fibonacci:

def fib(n):
   if n==0:
      return 0
   elif n==1
      return 1
   return (fib(n-1)+fib(n-2))

Se inserisco il numero 5 per trovare fib (5), so che questo produrrà 5, ma come posso esaminare la complessità di questo algoritmo? Come posso calcolare i passaggi coinvolti?



Stavo cercando lo stesso, e mi sono imbattuto in questo video di MyCodeSchool che consiglio di dare un'occhiata.
snbk97,

Risposte:


23

Il più delle volte, è possibile rappresentare gli algoritmi ricorsivi usando equazioni ricorsive. In questo caso l'equazione ricorsiva per questo algoritmo è . Quindi puoi trovare la forma chiusa dell'equazione usando il metodo di sostituzione o il metodo di espansione (o qualsiasi altro metodo usato per risolvere le ricorrenze). In questo caso ottieni T ( n ) = Θ ( ϕ n ) , dove ϕT(n)=T(n-1)+T(n-2)+Θ(1)T(n)=Θ(φn)φ è il rapporto aureo ( φ=(1+5)2 ).

Se vuoi saperne di più su come risolvere le ricorrenze ti consiglio vivamente di leggere il capitolo 4 di Introduzione agli algoritmi .


0

in alternativa alle relazioni di ricorrenza / analisi matematica (ma non un sostituto ) un semplice esercizio empirico, apparentemente non insegnato molto spesso in classe ma molto istruttivo, è contare il numero di esecuzioni della funzione e quindi rappresentare graficamente il conteggio per un intervallo di piccolo n input , quindi curva adatta al risultato. i risultati corrisponderanno generalmente strettamente all'approccio matematico teorico.

un buon materiale di supporto per questo esercizio è disponibile nel capitolo 3 online gratuito, durata degli algoritmi / Foundations of Computer Science , Ullman


1) La stampa non sostituisce in alcun modo l'analisi formale. È facilmente imbrogliato. 2) Penso che tu stia travisando la fonte che citi. Citano la trama, ma non come un modo per determinare la "complessità". 3) FWIW, non sono d'accordo con l'approccio e il suo utilizzo come lo presenta Ullman, ma non è colpa tua.
Raffaello

1
la risposta inizia essenzialmente con il disclaimer, dicendo che la trama non è un sostituto dell'analisi matematica . la trama è un metodo scientifico e dire / osservare che a volte è ingannato è conoscere / evocare aspetti statistici dei dati, che è un altro aspetto principale dell'analisi scientifica . pensare di dire che è "facilmente imbrogliato" è piuttosto drammatico, ci sono casi "patologici" in cui fallisce ma sono tipicamente "inventati" ... la questione era esaminare la complessità dell'algoritmo e l'analisi empirica è un aspetto chiave / angolo su quello, e ovviamente non l'unico angolo ecc ...
vzn

0

Il risultato di fib (n) è la somma di tutte le chiamate ricorsive che hanno restituito 1. Pertanto ci sono esattamente chiamate fib (n) ricorsive che valutano fib (1). Quindi il tempo di esecuzione è Ω (fib (n)); dovresti dimostrare che le chiamate che restituiscono 0 e le altre chiamate ricorsive non si aggiungono in modo significativo a questo.

Lo stesso ragionamento si applicherebbe a qualsiasi funzione definita in modo ricorsivo che restituisce 1 o 0 o il risultato di un'altra chiamata ricorsiva.


"almeno O (fib (n))" - che non ha alcun senso. Vuoi usareΩ.
Raffaello

Sentiti libero di modificare la risposta se ti senti fortemente al riguardo.
gnasher729,

0

Un limite inferiore è intuitivo: T(n)=T(n-1)+T(n-2) T(n)>2T(n-2) da T(n-1)>T(n-2) Quindi T(n)=Ω(cn)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.