Sto seguendo un corso di Algoritmi e Strutture Dati.
Oggi, il mio professore ha detto che la complessità del seguente algoritmo è 2^n
.
Ho aspettato che la lezione finisse, mi sono avvicinato e gli ho detto che credevo davvero che fosse un algoritmo di O(n)
, e ho fatto il calcolo per dimostrarlo, e volevo mostrarglielo, ma ha continuato a dirlo non era, senza darmi alcuna spiegazione convincente.
L'algoritmo è ricorsivo e la sua relazione di ricorrenza è:
{ 1 if n=1
T(n) = {
{ 2T(n/2) otherwise
L'ho calcolato come O(n)
, in questo modo:
Espandiamo T(n)
T(n) = 2 [2 * T(n/(2^2))]
= 2^2 * T(n/(2^2))
= 2^2 * [2 * T(n/(2^3))]
= 2^3 * T(n/(2^3))
= ...
= 2^i * T(n/(2^i)).
Ci fermiamo quando il termine all'interno di T è 1, cioè:
n/(2^i) = 1 ==> n = 2^i ==> i = log n
Dopo la sostituzione, otteniamo
T(n) = 2^log n * T(1)
= n * 1
= O(n).
Poiché questo algoritmo è saltato fuori da una lezione su Merge Sort, ho notato come Merge Sort, che notoriamente è O(n log n)
ha una complessità di 2T (n / 2) + theta (n) (ovviamente maggiore di 2T (n / 2)), e gli ho chiesto perché è così, che un algoritmo con una complessità più bassa, ottiene un maggiore-O maggiore. Perché, a questo punto, è controintuitivo per me. Ha risposto, parole per parole, "Se pensi che sia contro-intuitivo, hai problemi seri in matematica."
Le mie domande sono:
- C'è qualche errore nella mia dimostrazione?
- L'ultima situazione non sarebbe contro-intuitiva?