











































Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
dispense che spiegano la complessità computazionale: introduzione; calcolo; efficienza degli algoritmi ecc..
Tipologia: Dispense
1 / 51
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!












































In offerta
Un problema spesso può essere risolto utilizzando algoritmi diversi
Come scegliere il “migliore”?
La bontà o efficienza di un algoritmo si misura in base alla quantità minima di risorse sufficienti per il calcolo: Il tempo richiesto per eseguire le azioni elementari Lo spazio necessario per memorizzare e manipolare i dati
La risorsa di maggior interesse è il tempo
La complessità dei problemi da risolvere dipende dalla dimensione dei dati in ingresso
Il tempo di calcolo si può quindi esprimere come:
Le operazioni elementari sono quelle:
aritmetiche logiche di confronto di assegnamento
Solitamente, il numero di operazioni considerate è valutato nel caso peggiore , ossia nel caso di dati in ingresso più sfavorevoli tra tutti quelli di dimensione n
il numero complessivo di operazioni elementari in funzione della dimensione n dei dati in ingresso
Trovare l’elemento minimo in un insieme di n numeri {x 1 ,x 2 ,…,xn}
Soluzione:
Complessivamente sono stati eseguiti n confronti
L’efficienza dell’algoritmo è quindi direttamente proporzionale alla dimensione dell’input
L’efficienza di un algoritmo si può esprimere mediante una funzione f(n) della variabile n:
esprime il numero di operazioni compiute per un problema di dimensione n rappresenta la complessità computazionale dell’algoritmo
Se A e B sono due algoritmi che risolvono lo stesso problema e se fA(n) e fB(n) esprimono la complessità dei due algoritmi allora:
A è migliore di B se, al crescere di n, risulta fA(n) fB(n)
Supponiamo di avere due algoritmi diversi per ordinare n numeri interi Il primo algoritmo riesce ad ordinare gli n numeri con n^2 istruzioni Il secondo con n * log n istruzioni
Supponiamo che l’esecuzione di un’istruzione avvenga in un sec (10-6^ sec)
Tempo di esecuzione:
n^2 op.
n*log n op.
n=10 n=10000 n=10^6
0,1 msec 100 sec (1,5 min) 106 sec (12 gg.)
23 sec 92 msec 13,8 sec
Il miglioramento della tecnologia non riduce significativamente il tempo di esecuzione di alcune importanti classi di algoritmi:
Algoritmi di Ricerca ( n operazioni) Algoritmi di Ordinamento ( n^2 operazioni) Algoritmi Decisionali ( 2 n^ operazioni)
Complessità Tecnologia attuale^ 100 volte più veloce^ 1000 volte più veloce
n
n^2
2 n
N 1
N 2
N 3
N 1 * 100 N 1 * 1000
N 2 * 10 N 2 * 31,
N 3 + 6,64 N 3 + 9, N = numero dati gestiti in un lasso di tempo t (dipendente dalla complessità) Ad es.: 2N^ operazioni (op.) nel tempo t. Con tecnologia 100 volte più veloce 2N^ op. in t/100, quindi 2N^ *100 op. nel tempo t, 2N^ *26,64^ = 2N+6,64^ op. nel tempo t.
Per giungere a un modello di costo è necessario definire:
Dimensione dell’input Istruzione di costo unitario (passo base) Calcolo della complessità in numero di passi base Complessità Nel caso migliore Nel caso medio Nel caso peggiore Complessità di programmi strutturati Complessità asintotica
i = 0; while(i < n){ i = i+1; j = j*3 + 42; }
i = 0; while(i < 2n){ i = i+1; j = j3 + 4367; }
Il costo può dipendere dal valore dei dati in ingresso!
i = 0; while(i*i < n) i = i+1;
Il costo può dipendere dal valore dei dati in ingresso!
(con arrotondamento all’intero superiore)
i = 0; while(i*i < n) i = i+1;