



Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
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
1 / 5
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!




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.
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 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.
Complessità temp ale Utilizzare la complessità temporale signi ca: ● 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 classi cati 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 veri care 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 a nché 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 de nisce 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.
La complessità asintotica è come si comporta l’algoritmo in modo approssimato al variare della dimensione del problema. L’obiettivo è quello di e ettuare un confronto tra gli algoritmi che hanno tempi di esecuzione di erenti. 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’in nito.
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’in nito. 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))
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))
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))
Possiamo classi care gli algoritmi in due classi principali:
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).
I problemi possono essere classi cati 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 e ciente (un algoritmo è e ciente se il tempo di esecuzione è un polinomio) che lo risolve. I problemi computabili “fanno parte” dei problemi intrattabili; ● non computabili. Quindi possiamo dire che: