Sì, sei corretto, almeno sotto analisi del caso peggiore.
Si noti che per n = 2^k
, per alcuni naturali k
, si ottiene che, ad eccezione quando si raggiunge la clausola di stop, la condizione è sempre vero, e la funzione ricorsiva sarà corse due volte.
Quando ciò è stabilito, è sufficiente analizzare:
T(n) = T(n/2) + T(n/2) + X
Dove X
è una costante, (ogni chiamata ricorsiva prende costante quantità di lavoro, se ignorando le altre chiamate ricorsive).
Da master theorem case 1, con:
f(n) = X
a = 2, b = 2, c = 0 (since X is in O(n^0)=O(1))
E poiché c=0 < 1 = log_2(2)
, condizioni per caso 1 si applicano, e possiamo concludere la funzione T(n)
è in Theta(n^log_2(2)) = Theta(n)
analisi media caso:
Nel caso medio, con il numero uniformemente distribuito n
, la metà dei bit nel binario rappresenta questo numero sarà attivo (1) e metà sarà "in basso" (0).
Dal dividendo per 2 è sostanzialmente aritmetica spostamento a destra, e la condizione isEven(n)
vale se e solo se il bit meno significativo è 0, ciò significa che la funzione media complessità è:
T(n) = 0.5 T(n/2) + 0.5 * 2 T(n/2) + X = 0.5 * 3 * T(n/2) + X
= 1.5 * T(n/2) + X
Così
T(n) = 3/2 T(n/2) + X
Caso 1 si applica ancora (supponendo costante X
):
a = 3/2, b = 2, c = 0
e si ottiene caso la complessità media di Theta(n^log_1.5(2))~=Theta(n^0.58)
rapida Nota:
Questo presuppone in effetti tutti i aritmetica sono O(1)
. Se questo non è il caso (numeri molto grandi), dovresti inserire la loro complessità invece della costante nella definizione di T(n)
e rianalizzare. Supponendo che ciascuna di queste operazioni sia sub-lineare (nel numero, non nei bit che la rappresentano), il risultato rimane Theta(n)
, poiché si applica ancora il caso 1 del teorema master. (Nel caso medio, per qualsiasi funzione "migliore" di non cambierà il risultato mostrato
nota che è possibile ridurre la seconda chiamata ricorsiva riutilizzando il primo risultato. 'A = pow (x, n/2); return a * a; ' – karakfa
Sì, so che è possibile ma il libro stava testando per vedere se abbiamo capito il concetto chiedendo l'efficienza di questo algoritmo. Ho corretto nel dire la sua O (N)? –