Complessità Computazionale

Slides:



Advertisements
Presentazioni simili
Strutture dati per insiemi disgiunti
Advertisements

Algoritmi e Strutture Dati
Corso di Laurea Triennale in Ingegneria Gestionale Corso di Fondamenti di informatica A. A A.Pinto Algoritmi di ricerca 1.
Calcolo del minimo comune multiplo (m.c.m.) Luigi Sante
Analisi della complessità degli algoritmi
Analisi della complessità degli algoritmi
Lez. 51 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Complessita'
Hash Tables Indirizzamento diretto Tabelle Hash Risoluzioni di collisioni Indirizzamento aperto.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi.
Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi.
Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi.
Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi.
Iterazione enumerativa (for)
Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi.
Il problema della ricerca Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie.
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Problemi e algoritmi Anno Accademico 2009/2010.
Algoritmi e Strutture Dati (Mod. A)
Alberi di Ricorrenza Gli alberi di ricorrenza rappresentano un modo conveniente per visualizzare i passi di sostitu- zione necessari per risolvere una.
Algoritmi e Strutture Dati III. Algoritmi di Ordinamento
Algoritmi di ordinamento
07/04/2003Algoritmi Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare se un elemento fa parte della sequenza oppure.
Notazioni Asintotiche e Ordini di Grandezza delle funzioni
Fondamenti di Informatica1 Ripetizioni di segmenti di codice Spesso è necessario ripetere più volte uno stesso segmento dell'algoritmo (e.g. I/O, elaborazioni.
Intelligenza Artificiale
COMPLESSITÀ DEGLI ALGORITMI
Fibonacci Heaps e il loro utilizzo nell’algoritmo di Prim
Metodo della moltiplicazione
Elementi di Informatica di base
Strutture dati per insiemi disgiunti
Radix-Sort(A,d) // A[i] = cd...c2c1
Algoritmi e Strutture Dati
Passo 3: calcolo del costo minimo
Per valutare la complessità ammortizzata scomponiamo ogni Union: nelle due FindSet e nella Link che la costituiscono e valuteremo la complessità in funzione.
La complessità media O(n log n) di Quick-Sort vale soltanto se tutte le permutazioni dell’array in ingresso sono ugualmente probabili. In molte applicazioni.
Algoritmi CHE COS’è UN ALGORITMO di ORDINAMENTO?
Complessità degli algoritmi (cenni) CORDA – Informatica A. Ferrari.
Implementazione di dizionari Problema del dizionario dinamico Scegliere una struttura dati in cui memorizzare dei record con un campo key e alcuni altri.
La ricorsione.
Didattica e Fondamenti degli Algoritmi e della Calcolabilità Terza giornata: principali classi di complessità computazionale dei problemi Guido Proietti.
Ordinamento in tempo lineare Il limite inferiore Ω(n log n) vale per tutti gli algoritmi di ordinamento generali, ossia per algoritmi che non fanno alcuna.
Algoritmi e Strutture Dati
Algoritmi Paralleli e Distribuiti a.a. 2008/09 Lezione del 07/04/2009 Prof. ssa ROSSELLA PETRESCHI a cura del Dott. SAVERIO CAMINITI.
Il problema della ricerca Algoritmi e Strutture Dati.
1 Ordinamento (Sorting) INPUT: Sequenza di n numeri OUTPUT: Permutazione π = tale che a 1 ’  a 2 ’  … …  a n ’ Continuiamo a discutere il problema dell’ordinamento:
Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali L’algoritmo Merge-Sort ha complessità O(n log(n))  Algoritmo di ordinamento.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Capitolo 1 Un’introduzione.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie.
1 Ordinamento (Sorting) Input: Sequenza di n numeri Output: Permutazione π = tale che: a i 1  a i 2  ……  a i n Continuiamo a discutere il problema dell’ordinamento:
Il problema della ricerca Algoritmi e Strutture Dati.
Analisi asintotica e Metodi di analisi Algoritmi e Strutture Dati.
Problemi risolvibili con la programmazione dinamica Abbiamo usato la programmazione dinamica per risolvere due problemi. Cerchiamo ora di capire quali.
Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quinta giornata Risolvere efficientemente un problema in P: ancora sulla sequenza di Fibonacci.
Didattica e Fondamenti degli Algoritmi e della Calcolabilità Sesta giornata Risolvere efficientemente un problema in P: Il problema dell’ordinamento: Insertion.
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento: lower bound Ω(n log n) e MergeSort ((*) l’intera lezione) Algoritmi e Strutture Dati.
Sistemi e Tecnologie Informatiche Complessità di calcolo.
Informatica 3 V anno.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Capitolo 1 Un’introduzione.
Divide et Impera Parte 11 - Risoluzione di problemi per divisione in sottoproblemi “bilanciati” Corso A: Prof. Stefano Berardi
Rudimenti di Complessità Corso di Programmazione II Prof. Dario Catalano.
Algoritmi Avanzati a.a.2010/2011 Prof.ssa Rossella Petreschi Complessità e Trasportabilità Lezione n°3.
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo La ricorsione 15 Approccio ricorsivo, esercizi sulla.
Prof.ssa Rossella Petreschi Lezione del 1 /10/2012 del Corso di Algoritmi e Strutture Dati Riferimenti: Capitoli da 1 a3 del testo Giorgio Ausiello, Rossella.
Transcript della presentazione:

Complessità Computazionale Algoritmi di ricerca Per ricerca si intende qui il procedimento di localizzare una particolare informazione in un elenco di dati. Per esempio: - cercare il numero di Ermenegildo Rossi nell'elenco del telefono; - cercare il re di denari in un mazzo di carte mescolate. Dai precedenti esempi si intuisce che il metodo di ricerca dipende da come le informazioni sono organizzate.

Il problema si può porre in termini generali così: Il problema della ricerca Dato un insieme L = {a1 ,a ,...,an} di n elementi distinti e un elemento x, determinare se x appartiene all'insieme

Ricerca lineare Se non abbiamo alcuna informazione circa l'ordine degli elementi nell'insieme, l'unico metodo per localizzare un particolare elemento è una ricerca lineare; cioè si parte dal primo elemento e si procede esaminando uno per uno tutti gli elementi finché non si verifica una delle due condizioni: l'elemento cercato è stato individuato nella posizione i (x = a[i]), abbiamo scandito tutti gli elementi dell'insieme senza aver trovato l'elemento x.

Algoritmo Ricerca 1: for (i = 0; i < n && a[i] != x; i++); if (i < n) cout << "Trovato al posto " << i << endl; else cout << "Non trovato" << endl;

La seguente è una variante dell'algoritmo precedente, dove x viene inserito come (n+1)-esimo elemento dell'insieme. Algoritmo Ricerca 2: a[n] = x; for (i=0; a[i]!=x; i++); if (i<n) cout << "Trovato al posto " << i << endl; else cout << "Non trovato" << endl;

Osserviamo che in quest'ultimo algoritmo dobbiamo eseguire un solo confronto per ciclo invece di due, come nel precedente. Nel caso più sfavorevole, quando l'elemento x non si trova nell'insieme L, l'algoritmo Ricerca 1 effettua 2n confronti e l'algoritmo Ricerca 2 effettua n+1 confronti. Osserviamo però che le due funzioni 2n e n+1 sono dello stesso ordine O(n).

Complessità computazionale di un problema Definizioni: Una funzione f(n) ha ordine O(g(n)) se e solo se esistono due costanti positive c ed n’ tali che |f(n)|  c|g(n)| per ogni n  n’. Un algoritmo ha una complessità O(g(n)) se il tempo di calcolo t(n) sufficiente per eseguire l'algoritmo con ogni istanza (l'insieme dei dati su cui è definito il problema) di dimensione n ha ordine O(g(n))

Dal punto di vista della complessità i due algoritmi di ricerca esaminati precedentemente sono equivalenti; infatti il tempo di esecuzione cresce sempre linearmente con n in entrambi i casi. La complessità di un algoritmo è funzione della lunghezza dell'istanza. L'analisi che viene fatta è asintotica; cioè si valuta la complessità dell'algoritmo esaminandone il comportamento al limite per valori della lunghezzadelle istanze tendenti all'infinito.

Regole per il calcolo del costo Caso migliore, inteso come quell’insieme di valori di ingresso che rendono minima la funzione di conteggio Caso Medio, inteso come media dei costi rispetto a tutti i possibili casi di ingresso Caso Peggiore, inteso come quell’insieme di valori di ingresso che rendono massima la funzione di conteggio

Ricerca binaria Supponiamo che l'insieme L = {a1 ,a2 ,...,an} sia ordinato, cioè che si abbia ai  ai+1 per ogni i compreso tra 1 e n-1. Possiamo in questo caso applicare un algoritmo migliore dal punto di vista della complessità computazionale, il cosiddetto algoritmo della ricerca binaria.

Algoritmo Ricerca binaria: max = n-1; min = 0; trovato = 0; while (!trovato && max>=min) { med = (max+min)/2; if (a[med] == x) trovato = 1; else if (a[med] > x) max = med-1; else min = med+1; } cout << x; if (trovato) cout << " si trova nell'insieme alla posizione " << med; else cout << " non si trova nell'insieme";

Per studiare la complessità dell'algoritmo della ricerca binaria occorre valutare quante volte viene eseguito il ciclo while nel caso peggiore, che è quello in cui x non si trova nell'insieme. Considerando che a ogni iterazione l'insieme è dimezzato, il numero di iterazioni è pari a quante volte un numero n può essere diviso per 2 fino a ridurlo a 0. Questo numero è il più piccolo intero non minore di 1+log n; quindi possiamo concludere che l'algoritmo 2 della ricerca binaria ha complessità O(log n).

Se per esempio dovessimo cercare un elemento in un insieme di 1. 000 Se per esempio dovessimo cercare un elemento in un insieme di 1.000.000 di elementi, nei casi più sfortunati con gli algoritmi Ricerca 1 e Ricerca 2 dovremmo eseguire circa 1.000.000 di iterazioni, mentre con la Ricerca binaria ne dobbiamo effettuare al massimo solamente 21. È possibile abbassare ulteriormente la complessità? La risposta è negativa; infatti si può dimostrare che, qualunque possa essere l'algoritmo considerato, un numero logaritmico di passi è comunque necessario per poter risolvere il problema della ricerca.

La delimitazione inferiore alla complessità computazionale di un problema La delimitazione inferiore fornisce la complessità intrinseca del problema. Una funzione f(n) è (g(n)) se e solo se esistono due costanti c e n' tali che |f(n)|  c|g(n)| per ogni n  n'. Un problema ha una delimitazione inferiore alla complessità (g(n)) se, qualunque sia l'algoritmo di risoluzione, per ogni n, esiste una istanza per cui il tempo di calcolo necessario t(n) è (g(n))

(g(n)) rappresenta quindi la complessità intrinseca di un problema che dipende dalle sue caratteristiche strutturali. Un algoritmo che risolve un problema P si dice ottimale se valgono le due seguenti condizioni: l'algoritmo risolve P con un costo di esecuzione O(g(n)) P ha una delimitazione inferiore (g(n)) L'algoritmo della ricerca binaria è un esempio di algoritmo ottimale.

Classi di complessità Complessità costante O(1) È posseduta dagli algoritmi che eseguono sempre lo stesso numero di operazioni indipendentemente dalla dimensione dei dati. Es.: inserimento o estrazione dalla testa di una lista concatenata, ecc. Complessità sottolineare O(nk ), con k<1 Es.: O(logn), Ricerca binaria, o logaritmica, ecc. Complessità lineare O(n) È posseduta dagli algoritmi che eseguono un numero di operazioni sostanzialmente proporzionale ad n. Es.: ricerca sequenziale, somma di numeri di n cifre, merge di due file, ecc.

Complessità n log n O(n log n) Es.: Algoritmi di ordinamento ottimi. Complessità nk, con k 2 O(nk) Es.: Bubblesort ( O(n2) ), moltiplicazione di due 2 matrici ( O(n3 ) ), ecc

Complessità esponenziale Tutte le classi di complessità elencate precedentemente vengono genericamente considerate come polinomiali. Esse sono caratterizzate dal fatto che la dimensione n non compare mai come esponente in alcun modo. Quando ciò avviene si parla invece di complessità esponenziale. Es.: un algoritmo che debba produrre tutte le possibili stringhe lunghe n di k simboli avrà complessità O(kn ), cioè esponenziale.

È necessario guardare con particolare diffidenza agli algoritmi dotati di complessità esponenziale, perché possono richiedere dei tempi di esecuzione proibitivi anche per valori relativamente piccoli di n ed indipendentemente dalla velocità dell'elaboratore. Purtroppo esistono molti problemi, anche di interessepratico, per i quali non si conoscono ancora algoritmi non esponenziali (problemi intrattabili). Es.: problema del commesso viaggiatore.

Una funzione f(n) è limitata superiormente da una funzione g(n) se esiste un intero n0 tale che, per ogni n  n0 , f(n)  g(n). Una funzione polinomiale f(n) è una funzione limitata superiormente da nk per un opportuno fissato intero k. Un algoritmo si dice efficiente se il suo tempo di esecuzione è limitato superiormente da una funzione polinomiale. Un problema è computazionalmente trattabile se esiste un algoritmo efficiente che lo risolve; altrimenti il problema è computazionalmente intrattabile.