Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Analisi degli algoritmi: criteri per valutare l'efficienza, Schemi e mappe concettuali di Informatica

Una panoramica sui criteri per stabilire se un algoritmo è migliore di un altro, considerando fattori come tempo di esecuzione, risorse necessarie e complessità dei problemi. Vengono esplorati i parametri di qualità di un algoritmo, la complessità temporale e spaziale, il concetto di complessità asintotica e la classificazione degli algoritmi in base alla crescita polinomiale o esponenziale. Vengono inoltre presentati i problemi di decisione, ottimizzazione, enumerazione e ricerca, e la classificazione dei problemi come computabili, intrattabili o non computabili.

Tipologia: Schemi e mappe concettuali

2020/2021

In vendita dal 24/04/2024

liaame3173
liaame3173 🇮🇹

4

(1)

91 documenti

1 / 5

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Analisi degli algoritmi
L’obiettivo è quello di trovare dei criteri per stabilire se un algoritmo è migliore di un altro, dato che per
risolvere un certo problema possiamo usare algoritmi diversi.
I fattori da considerare sono:
tempo di esecuzione, tempo impiegato per dare la risposta;
risorse necessarie, input, output ecc,
Faremo riferimento al tempo di esecuzione per misurare l’ecienza di un algoritmo.
Un algoritmo risolve una classe di Problemi (per denizione è generico).
Parleremo quindi di complessità dei problemi, ogni Algoritmo sarà classicato in una classe di complessità.
Un problema è formato da:
descrizione generale, in cui sono presenti le variabili o i dati del problema;
questione, cosa la soluzione deve soddisfare.
Dato un problema, le variabili di input possono assumere diversi valori (generico), e per ogni valore che
assumono si parla di istanza di un problema, ovvero l’insieme dei possibili valori di input.
Esempio: Determinare se un numero N è primo → ogni valore di N è un’istanza del problema
N, ovvero la dimensione dell'istanza, è detta cardinalità dei dati in input.
Per ogni istanza l’algoritmo risolutore deve fornire una soluzione indipendentemente dai valori, dal tipo e
dalla cardinalità delle variabili di input.
Un Algoritmo Arisolve un problema πse applicato ad ogni sua istanza Iproduce la soluzione corretta.
Parametri di qualità di un algitmo
Parametri soggettivi:
semplicità del codice;
accessibilità al codice da parte di altri utenti;
qualità di scrittura del codice;
interfaccia graca.
Per poter avere criteri universali occorre scegliere parametri oggettivi indipendenti da chi eettua la
classicazione. Possiamo usare 4 parametri detti criteri di ecienza:
tempo impiegato (complessità temporale), tempo per l’esecuzione dell’algoritmo;
spazio utilizzato (complessità Spaziale): occupazione di memoria;
quantità e modalità di input/output, tempo impiegato per acquisire input e produrre output;
tempo di trasmissione, tiene conto dei tempi di trasferimento dati con ad altri computer o con
memorie remote (Cloud).
Per valutare la bontà di un algoritmo si utilizzano, tipicamente, i primi due perchè possono essere
determinati e calcolati a priori senza dover necessariamente eseguire l’algoritmo.
pf3
pf4
pf5

Anteprima parziale del testo

Scarica Analisi degli algoritmi: criteri per valutare l'efficienza e più Schemi e mappe concettuali in PDF di Informatica solo su Docsity!

Analisi degli algoritmi

L’obiettivo è quello di trovare dei criteri per stabilire se un algoritmo è migliore di un altro, dato che per risolvere un certo problema possiamo usare algoritmi diversi. I fattori da considerare sono: ● tempo di esecuzione, tempo impiegato per dare la risposta; ● risorse necessarie, input, output ecc, Faremo riferimento al tempo di esecuzione per misurare l’ecienza di un algoritmo. Un algoritmo risolve una classe di Problemi (per denizione è generico ). Parleremo quindi di complessità dei problemi, ogni Algoritmo sarà classicato in una classe di complessità. Un problema è formato da: ● descrizione generale , in cui sono presenti le variabili o i dati del problema; ● questione , cosa la soluzione deve soddisfare. Dato un problema, le variabili di input possono assumere diversi valori (generico), e per ogni valore che assumono si parla di istanza di un problema, ovvero l’insieme dei possibili valori di input.

Esempio : Determinare se un numero N è primo → ogni valore di N è un’istanza del problema

N, ovvero la dimensione dell'istanza, è detta cardinalità dei dati in input. Per ogni istanza l’algoritmo risolutore deve fornire una soluzione indipendentemente dai valori, dal tipo e dalla cardinalità delle variabili di input. Un Algoritmo A risolve un problema π se applicato ad ogni sua istanza I produce la soluzione corretta.

Parametri di qualità di un algitmo

Parametri soggettivi: ● semplicità del codice; ● accessibilità al codice da parte di altri utenti; ● qualità di scrittura del codice; ● interfaccia graca. Per poter avere criteri universali occorre scegliere parametri oggettivi indipendenti da chi eettua la classicazione. Possiamo usare 4 parametri detti criteri di ecienza: ● tempo impiegato (complessità temporale), tempo per l’esecuzione dell’algoritmo; ● spazio utilizzato (complessità Spaziale): occupazione di memoria; ● quantità e modalità di input/output , tempo impiegato per acquisire input e produrre output; ● tempo di trasmissione , tiene conto dei tempi di trasferimento dati con ad altri computer o con memorie remote (Cloud). Per valutare la bontà di un algoritmo si utilizzano, tipicamente, i primi due perchè possono essere determinati e calcolati a priori senza dover necessariamente eseguire l’algoritmo.

Complessità tempale Utilizzare la complessità temporale signica: ● stimare la quantità di tempo che occorre alla CPU per eseguire il programma; ● non ha senso cronometrare un algoritmo e non deve dipendere dall’hardware, perché se abbiamo due computer con CPU diversa, il tempo di esecuzione sarà diverso; ● il tempo non potrà essere espresso in secondi. Viene, dunque, valutato l’algoritmo e non il programma, per questo si procede con l’analisi della complessità computazionale dell'algoritmo. Gli algoritmi sono classicati in base all’ordine di grandezza del numero di istruzioni che devono essere svolte per ottenere l’output in funzione della cardinalità dell’input. La complessità dipende anche dai dati in base ai quali abbiamo: ● caso migliore; ● caso peggiore; ● caso medio. Per confrontare gli algoritmi si considera sempre quello peggiore. Esempio : ordinamento di un vettore crescente. Il caso migliore: già ordinato; caso peggiore:ordinato in modo decrescente. Inoltre, è importante vericare come si comporta l’algoritmo in modo approssimato al variare della dimensione del problema: parliamo di complessità asintotica. La complessità di un algoritmo viene espressa attraverso una funzione T(n) dove n indica la dimensione del problema ovvero i dati in input. La funzione T(n) indica il tempo necessario anché l'algoritmo A produca la soluzione sull’istanza di dimensione n. Caso peggiore : Tp(n)=max[T(x) per ogni x istanza del problema]. Per determinare la funzione T(n) parliamo del concetto di costo unitario delle istruzioni. Si denisce istruzione a costo unitario un’operazione la cui esecuzione non dipende né dal valore né dal tipo di variabile. Questa Istruzione prende il nome di passo base ( Input/output, Operazioni Aritmetiche Elementari, Espressioni di confronto, Accesso a elementi di un vettore, Selezione). Esempio : k=0; While(k<=n) k=k+1; Totale passi base = 1+n+1+n= 2+2n.

Complessità asintotica

La complessità asintotica è come si comporta l’algoritmo in modo approssimato al variare della dimensione del problema. L’obiettivo è quello di eettuare un confronto tra gli algoritmi che hanno tempi di esecuzione dierenti. Al crescere di N risulta determinante l'ordine di grandezza con cui la funzione cresce al crescere di N La complessità asintotica è lo studio di come si comporta l'algoritmo in modo approssimativo al tendere di n all’innito.

Limite inferie di complessità

Un algoritmo A ha complessità O(f(n)) se esistono tre costanti a,b,n1 tali che Tempo di A(n) < a*f(n)+b per ogni n>n O(f(n)) si dice limite inferiore al comportamento asintotico di una funzione. Il comportamento asintotico si ha quando n tende all’innito. Quindi basta studiare il termine che fa crescere di più la funzione. La scrittura O(g(n)) prende il nome di notazione O-grande ed è una funzione matematica che divide gli algoritmi in classi di appartenenza. ● Ogni funzione polinomiale è O-grande di n elevato al grado del polinomio ● Se f(n) è O(h(n)) e g(n) è O(h(n)) allora f(n)+ g(n) è O(h(n)) ● Se f(n) è O(h(n)) e g(n) è O(i(n)) allora f(n)* g(n) è O(h(n) *i(n))

Teema dea somma

Se un algoritmo ha più blocchi in sequenza (While, for, ecc...) la complessità è quella del blocco con complessità maggiore: O(g1(n)+ g2(n))=O(max(g1(n),g2(n))

Teema del prodotto

Se un algoritmo ha più blocchi annidati (for in for...) se g1(n) è la complessità del blocco esterno e g2(n) è quella del blocco interno, allora la complessità globale è data dal prodotto delle complessità. O(g1(n)* g2(n))=O(g1(n))*O(g2(n))

Classi di appartenenza

Possiamo classicare gli algoritmi in due classi principali:

  1. Algoritmi in crescita polinomiale (polinomio, logaritmo)
  2. Algoritmi in crescita esponenziale (esponenziale, fattoriale) Per alcuni algoritmi non è semplice calcolare i passi base, si usa dunque il concetto di istruzione dominante. Dato un algoritmo il cui costo è t(n) un’istruzione dell’algoritmo è detta dominante quando, per ogni intero n, viene eseguita un numero d(n) di volte tale che t(n)< ad(n)+b* con a e b=costanti Dunque, viene eseguito un numero di volte proporzionale alla complessità (o costo) dell’algoritmo. L’istruzione dominante è l'istruzione che viene eseguita più volte. Per determinare la complessità asintotica basta individuarla.

Se l’istruzione dominante d viene eseguita n volte la complessità dell’algoritmo si riduce a quella legata all’istruzione dominante ovvero la sua complessità è O(d(n)). Esempio : while (k<n) if (v[k]==elem) k++ sono istruzioni che vengono eseguite n volte, il costo lineare sarà O(n).

Classificazione dei problemi

I problemi possono essere classicati in problemi di: ● decisione , soluzione tra due possibilità ( vero/falso ). Tutti i problemi possono essere ricondotti a essi; ● ottimizzazione , scelta tra un insieme di possibili alternative, deve fornire la soluzione migliore; ● enumerazione , la soluzione è un risultato calcolato; ● ricerca , ricerca un valore tra i dati a disposizione (vedi se c’è il numero 7 nel vettore). I problemi possono essere: ● Computabili (P) → un problema è detto computabile quando esiste un algoritmo che lo risolve, cioè applicandolo a qualunque istanza del problema ne fornisce la soluzione. I problemi computabili sono: costante, logaritmica, pseudo-logaritmica, lineare, N^k(k>=2), esponenziale (quindi polinomiali ed esponenziali). Un problema è, dunque, detto computabile quando esiste un algoritmo che lo risolve ma in un tempo accettabile. Quindi è computabile se, e solo se, è risolto da almeno un algoritmo con complessità di calcolo di tipo polinomiale. ○ Vi sono però problemi computabili ma non risolvibili (esiste almeno un algoritmo risolutore ma richiede tempo elevatissimo): vengono detti intrattabili (EXP). Quindi un problema viene detto intrattabile quando è un problema risolubile ma per il quale non esiste un algoritmo di complessità polinomiale che lo risolve; ○ è detto trattabile se esiste un algoritmo eciente (un algoritmo è eciente se il tempo di esecuzione è un polinomio) che lo risolve. I problemi computabili “fanno parte” dei problemi intrattabili; ● non computabili. Quindi possiamo dire che: