La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Fondamenti di Informatica I a.a. 2008-09 1 Algoritmi e complessità La complessità Complessità in tempo e spazio Complessità asintotica Algoritmi e complessità

Presentazioni simili


Presentazione sul tema: "Fondamenti di Informatica I a.a. 2008-09 1 Algoritmi e complessità La complessità Complessità in tempo e spazio Complessità asintotica Algoritmi e complessità"— Transcript della presentazione:

1 Fondamenti di Informatica I a.a Algoritmi e complessità La complessità Complessità in tempo e spazio Complessità asintotica Algoritmi e complessità Ricerca e ordinamento La macchina di Turing e le classi di complessità

2 Fondamenti di Informatica I a.a La complessità

3 Fondamenti di Informatica I a.a La complessità Lanalisi di complessità definisce le risorse teoricamente consumate da un algoritmo complessità temporale complessità temporale: tempo necessario allesecuzione dellalgoritmo complessità spaziale complessità spaziale: memoria necessaria allesecuzione dellalgoritmo Poiché ad ogni algoritmo corrispondono più implementazioni (più programmi), lo studio della complessità non definisce esattamente il tempo e la memoria usata: si concentra sulle proprietà che sono indipendenti dellimplementazione fornendo unidea di quanto sia efficiente un algoritmo

4 Fondamenti di Informatica I a.a Complessità temporale Si contano le istruzioni eseguite dallalgoritmo Poiché le istruzioni potrebbero essere di natura diversa, si individuano quelle che incidono principalmente sul tempo di esecuzione Le operazioni in virgola mobile Le operazioni in virgola mobile: le più lente da eseguire per una CPU; sono predominanti se il loro numero è paragonabile al numero delle altre istruzioni Le istruzioni di controlloif Le istruzioni di controllo (gli if) e le istruzioni più frequenti (sono predominanti se sono in numero molto superiore alle altre istruzioni) Le istruzioni di accesso alla memoria secondaria e alle periferiche sono decine di migliaia di volte più lente delle istruzioni svolte nella memoria principale Le istruzioni di accesso alla memoria secondaria e alle periferiche: sono decine di migliaia di volte più lente delle istruzioni svolte nella memoria principale; se unapplicazione ne richiede molte, queste potrebbero essere predominanti (ad es., nei database, lanalisi di complessità è concentrata sugli accessi al disco) Che cosa si misura? 1

5 Fondamenti di Informatica I a.a Complessità spaziale Si misurano le posizioni di memoria occupate dai dati necessari allo svolgimento dellalgoritmo La complessità spaziale sarà misurata relativamente alla memoria principale se i dati dellalgoritmo possono essere allocati in memoria principale, in base alloccupazione di memoria secondaria quando le strutture dati dellalgoritmo sono troppo grandi per poter risiedere nella memoria centrale Che cosa si misura? 2

6 Fondamenti di Informatica I a.a Lo studio della complessità si concentra su i casi in cui il problema è grande: non importa se un programma di contabilità impiega 1 o 100 millisecondi a calcolare il bilancio cambia molto se il programma della segreteria impiega 1 o 10 secondi a trovare i dati di uno studente nellarchivio Complessità asintotica Definisce le risorse usate da un algoritmo al crescere della dimensione del problema affrontato Ad esempio: come cambia il tempo di accesso ai dati quando cresce il numero degli studenti nellarchivio della segreteria Complessità asintotica

7 Fondamenti di Informatica I a.a ordine di grandezza Formalmente, si usa il concetto matematico di ordine di grandezza dimensione sia n la dimensione del problema, cioè la dimensione dellinput dellalgoritmo tempo sia T(n) il tempo impiegato per lesecuzione dellalgoritmo quando lingresso ha dimensione n sia f(n) una qualsiasi funzione di n, ad esempio 3, n, n 2, n 5, 2 n è dellordine di f(n) O (f(n)) Si dice che la complessità asintotica dellalgoritmo è dellordine di f(n) e si scrive O (f(n)) se esiste una costante tale che T(n) f(n) Osservazione importante Osservazione importante: in base alla definizione data, algoritmi che differiscono solo per una costante moltiplicativa hanno lo stesso ordine di complessità Esempio Esempio: due algoritmi che richiedono 4n e 7n operazioni sono entrambi O (n) Complessità temporale asintotica 1

8 Fondamenti di Informatica I a.a Informalmente… Lordine O (f(n)) fornisce una misura della complessità temporale di ogni programma che implementa lalgoritmo Esempio Esempio: Calcolare la somma degli elementi di un array n : numero di elementi dellarray complessità: O (n) Complessità temporale asintotica 2

9 Fondamenti di Informatica I a.a Un algoritmo può richiedere un numero di operazioni diverse per ingressi di dimensione uguale: complessità media complessità media: complessità valutata su tutti i possibili ingressi complessità nel caso peggiore complessità nel caso peggiore: complessità dellalgoritmo per lingresso che richiede più operazioni Di solito, quando si parla di complessità, ci si riferisce alla complessità nel caso peggiore Complessità media e relativa al caso peggiore

10 Fondamenti di Informatica I a.a Array n : numero degli elementi dellarray Ricerca/inserimento/cancellazione di un elemento Complessità O (n) Liste semplici n : numero delle posizioni nella lista Ricerca/cancellazione di un elemento Complessità O (n) Inserimento di un elemento allinizio della lista (in testa) Complessità O (1) Complessità asintotica: array e liste

11 Fondamenti di Informatica I a.a Alberi binari di ricerca n : numero dei nodi dellalbero Inserire, eliminare o ricercare un elemento in un albero binario bilanciato Complessità: O (log 2 n) Complessità asintotica: alberi binari

12 Fondamenti di Informatica I a.a Complessità asintotica: tabelle hash Problema Memorizzare in maniera opportuna un insieme di dati tipicamente sotto forma di record in modo da poter reperire un qualsiasi elemento dellinsieme con un numero piccolo di tentativi Cosa significa piccolo ? Indipendente (o quasi) dalla dimensione della tabella su cui si effettua la ricerca, quindi con una complessità in tempo pari ad O (1)

13 Fondamenti di Informatica I a.a Funzioni hash 1 h: K {0, 1, 2, …, m–1} K: insieme dei valori distinti che possono essere assunti dalle chiavi dei record m: dimensione del vettore in cui si intende memorizzare la tabella Ipotesi Ipotesi: K sottoinsieme dei numeri naturali Possibile funzione di accesso: h(k) k MOD m, k K Valore della funzione sempre compreso fra 0 e m–1

14 Fondamenti di Informatica I a.a Funzioni hash 2 Se K non è un sottoinsieme dei numeri naturali Esempio Esempio: insieme di stringhe alfanumeriche La funzione hash si applica a numeri Per utilizzarla in corrispondenza di una chiave non numerica occorre associare alla chiave un valore numerico Necessità di definire funzioni hash generali Associazione di un valore numerico ad una chiave di qualunque tipo Applicazione della funzione hash a tale valore Esempio Esempio: si utilizza la somma dei codici ASCII dei caratteri che costituiscono la stringa

15 Fondamenti di Informatica I a.a Collisioni 1 Associazione, da parte di una trasformazione, della stessa posizione a chiavi distinteSinonimi Esempio Esempio: [10,12,20,23,27,30,31,39,42,44,45,49,53,57,60] h(chiave) (chiave MOD 15) Posizione 0 30, 45, 60 Posizione 8 23, 53 Posizione 12 12, 27, 42, 57 Ciascuna posizione dellarray può contenere al più un elemento; occorre… Ridurre al massimo le collisioni Gestirle quando si verificano

16 Fondamenti di Informatica I a.a Collisioni 2 hashing perfetto Funzioni di hashing perfetto (che evitano i duplicati) sono rare, anche per tabelle grandi Esempioparadosso del compleanno Esempio: paradosso del compleanno Dato un gruppo di 23 persone, ci sono più del 50% di probabilità che due di esse siano nate nello stesso giorno dellanno In altre parole, se scegliamo una funzione aleatoria (a valori casuali) che trasforma 23 chiavi in un indirizzo di una tabella di 365 elementi, la probabilità che due chiavi NON collidano è solo (meno della metà) Individuare una funzione di accesso che porti ad un numero ridotto di collisioni è un problema complesso

17 Fondamenti di Informatica I a.a Collisioni 3 Tuttavia… numero di collisioni ridotto drasticamente se accettiamo uno spreco del 25% di memoria extra Esempio Esempio: array di 19 elementi (indicizzati da 0 a 18) Posizione 0 57 Posizione 8 27 Posizione 1 20, 39 Posizione Posizione 3 60 Posizione 11 30, 49 Posizione 4 23, 42 Posizione 12 12, 31 Posizione 6 44 Posizione Posizione 7 45 Collisioni non eliminate del tutto h(chiave) (chiave MOD 19)

18 Fondamenti di Informatica I a.a Gestione delle collisioni 1 Uso di liste concatenate destinate alla memorizzazione degli elementi che, in inserimento, hanno portato ad una collisione Ricerca di un elemento di chiave k Si calcola h(k) Se si verifica una collisione allora si accede alla lista associata alla posizione h(k) e la si scandisce

19 Fondamenti di Informatica I a.a Gestione delle collisioni 2 Il costo delloperazione di ricerca realizzata in modo lineare relativamente alle liste di elementi in collisione si mantiene pressoché indipendente da n (numero degli elementi contenuti nella tabella) Inserimento/cancellazione costano O (1) Metodo non adatto a reperire sottoinsiemi di dati con chiave che soddisfi una data relazione

20 Fondamenti di Informatica I a.a Sia dato un programma che prende in ingresso i partecipanti ad una competizione e genera (ad esempio per stamparle) tutte le possibili classifiche finali n : numero di partecipanti Complessità: O (n!) Si osservi che n ! è un numero molto grande anche per n relativamente piccoli 20! Complessità asintotica fattoriale

21 Fondamenti di Informatica I a.a Sia dato un programma che ha come ingresso due array a, b e cerca tutte le coppie (i,j) tali che a[i] b[j] n : dimensione di a m : dimensione di b Complessità: O (n m) Complessità asintotica polinomiale void search(int a[], int b[], int alength, int blength) { … for(i 0;i alength;i ){ for(j 0;j blength;j ){ if(a[i] b[j]) printf(Trovata corrispondenza: a[%d] b[%d] %d, i, j, a[i]); }

22 Fondamenti di Informatica I a.a In base alla loro complessità temporale asintotica, gli algoritmi sono tipicamente divisi in classi complessità costante O (1) lineare O (n) Algoritmi a complessità costante O (1) o lineare O (n) Molto veloci, scalabili complessità polinomiale O (n a ) Algoritmi a complessità polinomiale O (n a ) per un qualche valore a Usabili se lesponente a è piccolo complessità esponenziale O (a n ) Algoritmi a complessità esponenziale O (a n ) per un qualche valore a ( 1) Usabili solo per n molto piccoli Algoritmi facili e difficili

23 Fondamenti di Informatica I a.a Fondamentale Fondamentale: perché gli algoritmi a complessità esponenziale sono considerati quasi inusabili? Perché richiedono talmente tante operazioni che probabilmente anche i calcolatori futuri non saranno in grado di eseguire in tempi ragionevoli le loro possibili implementazioni (programmi) per dati in ingresso ad alta dimensionalità Algoritmi a complessità esponenziale

24 Fondamenti di Informatica I a.a Esempio Si consideri il programma che genera tutte le classifiche finali di una competizione con n partecipanti, complessità O (n!) (è esponenziale, perché ) Con 20 concorrenti le classifiche sono 20! Un computer che generi 1 miliardo di classifiche al secondo, circa lanno, impiegherebbe circa 79 anni per generare tutte le classifiche richieste Tendenzialmente, i computer diverranno sempre più veloci e fra dieci anni forse saranno abbastanza veloci da realizzare in un mese quello per cui adesso occorrono 79 anni ma… …comunque, fra dieci anni per risolvere il problema con 21 partecipanti occorreranno ancora 21 mesi e per 25 partecipanti circa anni!!

25 Fondamenti di Informatica I a.a Algoritmi e complessità

26 Fondamenti di Informatica I a.a ordinato ricerca binariadicotomica Per cercare un elemento in un vettore ordinato esiste un metodo detto ricerca binaria o dicotomica val A[length/2] Si confronta il valore val da ricercare con lelemento centrale del vettore A[length/2] val Se val è minore dellelemento mediano, si ripete la ricerca sulla metà sinistra del vettore, altrimenti si ricerca nella metà destra La ricerca dicotomica 1

27 Fondamenti di Informatica I a.a La ricerca dicotomica 2 Esempio Esempio: ricerca del numero Si confronta 23 con 13 Ci si concentra sulla metà destra (da ind. 8 a ind. 14): si confronta 23 con Ci si concentra sulla metà sinistra (da ind. 8 a ind. 10): si confronta 23 con 20 Ci si concentra sulla metà destra (da ind. 9 a ind. 9): trovato!!

28 Fondamenti di Informatica I a.a Implementazione della ricerca dicotomica int search(int val, int A[], int from, int to) { int center (from to)/2; if (from to) return 1; if (from to) { if (A[from] val) {return from;} return 1;} // si esegue solo se A[from]! val //si esegue solo se (from to) if (val A[center]){ return search(val,A,from,center 1);} if (val A[center]){ return search(val,A,center 1,to);} return center; }

29 Fondamenti di Informatica I a.a Complessità della ricerca dicotomica La ricerca dicotomica divide il vettore in due ad ogni passo: dopo p passi la dimensione del vettore è nel caso peggiore, la ricerca si ferma quando è 1, cioè quando p log 2 n Quindi la ricerca dicotomica è O (log 2 n)

30 Fondamenti di Informatica I a.a Mergesort 1 Mergesort divide et impera Il Mergesort è un algoritmo basato sul paradigma del divide et impera divide et impera Una strategia divide et impera consiste nel suddividere un problema in sottoproblemi, nel risolvere i sottoproblemi, e nel ricomporli per ottenere la soluzione del problema originale Il Mergesort è composto da due fasi: una fase di divisione del vettore da ordinare in sottovettori una fase di ricomposizione dei risultati (merge)

31 Fondamenti di Informatica I a.a Mergesort 2 Idea Dato un vettore da ordinare, lo si divide in due sottovettori di ugual dimensione, si ordinano i sottovettori e poi si fondono insieme Fusione Ordinamento Divisione

32 Fondamenti di Informatica I a.a Mergesort: la divisione ricorsiva Come si ordinano i due sottovettori ? ricorsivamente Applicando ricorsivamente la divisione fino a quando il vettore contiene un solo elemento: in tal caso lordinamento è banale Divisione

33 Fondamenti di Informatica I a.a Mergesort: la fusione ricorsiva 1 I sottovettori ordinati verranno poi ricorsivamente fusi Fusione

34 Fondamenti di Informatica I a.a Mergesort: la fusione ricorsiva 2 La fusione viene realizzata utilizzando due indici che scorrono i due sottovettori da fondere: 1.Ad ogni passo si confrontano i due elementi indicati dagli indici i e j, A[ i ], A[ j ] 2.Si copia lelemento minore in un vettore dappoggio e si incrementa lindice corrispondente 3.Si torna al passo 1. fino a quando i due vettori non sono stati completamente visitati ij k

35 Fondamenti di Informatica I a.a Complessità del Mergesort Il Mergesort ha complessità O (n log 2 n) sia nel caso medio che nel caso pessimo ottimo Mergesort è un algoritmo ottimo! La sua complessità asintotica è la migliore possibile Comunque… …esistono algoritmi che per alcuni ingressi fanno meglio di n log 2 n (ad es., Bubblesort su vettori ordinati) Heapsort …esistono altri algoritmi con complessità n log 2 n nel caso pessimo Heapsort

36 Fondamenti di Informatica I a.a Quicksort 1 Quicksortdivide et impera Quicksort, come Mergesort, è un algoritmo divide et imperaIdea perno Si divide il vettore A in due sottovettori, che contengono rispettivamente tutti gli elementi maggiori e minori di (per esempio) A[0], cioè il primo elemento del vettore detto perno Si ripete ricorsivamente la divisione…

37 Fondamenti di Informatica I a.a Si ripartisce il vettore rispetto ad A[1] 4 Si divide rispetto a Si divide rispetto a Quicksort

38 Fondamenti di Informatica I a.a Quicksort: loperazione perno 1 Come si divide il vettore? Si usano due indici i, j che scorrono il vettore da sinistra e da destra, rispettivamente Lindice i scorre fino a quando A[ i ] A[1] Lindice j scorre fino a quando A[ j ] A[1] Si effettua lo scambio fra A[ i ] e A[ j ] e quindi si procede come sopra i j Si scorrono i, j confrontando con ij Si scambiano gli elementi i j Si scorrono i, j confrontando con 4

39 Fondamenti di Informatica I a.a Quicksort: loperazione perno 2 Alla fine si scambia il perno con lelemento in posizione j ij Si scambiano gli elementi Si scambia A[ j ] con il perno j

40 Fondamenti di Informatica I a.a Implementazione void perno(int A[], int from, int to) { int i from 1, j to; while(i j){ while(A[i] A[from]) i ; while(A[j] A[from]) j ; if(i j) scambia(A,i,j); } scambia(A,from,j); }

41 Fondamenti di Informatica I a.a Complessità del Quicksort Il Quicksort ha complessità media O (n log n) Il caso pessimo si verifica quando il perno finisce in fondo o in testa al vettore In tal caso, Quicksort ha complessità pari ad O (n 2 )

42 Fondamenti di Informatica I a.a Mergesort vs Quicksort Mergesort ha il vantaggio di avere complessità sempre O (n log n) Quicksort ha il vantaggio di non richiedere un vettore di appoggio: ordina il vettore in loco (minore complessità spaziale) In media, Quicksort si comporta bene e, per questo motivo, in pratica spesso è preferito a Mergesort

43 Fondamenti di Informatica I a.a Heap 1 Ospita gli elementi dellinsieme A di cardinalità n, su cui è definita una relazione dordine totale heap Lo heap (mucchio) è un albero binario Proprietà 1 Lalbero è quasi perfettamente bilanciato È completo fino al livello k 1, cioè contiene il numero massimo di nodi, 2 k 1, mentre al livello k contiene un numero di nodi (foglie) compreso tra 1 e 2 k I nodi a livello massimo sono tutti addossati a sinistra Proprietà 2 Ogni nodo contiene un elemento dellelemento contenuto nel padre

44 Fondamenti di Informatica I a.a Heap 2 Noto il valore di n, la forma dellalbero è fissata dalla Proprietà 1 Lallocazione degli elementi nei nodi può variare, nel rispetto della Proprietà 2 Lelemento massimo dellinsieme è allocato nella radice Nello heap, i sottoalberi di ciascun nodo sono ancora heap Lo heap può essere allocato in un array

45 Fondamenti di Informatica I a.a Heap 3 Con lallocazione lineare… A[1] è lelemento contenuto nella radice dello heap Per ogni A[ i ], gli elementi corrispondenti ai figli sinistro e destro, se esistono, sono memorizzati in A[ 2i ] e A[ 2i 1 ] Se 2i n e/o 2i 1 n il figlio sinistro e/o destro di A[ i ] non esiste nellalbero A[ 2i ] A[ i ] e A[ 2i 1 ] A[ i ], quando tali elementi sono definiti

46 Fondamenti di Informatica I a.a Heapsort 1 Heapsort Lo heap trova la sua applicazione più elegante nel metodo di ordinamento noto come Heapsort Si estrae lelemento massimo dallo heap (quello nella radice, o in prima posizione nella rappresentazione lineare) Si ricostruisce lo heap …fino a quando non ci sono più elementi nello heap (ovvero gli elementi del vettore sono ordinati)

47 Fondamenti di Informatica I a.a Heapsort 2 Come si ricostruisce lo heap, dopo lestrazione della radice? Continua…

48 Fondamenti di Informatica I a.a Heapsort 3 Si considera il massimo fra i due figli della radice e, se max{A[2],A[3]} A[1], si effettua lo scambio Si scambia A[1] con A[2] Continua…

49 Fondamenti di Informatica I a.a Heapsort 4 Si considera il massimo fra i due figli di A[2] e, se max{A[4],A[5]} A[2], si effettua lo scambio Si scambia A[2] con A[5] Continua…

50 Fondamenti di Informatica I a.a Heapsort 5 Si estrae A[1] che è lelemento più grande… e si ricomincia il procedimento di ricostruzione

51 Fondamenti di Informatica I a.a Poiché ogni estrazione e ricostituzione dello heap richiede tempo O (log 2 n'), se n è il numero di elementi attualmente contenuti nello heap… Heapsort ha complessità O (n log 2 n) Lalgoritmo di ordinamento può essere realizzato facilmente sulla rappresentazione sequenziale dello heap Heapsort 6

52 Fondamenti di Informatica I a.a void heapsort(int a[], int left, int right) { int k, temp, size right left 1, *p a left 1; /* si costruisce lo heap */ for (k size 2; k 1; k ) heap(p, k, size); /* si scambia lelemento più grande con quello finale * e si ricostruisce lo heap */ while (size 1) { temp p[1]; p[1] p[size]; p[size] temp; heap(p, 1, size); } exit(0); } Heapsort 7

53 Fondamenti di Informatica I a.a /* Costruzione top down di uno heap */ #define LESS(A,B)((A) (B)) void heap(int a[], int k, int size) { int j, temp; while (2 k size) { j 2 k; if (j size && LESS(a[j],a[j 1])) j ; if (!LESS(a[k],a[j])) break; temp a[k]; a[k] a[j]; a[j] temp; k j; } Heapsort 8

54 Fondamenti di Informatica I a.a Ancora sulla complessità

55 Fondamenti di Informatica I a.a Problemi e algoritmi Anche per i problemi si parla di complessità Tipicamente non si riesce a definire univocamente la complessità di un problema, perché......lo stesso problema può essere risolto con algoritmi diversi che hanno diversa complessità …anche se si riesce a stabilire qual è il miglior algoritmo per la risoluzione di un dato problema, tale stima ha comunque un valore non assoluto, ma limitato nel tempo, in quanto non è dato prevedere se in futuro potrà esistere un metodo risolutivo migliore limite inferiore e superiore Per questi motivi, si parla solo di limite inferiore e superiore alla complessità di un problema

56 Fondamenti di Informatica I a.a Complessità di un problema In alcuni casi è possibile dimostrare che nessun algoritmo che risolve un dato problema può/potrà impiegare meno risorse di un certo limite inferiore Esempi banali Nessun algoritmo che genera tutte le classifiche possibili per n concorrenti può farlo in meno di n! operazioni (il limite inferiore alla complessità è O (n!) ) Nessun algoritmo può effettuare la somma fra vettori n dimensionali in meno di n operazioni (il limite inferiore alla complessità è O (n) ) Esempio non banale Nessun algoritmo può ordinare un vettore di n elementi in meno di n log 2 n operazioni, nel caso peggiore

57 Fondamenti di Informatica I a.a Algoritmi ottimi ottimo Un algoritmo si dice ottimo, quando ha complessità pari al limite inferioreEsempi Mergesort e Heapsort sono ottimi Si consideri il problema di sommare gli elementi di un vettore: un algoritmo che scorre tutti gli elementi e li somma uno ad uno richiede O (n) operazioni: tale algoritmo è ottimo perché la sua complessità corrisponde con quella minima Si consideri il problema di inserire un elemento in un albero binario bilanciato che contiene n elementi: Abbiamo visto una soluzione algoritmica che impone O (log 2 n) operazioni log 2 n è un limite superiore per tale problema Si può dimostrare che tale complessità corrisponde con il limite inferiore e che lalgoritmo proposto è ottimo

58 Fondamenti di Informatica I a.a Algoritmi e computer Dubbi: La complessità è indipendente dal computer su cui gira il programma? Ad esempio, se si inventasse un calcolatore in grado di generare contemporaneamente tutte le classifiche di n concorrenti, allora quel problema non avrebbe più complessità n! Oppure… potrebbe esistere in futuro un computer in grado di ordinare un vettore di qualsiasi lunghezza per mezzo di una sola istruzione Nessuno conosce la risposta ma, fino ad ora, nessuno è riuscito a progettare un computer con queste capacità macchina di Turing Tutti i calcolatori conosciuti sono equivalenti, in termini di capacità di calcolo, ad un computer semplicissimo: la macchina di Turing

59 Fondamenti di Informatica I a.a La macchina di Turing Alan Turing ( ) è considerato uno dei padri dellinformatica Nel 1936 propose lidea di una macchina immaginaria che fosse capace di eseguire ogni tipo di calcolo su numeri e simboli a registri Esistono varie versioni della macchina di Turing, quella più simile ai nostri calcolatori è quella cosiddetta a registri

60 Fondamenti di Informatica I a.a La macchina di Turing a registri È costituita da un insieme di registri di lavoro R 1, R 2, R 3,… e di registri di ingresso I 1, I 2, I 3,… Ogni registro è una cella di memoria che contiene un intero non negativo I programmi sono costituiti da tre semplici tipi di istruzioni: incremento: R i Il registro i viene incrementato di 1 decremento: R i Il registro i viene decrementato di 1; se il registro ha già valore 0, listruzione non ha effetto salto condizionato: IF R i GOTO L1 Se il registro i contiene un valore maggiore di 0, si va allistruzione L 1 IF I 1 GOTO ciclo ciclo:I 2 I 1 IF I 1 GOTO ciclo fine: Programma che somma i contenuti di I 1 e I 2 in I 2

61 Fondamenti di Informatica I a.a La tesi di Church Turing tesi di Church Turing La tesi di Church Turing afferma che: Ogni problema intuitivamente calcolabile (risolubile) da un qualsiasi elaboratore è calcolabile da una macchina di Turing, purché dotata di memoria (e tempo di elaborazione) sufficiente Nessuno è mai riuscito a confutare la tesi di Church Turing La maggior parte dei ricercatori ritiene che sia vera

62 Fondamenti di Informatica I a.a Il problema della terminazione halt Supponiamo che esista un programma halt in grado di risolvere i problema della terminazione halt(P,I) restituisce: true se P con ingresso I termina false se P con ingresso I non termina Consideriamo il programma Q Cosa succede se si applica Q a Q ? Q(Q) termina o no ? Se Q(Q) termina allora halt(Q,Q) dovrebbe essere vero… ma allora Q(Q) non dovrebbe terminare Se Q(Q) non termina allora halt(Q,Q) dovrebbe essere falso … ma allora Q(Q) dovrebbe terminare Quindi il programma halt non esiste!! void Q(Program P){ while (halt(P,P)) {} }

63 Fondamenti di Informatica I a.a Problemi impossibili Esistono problemi molto difficili… problemi non calcolabili con una macchina di Turing e se la tesi di Church Turing è vera con nessun calcolatore!!Esempi Problema della terminazione Dato un programma e un suo ingresso, dire se il programma terminerà (o entrerà in un ciclo indefinito) Problema di Post Dato un programma e due stati (uno stato è definito da un certo valore delle variabili), dire se a partire dal primo stato si potrà raggiungere il secondo

64 Fondamenti di Informatica I a.a La macchina non deterministica 1 Nella macchina non deterministica, i programmi includono anche altre istruzioni scelta casuale: FORK prende in ingresso un insieme di istruzioni e ne esegue una a caso istruzione di accettazione: ACCEPT quando viene eseguita, il programma termina correttamente Un problema è risolubile se esiste un programma e una scelta casuale per cui il programma termina con ACCEPT e fornisce la risposta desiderata R 4 FORK{ R 1, R 1 } FORK{ R 2, R 2 } IF R 1 GOTO cont IF R 4 GOTO no cont:IF R 2 GOTO ok IF R 4 GOTO no ok: ACCEPT no: Programma che assegna a caso valori in {0, 1} a R 1 e R 2 e termina solo se R 1 R 2 1

65 Fondamenti di Informatica I a.a La macchina non deterministica 2 La macchina non deterministica non calcola più di quella deterministica Si può dimostrare che tutto ciò che è calcolabile sulla macchina di Turing non deterministica è calcolabile anche sulla macchina deterministica Si pensa però che la macchina non deterministica sia più efficiente di quella deterministica Il non determinismo può essere pensato come una forma di parallelismo: FORK è un istruzione che genera più programmi paralleli Il parallelismo permette di risolvere i problemi velocemente: ad esempio, si può cercare un elemento in un vettore guardando contemporaneamente a tutte le posizioni del vettore

66 Fondamenti di Informatica I a.a Problemi P e NP problemi decisionali I problemi decisionali richiedono solo una risposta binaria (sì/no), correlata in genere allesistenza di una soluzione (es., problema della terminazione) Nella teoria della complessità, i problemi decisionali si dividono in due classi P problemi risolubili in tempo polinomiale sulla macchina di Turing deterministica NP problemi risolubili in tempo polinomiale sulla macchina di Turing non deterministica Includono sia i problemi facili, sia anche la quasi totalità dei problemi che si incontrano nelle situazioni pratiche Ovviamente vale P NP, ma non è noto se PNP

67 Fondamenti di Informatica I a.a Problemi NP completi 1 Problema decisionale della soddisfattibilità: Problema decisionale della soddisfattibilità: Data una forma normale congiuntiva F(x 1,x 2,…,x n ) stabilire se esiste un assegnamento di valori delle variabili booleane x 1, x 2,…, x n che soddisfi F Qualunque problema della classe NP si riduce, in tempo polinomiale, al problema della soddisfattibilità P S P S è il più difficile fra i problemi di NP

68 Fondamenti di Informatica I a.a Problemi NP completi 2 NP completo Un problema P è detto NP completo se P NP e P S si riduce a P I problemi NP completi sono tutti equivalenti fra loro: Sarebbe sufficiente trovare un algoritmo polinomiale per uno solo di essi ed avremmo trovato un algoritmo polinomiale per risolvere tutti i problemi Inoltre, tutti i problemi in NP sarebbero risolubili in tempo polinomiale sulla macchina di Turing deterministica, cioè avremmo dimostrato che NP P!

69 Fondamenti di Informatica I a.a Problemi NP completi: esempi Problema decisionale del commesso viaggiatore Dato un insieme di n città con le relative distanze, trovare, se esiste, un cammino di lunghezza k che, partendo da una città, le visiti tutte tornando in quella di partenza NP arduo Un problema NP arduo (non decisionale) Programmazione lineare intera Data una matrice A e due vettori b, c, calcolare un vettore di interi x che soddisfi Ax b e minimizzi f(x) cx Problemi di programmazione lineare definire lorario dei treni e degli autobus definire lorario delle lezioni …

70 Fondamenti di Informatica I a.a Conclusioni: P NP e tesi di Church Attualmente si pensa che NP P …ma nessuno è ancora riuscito a dimostrarlo Si pensa anche che la tesi di Church sia vera: ovviamente questo non si può dimostrare ma è, eventualmente, solo confutabile Talvolta, problemi con complessità proibitiva sono utili: Ad esempio, gli algoritmi crittografici sono basati sul fatto che decrittare una chiave è molto complesso e richiederebbe un tempo troppo lungo Se la tesi di Church non fosse vera o se P NP, tali metodi non sarebbero più efficaci


Scaricare ppt "Fondamenti di Informatica I a.a. 2008-09 1 Algoritmi e complessità La complessità Complessità in tempo e spazio Complessità asintotica Algoritmi e complessità"

Presentazioni simili


Annunci Google