Efficienza: esempi - Dipartimento di Informatica

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