Complessità computazionale - Informatica Scienze Applicate

Complessità computazionale
In informatica per risolvere i problemi si utilizzano degli algoritmi, dei pezzi di codice che
risolvono in modo efficiente una particolare classe di problemi,
si parla ad esempio dell'algoritmo dell'ordinamento oppure dell'algoritmo della ricerca dicotomica
etc.
Quando si va a valutare l'efficienza di un algoritmo la si sintetizza mediante un indice detto ordine
della complessità computazionale dell'algoritmo che identifica il numero di operazioni necessarie
per risolvere un problema generico con quel particolare algoritmo. Più in generale un algoritmo
viene valutato non solo in termini di istruzioni necessarie ma anche per l'utilizzo della memoria.
La lettera O (si legge o grande) indica il grado di complessità, e dopo questo simbolo racchiuso fra
parentesi si indica il numero o l'espressione che ci permette di calcolarne il grado.Se si scrive O(3)
si intende che il numero di operazioni per eseguire l'algoritmo e' pari a 3, se si scrive O(n) ,con n si
intende si solito il numero di elementi caricati in un vettore che devono essere analizzati, si intende
che il numero di operazioni è proporzionale alla dimensione del vettore (cioe' al numero di elementi
contenuti nel vettore)
se si scrive O(4n) è come nel caso O(n) ma si è individuata anche la costante di proporzionalità (4)
rispetto al numero di elementi del vettore, se trovate O(n2 ) vuol dire che il numero di operazioni
segue una legge quadratica rispetto al numero di elementi contenuti nel vettore di dimensione n.
Qualche volta il calcolo e' meno precisa se trovate O(1) se i dati sono contenuti in un vettore indica
che le operazioni da eseguirsi sono indipendenti dal numero di elementi in un vettore O(log2n) che
le operazioni da eseguirsi seguono una legge logaritmica rispetto al numero di elementi del vettore
O(n) operazioni sono proporzionali al numero di elementi contenuti nel vettore.
Se gli elementi del vettore sono n un algoritmo molto veloce ha O(k) con k= costante, uno veloce ha
un andamento logaritmico, uno normale ha complessità lineare O(n) oppure O(kn) , le cose vanno
male se O(nlog2 n) e vanno molto male se le leggi diventano quadratiche o di grado superiore O(n2)
O(n3) .
Naturalmente il confronto deve essere fatto su algoritmi diversi che risolvono la stessa classe di
problemi. Nella pratica qualche volta è semplice individuare l'ordine di complessità altre volte no,
in alcuni casi l'ordine di complessità dipende dai particolari valori contenuti nel vettore , in questo
caso si fornisce l'ordine di complessità nel caso peggiore, in una situazione media e nella situazione
migliore, in alcuni casi il calcolo diventa difficile e si utilizzano programmi software detti profiler
che analizzano i nostri algoritmi in casi reali fornendo informazioni sull'uso della CPU della
memoria RAM e del numero di chiamate alle diverse funzioni.State attenti che istruzioni diverse fra
loro di un programma richiedono tempi di esecuzione diversi, incrementare una variabile richiede
magari un ciclo della cpu, moltiplicare 2 numeri in virgola mobile richiede 100 cicli della cpu.
Riassumendo l'ordine di complessità ci fornisce un parametro sintetico della velocita' di esecuzione
dello stesso in funzione del numero di dati da elaborare, se non ci basta l'ordine della complessità
questo non è di facile calcolo perché dipende anche dai valori assunti dai dati allora bisogna usare
un profiler applicato a specifici casi.