Corso di Introduzione agli Algoritmi Un algoritmo è…(1) Un

Corso di
Introduzione agli Algoritmi
canale P-Z - A.A. 2009/2010
Tiziana Calamoneri
[email protected]
Introduzione
Un algoritmo è…(2)
Esempio: ordinamento
Input: sequenza di n numeri a1, a2, …, an (anche detto ISTANZA)
Output: permutazione a1’, a2’, …, an’ della sequenza di input con
la proprietà che a1’! a2’! …! an’
Un algoritmo è CORRETTO se, per ogni istanza, termina
con l’output corretto. In tal caso diremo che l’algoritmo
RISOLVE il problema dato.
Un algoritmo è…(1)
… una procedura di calcolo ben definita che prende
un insieme di valori in INPUT e genera un insieme di
valori in OUTPUT.
Un algoritmo è uno strumento per risolvere un
PROBLEMA COMPUTAZIONALE: ne descrive una
specifica procedura computazionale per ottenere la
relazione tra input ed output specificata dal
problema.
Strutture dati
Per risolvere problemi avremo bisogno di usare dati e quindi
useremo delle STRUTTURE DATI, strumenti per
memorizzare e organizzare i dati e semplificarne l’accesso
e la modifica.
Non esiste una struttura dati che vada bene per ogni
problema, quindi dobbiamo conoscere proprietà, vantaggi
e svantaggi delle principali strutture dati.
Esempi: vettore, lista, coda, pila…
Complessità computazionale(1)
Un parametro fondamentale per lo studio degli algoritmi è
l’EFFICIENZA, cioè l’ottimizzazione del tempo e dello spazio
occupati da un algoritmo.
Questo perché i calcolatori possono essere veloci, ma non
infinitamente, la memoria può essere economica, ma non
gratuita.
Lungo tutto il corso parleremo di COMPLESSITA’
COMPUTAZIONALE in termini di numero di operazioni
elementari, come funzione della dimensione dell’input.
Complessità computazionale (2)
Per capire:
computer V (veloce): 109 istruzioni/sec
computer L (lento): 107 istruzioni/sec
Ordinamento di 106 interi
Algoritmo IS: 2n2 istruzioni
Algoritmo MS: 50 n log n istruzioni
2 * (10 6 ) 2 istruz.
V(IS)= 10 istruz./sec. = 2000sec. = 33min.
9
6
6
istruz.
= 100sec. = 1.5min.
L(NS)=50 *1010log10
istruz.
7
!
Se n=107, V(IS)=2giorni e L(MS)=20min
!
Random Access Machine (1)
Per studiare l’efficienza di un algoritmo dobbiamo
ANALIZZARLO, cioè prevedere le risorse che esso richiede.
Per fare questo, dobbiamo avere un modello della tecnologia
utilizzata.
In questo corso consideriamo un generico modello di calcolo
con un processore detto RANDOM ACCESS MACHINE
(RAM).
Random Access Machine (2)
In questo modello:
! le istruzioni sono eseguite l’una dopo l’altra, senza operazioni
contemporanee. Tale modello contiene istruzioni che si trovano
comunemente nei calcolatori reali (istruz. aritmetiche, per spostare dati load, store, copy- e di controllo -salto condizionato, chiamata a subroutine e
return)
! si assume che ciascuna di queste istruzioni richieda una quantità costante
di tempo
! si suppone che ci sia un limite alla dimensione di ogni parola. In
particolare, se operiamo con input di dim. n, assumiamo che i numeri interi
siano rappresentati da c log n bit, per una qualche costante c"1;
!c"1 in modo che una parola possa contenere il valore di n
consentendoci di indicizzare i singoli elementi di input in tempo costante,
!c costante per evitare soluzioni irrealistiche che una parola contenga
molti dati.
Misure di costo (1)
Misure di costo (2)
Abbiamo fatto l’ipotesi che una parola abbia lunghezza c log
n per consentire che ogni operazione sia eseguita in tempo
costante, indipendentemente dalla dimensione degli
operandi. Questo criterio è detto MISURA DI COSTO
UNIFORME. Sebbene utile, questo è un modello di costo non
sempre realistico perché le parole sono invece lunghe un
numero costante di bit (32 o 64), per cui i dati potrebbero
non essere rappresentabili in una sola parola di memoria, e
quindi anche le operazioni aritmetiche non richiederebbero,
in realtà, tempo costante, ma logaritmico.
Misure di costo (3)
Esempio:
x=1;
for i=1 to n do x=x*2; /*calcola 2n
C.U. tempo di esecuzione proporzionale ad n
C.L. x raddoppia ad ogni passo, quindi all’i-esimo passo x=2i
Il tempo speso per incrementare i e raddoppiare x è,
rispettivamente, log i e log x= log2i=i. Quindi il tempo di
esecuzione è proporzionale a " (i + logi)
n
i=1
n
!
n
n
n
# (i + logi) " # i = n(n + 1)!/2
# (i + logi) " # 2i = n(n + 1)
i=1
i=1
i=1
!
i=1
E’ stato perciò proposto un altro criterio di misurazione, MISURA
DI COSTO LOGARITMICO, che assume il costo delle istruzioni
dipendente dalla dimensione degli operandi. Cioè, eseguire
un’operazione su un numero n implica un tempo proporzionale a
log n.
Poiché usare la misura di costo logaritmico potrebbe inserire
delle complicazioni non necessarie, in letteratura si sceglie di
usare la misura di costo uniforme, che è adatta alla maggior
parte dei problemi che studieremo.