1
Fork 0
mirror of https://github.com/Steffo99/appunti-magistrali.git synced 2024-11-22 10:44:17 +00:00
appunti-steffo/2 - Algoritmi e strutture dati/1 - Appunti/02 - Efficienza degli algoritmi.md

2.3 KiB

Efficienza degli algoritmi

Un buon algoritmo deve essere efficiente, ovvero deve usare il minimo delle risorse necessarie, come usare il minimo di tempo possibile.

Come misuriamo il tempo necessario?

Cerchiamo di astrarre il tempo dal particolare esecutore, e andiamo a contare il numero di operazioni elementari richieste per eseguire il nostro algoritmo nel caso peggiore.

Un algoritmo efficiente, infatti, all'aumentare dei dati in ingresso, diventerà sempre più veloce rispetto a uno non efficiente, anche su computer più lenti!

Il Bubble Sort è sempre più lento di un Tree Sort, anche su computer più lenti, perchè, dovendo ordinare liste sempre più lunghe, prima o poi si raggiunge un punto in cui il primo è più veloce (in termini di tempo) dell'altro.

Dobbiamo andare a vedere, quindi, il numero di operazioni richieste per ottenere il risultato nel caso peggiore.

Consideriamo operazioni sia operazioni aritmetiche sia operazioni logiche, e diciamo che ciascuna costa 1.

L'algoritmo di Euclide per l'MCD costa 3 per ogni iterazione (un giro del ciclo while). Diciamo, allora, che costa 3n, dove n è il numero più alto dei due, perchè nel caso peggiore (uno dei due numeri è 1) l'algoritmo compie n iterazioni.

Altri parametri ottimizzabili

È possibile che alcuni algoritmi per vari motivi cerchino di ottimizzare altri parametri diversi dal tempo, come ad esempio la dimensione dell'input o la memoria utilizzata.

Generalmente, questo viene fatto sui dispositivi embedded, con memoria molto limitata.

Criteri di costo di memoria

Ci sono vari criteri con cui stimare la memoria richiesta da un dato: è possibile che il costo risultante vari in base al criterio scelto!

Criterio di costo logaritmico

Un dato costa il numero di bit necessari per rappresentarlo.

Un int che contiene il numero n costa log_2(n).
Un array di [n] numeri tutti uguali costa n log_2(n).

Criterio di costo uniforme

Un dato costa il numero di elementi che lo costituiscono.

Un int che contiene il numero n costa 1.
Un array di [n] numeri costa n.
Una matrice [m][n] costa m*n.