martedì 19 dicembre 2023

Corso ALGORITMI PER LA PROGRAMMAZIONE: Lezione 6 Complessità

6-Complessità: Gli algoritmi possono essere valutati in base alla loro complessità in termini di tempo e spazio. L'analisi della complessità aiuta a determinare quanto tempo impiega un algoritmo per eseguire un'operazione o quanto spazio di memoria richiede.

L'analisi della complessità degli algoritmi è un aspetto cruciale nella progettazione e nell'analisi degli algoritmi stessi. L'analisi della complessità temporale e spaziale fornisce una valutazione delle prestazioni degli algoritmi, consentendo di comprendere quanto tempo impiegheranno per eseguire in relazione alla dimensione dell'input e quanta memoria utilizzeranno.


6.1-Complessità temporale: La complessità temporale di un algoritmo descrive il numero di operazioni (o passaggi) che un algoritmo compie in relazione alla dimensione dell'input. È un modo per valutare quanto tempo impiega un algoritmo per completare l'esecuzione in termini di "passi" di calcolo. La complessità temporale può essere espressa in notazione "grande O" (O) che fornisce un limite superiore approssimato del tempo di esecuzione in base alle dimensioni dell'input.

Ad esempio, se un algoritmo ha una complessità temporale di 

O(n), ciò significa che il tempo di esecuzione dell'algoritmo cresce linearmente all'aumentare della dimensione dell'input n.
Altri esempi includono 

O(logn) (logaritmico), 

O(n ^2) (quadratico), 

O(2 ^n ) (esponenziale), ecc.


La complessità temporale è un concetto fondamentale nell'analisi degli algoritmi che misura quanto tempo impiega un algoritmo per eseguire in relazione alla dimensione dell'input. Indica come il tempo di esecuzione di un algoritmo cresce al variare delle dimensioni dell'input e offre una stima della sua efficienza in base alla scalabilità.


Notazione O-grande (Big O):

La notazione O-grande (Big O) è ampiamente utilizzata per esprimere la complessità temporale degli algoritmi. Rappresenta il limite superiore asintotico del tempo di esecuzione in termini di crescita della dimensione dell'input. Alcuni esempi comuni di complessità temporale espressi con la notazione Big O:


O(1): Complessità costante. L'algoritmo esegue in un tempo fisso indipendentemente dalle dimensioni dell'input.

O(log n): Complessità logaritmica. L'algoritmo scala in modo logaritmico rispetto alla dimensione dell'input.

O(n): Complessità lineare. L'algoritmo esegue proporzionalmente alla dimensione dell'input.

O(n^2): Complessità quadratica. L'algoritmo scala in modo quadrato rispetto alla dimensione dell'input.

O(2^n): Complessità esponenziale. L'algoritmo cresce esponenzialmente con l'aumentare dell'input.

Analisi della complessità temporale:

L'analisi della complessità temporale coinvolge la valutazione dell'efficienza di un algoritmo in termini di tempo di esecuzione al variare delle dimensioni dell'input. Le fasi comuni includono:


Identificazione delle operazioni chiave: Determinare le operazioni fondamentali eseguite dall'algoritmo (es. iterazioni, operazioni aritmetiche, chiamate a funzioni).


Stima del tempo di esecuzione: Valutare quanti passaggi esegue l'algoritmo in relazione alla dimensione dell'input.


Espressione della complessità: Esprimere il tempo di esecuzione dell'algoritmo in notazione Big O per identificare la complessità temporale nel caso peggiore, medio o migliore.


Importanza della complessità temporale:

Ottimizzazione: Aiuta a identificare algoritmi più efficienti per risolvere un problema.

Scelta dell'algoritmo: Consente di selezionare l'algoritmo più adatto in base alle dimensioni dell'input e ai requisiti di tempo.

Previsione delle prestazioni: Fornisce una stima delle prestazioni dell'algoritmo all'aumentare delle dimensioni dei dati.

La comprensione della complessità temporale è cruciale per i programmatori, poiché consente di scrivere codice più efficiente, selezionare gli algoritmi appropriati e prevedere il comportamento dell'algoritmo al variare delle dimensioni dell'input.


6.2-Complessità spaziale: La complessità spaziale di un algoritmo descrive la quantità di memoria (spazio) richiesta dall'algoritmo in relazione alla dimensione dell'input. È un'indicazione di quanto spazio di memoria viene utilizzato per eseguire l'algoritmo in base alle dimensioni dell'input.

Ad esempio, se un algoritmo ha una complessità spaziale di 

O(n), ciò significa che l'algoritmo utilizza una quantità di memoria che cresce linearmente all'aumentare della dimensione dell'input n.
Altri esempi includono 

O(1) (costante), 

O(n^2) (quadratico), 

O(logn) (logaritmico), ecc.


La complessità spaziale è un concetto nell'analisi degli algoritmi che misura la quantità di memoria (spazio) richiesta da un algoritmo in relazione alla dimensione dell'input. Indica la quantità di memoria aggiuntiva necessaria per eseguire un algoritmo in base alla crescita delle dimensioni dei dati in input.


Notazione O-grande (Big O) per la complessità spaziale:

Come nella complessità temporale, la notazione O-grande (Big O) è utilizzata per esprimere la complessità spaziale degli algoritmi. Rappresenta il limite superiore asintotico della quantità di memoria aggiuntiva richiesta dall'algoritmo in base alla dimensione dell'input.


Alcuni esempi comuni di complessità spaziale espressi con la notazione Big O:


O(1): Complessità spaziale costante. L'algoritmo richiede una quantità fissa di memoria indipendentemente dalle dimensioni dell'input.

O(log n): Complessità spaziale logaritmica. L'algoritmo richiede memoria proporzionalmente al logaritmo delle dimensioni dell'input.

O(n): Complessità spaziale lineare. L'algoritmo richiede una quantità di memoria proporzionale alla dimensione dell'input.

O(n^2): Complessità spaziale quadratica. L'algoritmo richiede una quantità di memoria proporzionale al quadrato delle dimensioni dell'input.

O(2^n): Complessità spaziale esponenziale. L'algoritmo richiede una quantità di memoria che cresce in modo esponenziale con l'aumentare dell'input.

Analisi della complessità spaziale:

L'analisi della complessità spaziale coinvolge la valutazione di quanta memoria viene utilizzata dall'algoritmo durante l'esecuzione, in relazione alla dimensione dell'input. Questo comprende:


Identificazione della memoria utilizzata: Valutare la quantità di memoria richiesta per variabili, strutture dati, stack di chiamate e altri elementi durante l'esecuzione dell'algoritmo.


Stima della quantità di memoria: Calcolare la quantità di memoria richiesta in base alla dimensione dell'input, considerando anche la memoria temporanea e la memoria ausiliaria.


Espressione della complessità spaziale: Esprimere la quantità di memoria richiesta dall'algoritmo utilizzando la notazione Big O per identificare la complessità spaziale nel caso peggiore, medio o migliore.


Importanza della complessità spaziale:

Ottimizzazione della memoria: Aiuta a identificare algoritmi più efficienti in termini di utilizzo della memoria.

Gestione delle risorse: È importante in applicazioni con vincoli di memoria, come sistemi embedded o applicazioni su dispositivi con limitata capacità di memoria.

Valutazione dell'efficienza complessiva: Combinata con la complessità temporale, offre una valutazione completa dell'efficienza di un algoritmo.

La comprensione della complessità spaziale è essenziale per sviluppare algoritmi efficienti che utilizzano in modo ottimale le risorse di memoria disponibili. Una buona progettazione degli algoritmi tiene conto sia della complessità spaziale che temporale per garantire prestazioni ottimali in varie situazioni.


Nessun commento:

Posta un commento