Efficienza: esempi Fondamenti di Informatica Ferdinando Cicalese Nella lezione precedente ! Qualche problema computazionale " " ! Trova min Selection sort Pseudocodice per descrivere “algoritmi” " " Variabili Assegnamento di un valore ad una variabile 1 Algoritmo ! Una procedura precisa e priva di ambiguita’ per ottenere un risultato computazionale ! Algoritmo discende da Abu Abdullah Muhammad bin Musa al-Khwarizmi " Il suo libro "Al-Jabr wa-al-Muqabilah" e’ il progenitore dei moderni libri di algebra. ! Esempi: ricette, divisioni a piu’ cifre, selection sort. Computazione efficiente “Un buon programma deve essere corretto e veloce” Il nostro modello di “computazione”: pseudocodice istruzioni aritmetiche assegnamenti di variabili cicli istruzioni condizionali 2 Pseudocodice ! ! Istruzioni semplici: basate su +, -, !, ÷ Istruzioni Composte " Istr. Condizionali " Loop ! Senza sintassi rigida (a meno di introdurre ambiguita’) Algoritmo: nuova definizione “Pseudocodice per trasformare input in output, in un tempo finito” Parte I: " Quali classi di problemi possono essere risolte da un algoritmo? " Se/Quanto tale classe risulta essere dipendente dalla definizione di pseudocodice? 3 Domanda di oggi: Come misurare l’efficienza/ velocita’ di un algoritmo? Scegli il migliore? AMD Phenom™ II quad-core processor 840T; 6GB DDR3 memory; 1TB hard drive; ! In linea di principio, la misura dovrebbe essere indipendente da " computer " tecnologia “Running time” di un algoritmo ! Definizione: il numero di “operazioni elementari” eseguite dall’algoritmo ! Operazioni elementari: +, -, *, /, assegnamenti, valutazione di istruzioni condizionali “Velocita’” di un computer: numero di op. elementari che puo’ eseguire al secondo (definizione semplificata) " Non usato nella definizione di “running time” di algoritmi; dipendente dalla tecnologia 4 Esempio: Trova Min ! ! ! ! n elementi, memorizzati in un array A Variabili: i, best best ! 1 Do for i = 2 to n { if (A[ i ] < A[best]) then { best ! i } } Esempio: Trova Min ! ! ! ! ! n elementi, memorizzati in un array A Variabili usate: n, A[1..n], i, best best ! 1 Do for i = 2 to n { if (A[ i ] < A[best]) then { best ! i } } Quante operazioni vengono eseguite prima del loop? " A: 0 B: 1 C: 2 D: 3 5 Esempio: Trova Min ! ! ! ! ! n elementi, memorizzati in un array A Variabili: i, best best ! 1 Do for i = 2 to n { if (A[ i ] < A[best]) then { best ! i } } Quante operazioni in ogni iterazione del loop? " A: 0 B: 1 C: 2 D: 3 Esempio: Trova Min ! ! ! ! ! n elementi, memorizzati in un array A Variabili: i, best best ! 1 Do for i = 2 to n { if (A[ i ] < A[best]) then { best ! i } } Quante volte viene eseguito il loop? " A: n B: n+1 C: n-1 D: 2n “iterazioni” 6 Esempio: Trova Min ! ! ! ! n elementi, memorizzati in un array A Variabili: i, best best ! 1 Do for i = 2 to n { if (A[ i ] < A[best]) then { best ! i } 1 confronto e } forse 1 assegnamento = al massimo 2 operazioni per iterazione Usa al massimo 2(n – 1) + 1 operazioni (totale " 2n - 1) } Numero di iterazioni Inizializzazione Efficienza di Selection Sort Do for i = 1 to n – 1 { Trova Min tra A[i], A[i+1], …, A[n] Scambia con A[i] } ! ! Per l’ i-esima iterazione, impiega al piu’ 2(n – i ) + 4 Per calcolare il running time, bisogna trovare il modo di sommare (n – 1)+(n-2)+(n-3)+…+1 …e quindi raddoppiare il risultato. 7 Efficienza di Selection Sort Do for i = 1 to n – 1 { best ! i Do for j=i to n if(A[j] < A[best]) then { best ! j } x !A[i] A[i] !A[best] A[best] ! x 2(n – i ) + 1 passi 3 passi } ! ! Per l’ i-esima iterazione, impiega al piu’ 2(n – i ) + 4 Per calcolare il running time, bisogna trovare il modo di sommare (n – i) for i = 1 to n – 1 Il Trucco di Gauss: Somma di (n – i) for i = 1 to n – 1 S= 1 + 2 + … + (n – 2) + (n – 1) + S = (n – 1) + (n – 2) + … + 2 + 1 2S = n + n +…+ n + n n – 1 times 2S = n(n – 1) ! Quindi selection sort impiega in tutto " n(n – 1) + 2(n-1) 8 Discussion Time “20 Domande”: Penso un numero tra 1 e un milione. Indovinatelo facendo il minor numero possibile di domande a risposta si/no. Domanda 1: “E’ il numero maggiore di mezzo milione?” No Domanda 2: “E’ il numero maggiore di un quarto di milione?” No Strategia: Ogni domanda dimezza il numero di possibili soluzioni Pseudocodice: indovina un numero in [1,n] Variabili: n, Inf, Sup, Candidato Inf ! 1 Sup ! n Ricerca Binaria Do while (Inf < Sup) { Candidato ! (Inf + Sup)/2 Domanda : “E’ Candidato > Numero?” If (Candidato > Numero-scelto) { Sup ! Candidato } else { Inf ! Candidato } } Stampa(Inf) Quante volte devo eseguire il ciclo per essere sicuro di indovinare il numero ?? 9 Intermezzo: Logaritmi (prospettiva informatica) ! ! log2 n = K significa 2K-1 < n " 2K In parole: K e’ il numero di volte che bisogna dividere n per 2 per ottenere un numero " 1 n log2 n 16 1024 1048576 8388608 4 10 20 23 John Napier Running time incontrati in questa lezione n= 8 n= 1024 n= 1048576 n=8388608 log2 n 3 10 20 23 n 8 1024 1048576 8388608 n2 64 1048576 1099511627776 70368744177664 Nota: per n grande, n2/10 e’ enormemente piu’ grande di 10n 10 Prossimo argomento…. “Esistono solo 10 tipi di persone al mondo: quelli che conoscono i numeri binari e quelli che non li conoscono” Ricerca Binaria e rappresentazione binaria dei numeri ! Supponiamo di sapere che 0 " numero < 2K 0 2K E’ 2K / 2 " numero < 2K? No Si E’ 2K / 4 " numero < 2K / 2? No Si E’ 2K ! 3/8 " numero < 2K / 2? No … Si … 11 Rappresentazione Binaria ! ! In generale, ogni numero da 0 a n puo’ essere univocamente identificato da una sequenza di risposte si/no a queste domande. (Es. n =32; etichette per 21 = si, no, si, no, si) Corrisponde ai cammini in questo “albero”: E’ 2K / 2 " numero < 2K? No si E’ 2K / 4 " numero < 2K / 2? E’ 2K / 8 " numero < 2K / 4? No … … si No E’ 2K ! 3/8 " numero < 2K / 2? No si … … si … Rappresentazione Binaria di n (la definizione piu’ classica – prox lezione) n = 2k bk + 2k-1 bk-1 + … + 2 b2 + b1 dove ogni bi vale 0 o 1) La rappresentazione binaria di n e’: (n)2 = bk bk – 1 … b2 b1 Esempio: 21 = 16 + 4 + 1 = 24 + 22 + 20. Rappresentazione Binaria = 10101 12