Analizzare costo di un algoritmo (caso peggiore)
int funzione(int V[],int n,int x){ int i=n; while(i>0){ if(V[i-1]==x) return 1; i=i/2; } return 0; }
Ho calcolato il costo in questo modo:
$ T(n) = 3 + n/2^(n-1) $
in notazione asintotica $ O(n/2^(n-1))$
è corretto?
Risposte
Come avresti calcolato questa complessità? A me sembra semplicemente \( O(\log\,n) \) nel caso peggiore.
"apatriarca":
A me sembra semplicemente \( O(\log\,n) \) nel caso peggiore.
confermo ($O(log_2(n))$ se si vuol fare i pignoli).
"apatriarca":mi sono basato su quanto ha detto il professore in classe
Come avresti calcolato questa complessità? A me sembra semplicemente \( O(\log\,n) \) nel caso peggiore.

non è corretto?
Non mi sembra. Hai calcolato $c=n/(2^n)$ come costo del ciclo in base a $n$ parametro. Proviamo
$n=10$ ciclo $c=n/(2^n)=10/(2^10)=10/1024=0.009765625$
$n=20$ ciclo $c=n/(2^n)=20/(2^20)=20/1048576=0.000019073486328125$
$n=100$ ciclo $c=~7.88*10^-29$ (tralascio la formula).
Invece, come suggerito, ad ogni iterazione si dimezza il valore di $i$ partendo da $n$... questo non ti ricorda qualcosa tipo "come convertire un numero in binario"? E qual è il costo della conversione?
$n=10$ ciclo $c=n/(2^n)=10/(2^10)=10/1024=0.009765625$
$n=20$ ciclo $c=n/(2^n)=20/(2^20)=20/1048576=0.000019073486328125$
$n=100$ ciclo $c=~7.88*10^-29$ (tralascio la formula).
Invece, come suggerito, ad ogni iterazione si dimezza il valore di $i$ partendo da $n$... questo non ti ricorda qualcosa tipo "come convertire un numero in binario"? E qual è il costo della conversione?

"Rggb":scusa ma all'inizio i assume il valore di n,cosa cambia? è sempre quello il valore che poi durante il ciclo si dimezza di volta in volta
Non mi sembra. Hai calcolato $c=n/(2^n)$ come costo del ciclo in base a $n$ parametro. Proviamo
$n=10$ ciclo $c=n/(2^n)=10/(2^10)=10/1024=0.009765625$
$n=20$ ciclo $c=n/(2^n)=20/(2^20)=20/1048576=0.000019073486328125$
$n=100$ ciclo $c=~7.88*10^-29$ (tralascio la formula).
Invece, come suggerito, ad ogni iterazione si dimezza il valore di $i$ partendo da $n$... questo non ti ricorda qualcosa tipo "come convertire un numero in binario"? E qual è il costo della conversione?
"Andrew Ryan":
scusa ma all'inizio i assume il valore di n,cosa cambia?
Io non ho fatto altro che applicare la formula che hai assegnato al costo del ciclo while, per farti vedere che non può essere corretta: al crescere di $n$ il costo del ciclo tenderebbe a zero...
Ragioniamo a rovescio: al primo ciclo while, $i$ vale $n$, al secondo $n \/ 2$, al terzo $n \/ 4$, e così via fino ad 1. Il costo totale (tutti i cicli) è il numero di elementi di questa successione, che puoi ordinare a rovescio partendo da 1:
$2^0, 2^1, 2^2 ... 2^k>=n$
Ora, prova a calcolare quanto vale $k$ (che è il numero totale di cicli effettuati),
"Rggb":
[quote="Andrew Ryan"]scusa ma all'inizio i assume il valore di n,cosa cambia?
Io non ho fatto altro che applicare la formula che hai assegnato al costo del ciclo while, per farti vedere che non può essere corretta: al crescere di $n$ il costo del ciclo tenderebbe a zero...
Ragioniamo a rovescio: al primo ciclo while, $i$ vale $n$, al secondo $n \/ 2$, al terzo $n \/ 4$, e così via fino ad 1. Il costo totale (tutti i cicli) è il numero di elementi di questa successione, che puoi ordinare a rovescio partendo da 1:
$2^0, 2^1, 2^2 ... 2^k>=n$
Ora, prova a calcolare quanto vale $k$ (che è il numero totale di cicli effettuati),[/quote]k è $ log_2(n) $ però ho ancora un dubbio: va considerata sempre la parte intera superiore? però quando i=1 non si continuerebbe ad avere 1? quindi per esempio nel caso di n=10 il numero delle iterazioni > $log_2(n)$
EDIT: tutto risolto,mi sono confuso con il valore di $i$ e il numero di iterazioni,in effetti se n=10 alla quarta iterazione i=1 verrebbe dimezzato e non entrerebbe più nel while,quindi se vogliamo essere precisi il while avrebbe costo $ log_2(n) + 1 $ dove 1 è il costo dell'ultimo test della condizione del while,poi adottando la notazione asintotica avremo $ O(log_2(n)) $
qualcuno può confermare ciò che ho detto nell'EDIT qui sopra?
"Andrew Ryan":
qualcuno può confermare ciò che ho detto nell'EDIT qui sopra?
ok è corretto.
