2 Analisi degli Algoritmi 1 Algoritmi e strutture

  • Slides: 35
Download presentation
2. Analisi degli Algoritmi 1

2. Analisi degli Algoritmi 1

Algoritmi e strutture dati Definizioni q Struttura dati: organizzazione sistematica dei dati e del

Algoritmi e strutture dati Definizioni q Struttura dati: organizzazione sistematica dei dati e del loro accesso q Algoritmo: procedura suddivisa in passi che, eseguiti in sequenza, consentono di eseguire un compito in tempo finito q Esempio: Max. di un vettore di n elementi Algorithm array. Max(A, n) current. Max = A[0]; for (i=0; i < n; i++) if (A[i] > current. Max) current. Max = A[i]; return current. Max; 2

Nel mondo reale. . . . q Gli algoritmi sono al cuore di innumerevoli

Nel mondo reale. . . . q Gli algoritmi sono al cuore di innumerevoli applicazioni informatiche q Esempi q q q Routing in Internet DBMS Analisi e classificazione di documenti/Motori di ricerca Ottimizzazione di progetti Etc. 3

Esempio: Routing in Internet Protocollo di Routing 5 Obiettivo: determinare “buon” cammino sorg. -dest.

Esempio: Routing in Internet Protocollo di Routing 5 Obiettivo: determinare “buon” cammino sorg. -dest. Astrazione usando grafi: q I nodi rappresentano router q Gli archi descrivono i link fisici q Costi sugli archi (link) : ritardo, livello di congestione 2 A B 2 1 D 3 C 3 1 5 F 1 E 2 q Cammino “buono”: q Di solito significa cammino a costo minimo q Possibili def. alternative 4

Esempio: Accesso a basi di dati Interrogazione Obiettivo: rispondere rapidamente. Interrogazione . . .

Esempio: Accesso a basi di dati Interrogazione Obiettivo: rispondere rapidamente. Interrogazione . . . Data base Data Record 5

Qualità di algoritmi e strutture dati Efficienza q q Tempo di esecuzione Spazio (quantità

Qualità di algoritmi e strutture dati Efficienza q q Tempo di esecuzione Spazio (quantità di memoria) I due aspetti sono interdipendenti 6

Come misurare l’efficienza? 10 ms Programma A Dati Problema Programma B 1 ms q

Come misurare l’efficienza? 10 ms Programma A Dati Problema Programma B 1 ms q Perché B gira più velocemente ? q Possiamo affermare che B sia “migliore” di A? 8

Misura dell’efficienza obiettivi q Indipendenza dall’implementazione q Generale (valida per ogni input, di qualsiasi

Misura dell’efficienza obiettivi q Indipendenza dall’implementazione q Generale (valida per ogni input, di qualsiasi dimensione) q Misura indipendente dalla piattaforma Hw/Sw 9

Modello di costo RAM Random Access Machine Macchina che esegue le istruzioni in sequenza.

Modello di costo RAM Random Access Machine Macchina che esegue le istruzioni in sequenza. Insieme di operazioni primitive a costo unitario: q Assegnazione q A = 10; (costo 1) q Op. aritmetiche q A = B*C + D – 7; (costo 4) q Test q Lettura/Scrittura q A == B (costo 1) q System. out. println(A); (Costo 1) 10

Modello di costo/2 Costo di operazioni complesse: q Ciclo: somma costo test di fine

Modello di costo/2 Costo di operazioni complesse: q Ciclo: somma costo test di fine ciclo e costo corpo del ciclo q if…then…else: costo test più costo blocco istruzioni che segue then o else (a seconda del caso) q Attivazione di un metodo: somma dei costi di tutte le istruzioni presenti nel metodo Costo: somma di tutti i costi 11

Esempio q Nel primo caso (vett. di 3 elementi) si ha costo 1 (ass.

Esempio q Nel primo caso (vett. di 3 elementi) si ha costo 1 (ass. )+1 (ass. nel for) + 6 (test e incr. nel for) + 1 (test finale for) + 3 (test if) + 1 (istruz. return) = 13 q Nel secondo caso si ha 1 (ass. ) + 1 (ass. nel for) + 10 (test e incr. nel for) + 1 (test finale for) + 5 (test if) + 1 (istr. ass. nell’if) + 1 (istruz. return) = 20 Algorithmarray. Max(A, n) current. Max=A[0]; for (i=0; i<n; i++) if (A[i]>current. Max) current. Max=A[i]; return current. Max; 1 8 7 6 1 3 4 4 n=3 n=5 12

Perché il modello è accettabile? MUL B, C ADD A, B A=A+B*C; B A

Perché il modello è accettabile? MUL B, C ADD A, B A=A+B*C; B A C Ogni istruzione corrisponde a una sequenza finita di istruzioni macchina Ogni variabile occupa una quantità finita di memoria e quindi i tempi di accesso a due variabili sono legati da una costante N finito (es. 32 o 64 ) 13

Vantaggi e svantaggi q Vantaggi: prescinde dalla piattaforma Hw/Sw e dal linguaggio di programmazione

Vantaggi e svantaggi q Vantaggi: prescinde dalla piattaforma Hw/Sw e dal linguaggio di programmazione q Svantaggi: l’indicazione che si ottiene è qualitativa 14

Quale input considerare? q La misura deve dipendere dalla dimensione dell’input (n nel nostro

Quale input considerare? q La misura deve dipendere dalla dimensione dell’input (n nel nostro esempio) ma non dal particolare input considerato q Possibile alternative: q Analisi del caso peggiore: si considera il costo di esecuzione nel caso peggiore q Analisi del caso medio: si considera il costo medio dell’algoritmo rispetto ad una distribuzione dell’input (richiede la conoscenza della distribuzione) q In ogni caso occorre definire la dimensione dell’input 15

Dimensione dell’input q In generale: No. bit necessari a rappresentare l’input q Esempio (calcolo

Dimensione dell’input q In generale: No. bit necessari a rappresentare l’input q Esempio (calcolo del Max. in un array di n interi) q n interi finiti (< MAXINT) q log(MAXINT) bit per rappresentare ogni valore. q Poiché MAXINT è una costante in pratica, il numero di bit necessari a rappresentare un intero è costante (es. 32) q Quindi: dimensione input è proporzionale a n q A volte le cose possono non essere così ovvie (si pensi al problema di indovinare un numero proposto nell’ultima slide) 16

Analisi nel caso peggiore (esempio) q Nel caso peggiore l’array e’ ordinato in senso

Analisi nel caso peggiore (esempio) q Nel caso peggiore l’array e’ ordinato in senso crescente q In questa ipotesi l’istruzione current. Max=A[i]; è eseguita n-1 volte. q Il costo complessivo dell’algoritmo è allora 1(ass)+1(ass for)+2 n(test ed increm for)+2(n-1)(test e ass. if)+1(test finale for) +1(return)=4 n+3 Algorithmarray. Max(A, n) current. Max=A[0]; for (i=0; i<n; i++) if (A[i]>current. Max) current. Max=A[i]; return current. Max; 1 4 6 3 8 17

Analisi asintotica q Se si considerano tutte le costanti l’analisi può divenire eccessivamente complessa

Analisi asintotica q Se si considerano tutte le costanti l’analisi può divenire eccessivamente complessa q Interessa conoscere il costo al variare della dimensione dell’input, a meno di costanti Motivo: il costo è comunque calcolato a meno di costanti, per le ipotesi fatte circa il modello q Un’analisi di questo tipo è detta asintotica q L’analisi asintotica è influenzata dall’operazione dominante di un algoritmo 18

Istruzione dominante q Un’ operazione o istruzione si dice dominante se il numero d(n)

Istruzione dominante q Un’ operazione o istruzione si dice dominante se il numero d(n) di volte che essa è eseguita nel caso peggiore di input di dimensione n soddisfa: f(n)<=a d(n) + b, dove f(n) è la complessità dell’algoritmo nel caso peggiore ed a e b sono costanti opportune q Es. : istruzione if (A[i]>current. Max) in Algorithmarray. Max(A, n) 19

Analisi di Insertion Sort Algorithm insertion. Sort(A, n) for (i=0; i<n; i++) { tmp=A[i];

Analisi di Insertion Sort Algorithm insertion. Sort(A, n) for (i=0; i<n; i++) { tmp=A[i]; for (j=i; j>0 && tmp<A[j-1]; j--) A[j]=A[j-1]; A[j] = tmp; } return A; Inserisce l’elemento A[i] nella posizione corretta nel vettore ordinato A[0, …, i-1] Ex: 54321 i=0 i=1 i=2 i=3 i=4 54321 45321 34521 23451 12345 0 confronti Ex: 12345 f(n)= n 1 confronto 2 confronti 3 confronti 4 confronti 20

Esempi class esercizio { public void Ex 1(int n) { int a, i; for

Esempi class esercizio { public void Ex 1(int n) { int a, i; for (i=0; i<n; i++) a=i; } public void Ex 2(int n) { int a, i; for (i=0; i<n*n; i++) a=i; } public void Ex 3(int n) { int a, i, j; for (i=0; i<n; i++) for (j=0; j<=i; j++) a=i; } } Valutare la complessità dei tre metodi Complessità di Ex 3: 1+2+. . +n=O(n 2) 21

Metodo Divide et Impera q Il problema è risolto ricorsivamente attraverso la sua scomposizione

Metodo Divide et Impera q Il problema è risolto ricorsivamente attraverso la sua scomposizione in problemi di taglia inferiore q Divide: Problema suddiviso in un numero di sottoproblemi di taglia inferiore Impera: Sottoproblemi risolti ricorsivamente o direttamente se di dimensione piccola a sufficienza Combina: Le soluzioni dei sottoproblemi sono combinate per ottenere la soluzione al problema originale 23

Merge Sort A[0. . . n] A[0. . . n/2 -1] A[n/2. . .

Merge Sort A[0. . . n] A[0. . . n/2 -1] A[n/2. . . n-1] Suddividi A in due sottovettori di dim. n/2 A[0. . . n/2 -1] A[n/2. . . n-1] Merge. Sort A[0. . . n/2 -1] Si suppone n pari per semplicità Merge. Sort A[n/2. . . n-1] Merge A ordinato 24

Merge Sort/2 void mergesort(int[] A, int first, int last) { if (first < last)

Merge Sort/2 void mergesort(int[] A, int first, int last) { if (first < last) { int mid = (first + last) / 2; mergesort(A, first, mid); mergesort(A, mid+1, last); merge(A, first, last); } } 25

Merge Sort A[0. . . n] /3 q Divide: divide gli n elementi da

Merge Sort A[0. . . n] /3 q Divide: divide gli n elementi da ordinare in due sottosequenze da n/2 elementi. Costo: O(n) Impera: ordina ricorsivamente usando il merge sort le due sottosequenze. Costo: 2 f(n/2) Combina: fonde le due sottosequenze ordinate. Costo: O(n) q La ricorsione termina quando si hanno solo due elementi da ordinare. Costo: O(1) q Costo dell’algoritmo Merge Sort: 26

L’array [1 8 6 4 10 5 3 2 22] ordinato con mergesort 27

L’array [1 8 6 4 10 5 3 2 22] ordinato con mergesort 27

Merge void merge(int[] data, int first, int last) { int mid = (first +

Merge void merge(int[] data, int first, int last) { int mid = (first + last) / 2; int i 1 = 0, i 2 = first, i 3 = mid + 1; while (i 2 <= mid && i 3 <= last) if (data[i 2] <data[i 3]) temp[i 1++] = data[i 2++]; else temp[i 1++] = data[i 3++]; while (i 2 <= mid) temp[i 1++] = data[i 2++]; while (i 3 <= last) temp[i 1++] = data[i 3++]; for (i 1 = 0, i 2 = first; i 2 <= last; data[i 2++] = temp[i 1++]); } 28

Equazioni di ricorrenza q Tempo di esecuzione di algoritmi ricorsivi descritti con equazioni di

Equazioni di ricorrenza q Tempo di esecuzione di algoritmi ricorsivi descritti con equazioni di ricorrenza. Ex: Merge. Sort: q Semplificazioni: q Argomenti non interi. q Condizioni al contorno: per n piccolo 29

Soluzione di equazioni di ricorrenza q Metodo per sostituzione. Si tenta una soluzione g(n)

Soluzione di equazioni di ricorrenza q Metodo per sostituzione. Si tenta una soluzione g(n) e si verifica se soddisfa l’equazione di ricorsione. q Dimostrazione per induzione. q Base dell’induzione: f(1)≤g(1) q Ipotesi induttiva: f(n/2) ≤g(n/2) q Passo induttivo: f(n) ≤g(n) q Per Merge Sort: 30

Soluzione equazioni di ricorrenza per Merge Sort q Base: q Ipotesi induttiva: q Passo

Soluzione equazioni di ricorrenza per Merge Sort q Base: q Ipotesi induttiva: q Passo induttivo: 31

Esercizi/1 1. Mostrare che la soluzione di f(n)=f(n/2)+1 è O(n) 2. Mostrare che la

Esercizi/1 1. Mostrare che la soluzione di f(n)=f(n/2)+1 è O(n) 2. Mostrare che la soluzione di f(n)=2 f(n/2+10)+n è O(nlog n) 32

f(n)=f(n/2)+1 q Ipotesi: f(n)<=g(n)=cn f(n/2)+1<=cn/2 +1 = cn +1 NO! Ipotesi: f(n)<=g(n)=cn-b f(n/2)+1<=cn/2 -b

f(n)=f(n/2)+1 q Ipotesi: f(n)<=g(n)=cn f(n/2)+1<=cn/2 +1 = cn +1 NO! Ipotesi: f(n)<=g(n)=cn-b f(n/2)+1<=cn/2 -b +1 = cn -2 b+1 b>=1 33

f(n)=2 f(n/2+10)+n q Rinominiamo n+20= m. Quindi: f(m)=2 f(m/2)+m-20 Ipotesi: f(m)<=g(m)=cmlogm f(m)<=2 c (m/2)

f(n)=2 f(n/2+10)+n q Rinominiamo n+20= m. Quindi: f(m)=2 f(m/2)+m-20 Ipotesi: f(m)<=g(m)=cmlogm f(m)<=2 c (m/2) (log m-1)+m-20<=cm log m se c>=1 Quindi: f(n)<=g(n)=(n+20)log(n+20) 34

Esercizi/2 q Mostrare che la soluzione di f(n)=f(n/2)+1 è O(log n) 35

Esercizi/2 q Mostrare che la soluzione di f(n)=f(n/2)+1 è O(log n) 35

Esercizi/3 q Si consideri il problema della ricerca in un vettore di interi: dato

Esercizi/3 q Si consideri il problema della ricerca in un vettore di interi: dato il vettore A[1. . n] ed un intero k, si vuole stabilire se k sia tra gli elementi di A o meno Considerato il classico algoritmo basato sulla ricerca binaria, si mostri che esso ha complessità O(log n) 36

Esercizi/4 q Si consideri il problema di “indovinare” un numero intero nel numero minimo

Esercizi/4 q Si consideri il problema di “indovinare” un numero intero nel numero minimo di tentativi: ad ogni tentativo, l’algoritmo propone un valore ad un oracolo, che conosce il numero da indovinare. L’oracolo risponde dicendo se il numero proposto sia maggiore, minore o uguale a quello da indovinare (nell’ ultimo caso il gioco termina). q Si proponga un algoritmo efficiente e se ne esprima la complessità temporale in funzione del generico numero N da indovinare 37