Programmazione degli Elaboratori

Complessità di un algoritmo

Dato un algoritmo, una questione di grande importanza pratica è quanto tempo sia necessario per eseguirlo. Un' altra risorsa che nella programmazione degli elaboratori assume una grande importanza pratica, oltre al tempo, è la quantità di memoria necessaria per mantenere tutte le informazioni iniziali, intermedie e finali relative al problema che si sta risolvendo. Occasionalmente, possono assumere rilievo anche altri tipi di risorse, come la banda di comunicazione e il numero di porte logiche utilizzate, ma la risorsa che il più delle volte si è interessati a misurare è il tempo. La quantità di risorse necessaria per l'esecuzione di un algoritmo è la sua complessità computazionale, che è in relazione diretta con la difficoltà del problema. La difficoltà effettiva di un problema sarà data dalla complessità computazionale del miglior algoritmo che potrà essere scritto per risolvere il problema.
Il tempo di esecuzione di un algoritmo può essere misurato per ogni dato d'ingresso. Dopo aver scomposto il problema da risolvere in un insieme di operazioni elementari si deve:

Il tempo totale di esecuzione sarà: Ttotale = (Toperazione elemtare1 x N_numero di volte che si ripete1) + (T2 x N2)+……...

Trovare il tempo di esecuzione di un' operazione elementare è però tutt' altro che banale. Vanno fatte delle ipotesi dipendenti dalla tecnologia utilizzata, infatti se un algoritmo lo eseguo con "carta e penna" ci metterò più tempo che con un computer. Per analizzare un algoritmo è quindi necessario disporre di un modello della tecnologia che verrà utilizzata per realizzarlo; tale modello deve descrivere le risorse utilizzate e il loro costo. E' consuetudine adottare un modello generico di macchina ad accesso casuale (alla memoria) con un processore singolo, in inglese random-access machine (RAM). In pratica, tale modello è ispirato abbastanza fedelmente al funzionamento della stragrande maggioranza dei processori utilizzati dagli elaboratori elettronici. In questo modello computazionale il tempo necessario per accedere a qualsiasi punto della memoria è costante (è sempre uguale).
Inoltre ogni operazione elementare richiede la stessa quantità di risorse, per essere eseguita. Queste ipotesi rendono relativamente più semplice l' analisi della complessità computazionale dell'Algoritmo.
Nel caso in cui l'analisi della complessità computazionale è fatta su tutti gli ingressi possibili e non su ingressi dati, le cose cambiano sostanzialmente. Per esempio trovare il MCD di due numeri col metodo euclideo è molto più semplice su numeri piccoli, che su numeri con molte cifre decimali. Quello che interessa quindi non è tanto studiare il tempo e lo spazio impiegati da una particolare esecuzione di un algoritmo, quanto fare delle statistiche su tutte le possibili esecuzioni, cioè per ogni possibile ingresso. Solitamente la complessità di un algoritmo viene "misurata" sul caso peggiore; solo in subordine può a volte interessare anche il caso medio. Il tempo di esecuzione nel caso peggiore di un algoritmo è il più lungo tempo di esecuzione su tutti gli ingressi di dimensione n. Analogamente, lo spazio di esecuzione nel caso peggiore è il più grande spazio richiesto su tutti gli ingressi di dimensione n.
Ci sono tre buone ragioni per concentrare l'analisi di un algoritmo sul caso peggiore:

Per saperne di più consulta i seguenti approfondimenti:























































Tutto quanto riportato in questa pagina è a puro scopo informativo personale. Se non ti trovi in accordo con quanto riportato nella pagina, vuoi fare delle precisazioni, vuoi fare delle aggiunte o hai delle proposte e dei consigli da dare, puoi farlo mandando un email. Ogni indicazione è fondamentale per la continua crescita del sito.