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.