Introduzione al Corso di Algoritmi Di cosa parliamo oggi: Una

Introduzione al Corso di Algoritmi
Di cosa parliamo oggi:
Una discussione generale su cosa studieremo,
perchè lo studeriemo, come lo studieremo, ...
Un esempio illustrativo di cosa studeriemo
Informazione pratiche sul corso:
- Modalità di esame (e come superarlo brillantemente)
- Materiale didattico (libri di testo, materiale di supporto,
esercizi di esame...)
- Altro...
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 1/36
Corso di Algoritmi
Obiettivi (ufficiali) del corso: Apprendere metodologie
per il progetto ed analisi di algoritmi
Di fatto, acquisiremo strumenti concettuali per la
risoluzione di problemi. (Quali problemi? Di
qualunque tipo...)
Cosa studieremo?
- Tecniche generali per lo sviluppo di algoritmi
efficienti atti a risolvere problemi computazionali di
interesse pratico
- Strumenti per la valutazione degli algoritmi
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 2/36
Perchè studiare algoritmi?
Tecniche algoritmiche permettono di risovere problemi
importantissimi in Informatica (e ben oltre...)
Trasmissione dati in Internet (come si gestisce in pratica il
flusso di dati nei vari router della rete?)
Ricerca nel WEB (come fà Google a trovare le informazioni nel
WEB?)
Bioinformatica (come il DNA determina le nostre
caratteristiche?)
Processi economici (come si gestiscono le aste on-line su
Ebay?, come si effettua la compravendita di azioni su Internet?)
Organizzazione di risorse e servizi (come si schedulano i voli
delle aerolinee? Come si assegnano le frequenze nelle celle
delle reti cellulari?)
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 3/36
E non lo dico solo io:
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 4/36
Anche il Corriere della Sera del 15/1/2012!
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 5/36
...e se non siete ancora convinti dell’utilità degli algoritmi, questo dovrebbe...
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 6/36
Iniziamo con un pó di storia...
Il termine Algoritmo deriva dal matematico Persiano
al-Khwârizmı̂ (c. 780-850), autore del testo Al-jabr
w’al-muqabâla (da cui anche il termine Algebra)
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 7/36
Un altro pó di storia...
Algoritmi di tipo numerico furono studiati da matematici
babilonesi ed indiani piú di di 3000 anni fá.
Algoritmi in uso fino a tempi recenti furono studiati dai
matematici greci 500 anni a.C.
Esempio: Algoritmo di Euclide per il Massimo Comun
Divisore
Esempio: Algoritmi geometrici (calcolo di tangenti,
sezioni di angoli, ...)
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 8/36
Ma cos’é un Algoritmo?
Algoritmo: procedura computazionale che prende certi
valori in input e produce i valori richiesti in output
Algoritmo: strumento per risolvere un Problema
Computazionale
Il Problema computazionale (in forma generale o
astratta) é definito da una relazione input/output
Un algoritmo é quindi una procedure computazionale
per ottenere la desiderata relazione input/output
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 9/36
Esempi di Problemi Computazionali
Problema dell’Ordinamento:
Input: sequenza di numeri ha1 , . . . , an i
Output: una permutazione ha′1 , . . . , a′n i dell’input tale
che a′1 ≤ . . . ≤ a′n
procedura che
prende in input ha1 , . . . , an i e produce in
output a′1 ≤ . . . ≤ a′n
Algoritmo di Ordinamento:
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 10/36
Esempi di Problemi Computazionali
Problema della ricerca di un elemento:
Input: Tabella A[1 . . . n] ed elemento x
Output: intero i, se x = A[i] per qualche indice i, un
messaggio “Non c’é", altrimenti.
procedura che prende in
input A[1 . . . n] ed elemento x, e produce in
output "i" se x = A[i], “Non c’è" altrimenti.
Algoritmo di Ricerca:
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 11/36
Nella vita reale raramente avrete a che fare con problemi astratti...
Ciò che accadrà sarà che il vostro capo vi chiederà
(ordinerà):
“Mi scriva un programma che elenchi i nostri fornitori in base ai loro tempi
di consegna!”
Dovrete avere la capacità di passare da tale problema
concreto alla sua versione astratta (cioè l’ordinamento) e
quindi risolverlo con le tecniche che apprenderete in questo
corso.
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 12/36
Abbiamo detto che studieremo Algoritmi Efficienti
Cosa intendiamo per Algoritmi Efficienti?
Algoritmi Efficienti = Algoritmi che usano "poche"
risorse
Risorse = Tempo e Spazio richiesto dall’algoritmo per
produrre l’output
Problema 1: Come misurare le risorse usate da un
algoritmo? (Analisi degli algoritmi)
Problema 2: Come progettare algoritmi che usano
"poche" risorse? (Tecniche generali per il progetto di
algoritmi)
Lo vedremo...
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 13/36
Motivazioni
Perché occuparci di algoritmi efficienti?
Perchè algoritmi efficienti conducono a programmi
efficienti
Perchè programmi efficienti si vendono meglio...
Perchè programmi efficienti fanno un miglior uso
dell’hardware
Perchè programmatori che scrivono programmi
efficienti sono piú richiesti...
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 14/36
Obiettivi
Cosa otterrete da questo corso?
Metodi e conoscenze per formulare modelli astratti da
problemi pratici (Problemi Concreti → Problemi
Computazionali)
Metodi e conoscenze per la progettazione di algoritmi
efficienti per la risoluzione di problemi computazionali
Metodi e conoscenze per analizzare l’ efficienza di
algoritmi
Un “catalogo" di algoritmi efficienti, pronti per l’uso, per
la risoluzione dei piú comuni problemi computazionali
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 15/36
Esempio: Profitto Massimo in anni contigui
Profitti della Ditta ACME-Corporation
Anno
1 2 3 4 5 6 7 8 9
Profitto in M$ -3 2 1 -4 5 2 -1 3 -1
Esempi: Tra gli anni 1 e 9 la Ditta ACME ha guadagnato
−3 + 2 + 1 − 4 + 5 + 2 − 1 + 3 − 1 = 4 M$, tra gli anni 2 e 6
ha guadagnato 2 + 1 − 4 + 5 + 2 = 6 M$, tra gli anni 5 e 8
ACME ha guadagnato 5 + 2 − 1 + 3 = 9 M $
Il Problema del Profitto Massimo in anni contigui è quello di
trovare l’intervallo temporale in cui la Ditta ACME ha
guadagnato di più (nel nostro esempio l’intervallo (5, 8)).
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 16/36
Astrazione del Problema
Input: un array di reali A[1 . . . N ], il profitto totale negli
anni dall’i-esimo allo j-esimo è
V (i, j) =
j
X
A[x].
x=i
Il Problema del Profitto Massimo in anni contigui
(PMAC) è quello di trovare indici i ≤ j tali che
∀i′ , j ′ , vale che V (i′ , j ′ ) ≤ V (i, j)
Output: V (i, j) tale che
∀i′ , j ′ , vale che V (i′ , j ′ ) ≤ V (i, j)
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 17/36
Prima Soluzione: Forza Bruta
Idea: Calcolare il valore V (i, j) per ogni coppia i ≤ j , e
ritornare il valore massimo
VMAX=A[1]
for i = 1 to N do
for j = i to N do
% qui ci calcoliamo V = V (i, j)
V =0
for x = i to j do
V = V + A[x]
if V > V M AX then V M AX = V
return V M AX
Complessità dell’algoritmo: Θ(N 3 ) (ci sono 3 for
innestati, ciascheduno spazia su al piú N valori)
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 18/36
Seconda Soluzione: Approccio Incrementale
Idea: Non è necessario calcolare “separatamente"
ciascun V (i, j),ma possiamo usare il fatto che
Pj−1
Pj
V (i, j) = x=i A[x] = x=i A[x]+A[j] = V (i, j −1)+A[j].
VMAX=A[1]
for i = 1 to N do
V =0
for j = i to N do
% qui ci calcoliamo V (i, j)
V = V + A[j]
if V > V M AX then V M AX = V
return V M AX
Complessità dell’algoritmo: Θ(N 2 ) (ci sono 2 for
innestati, ciascheduno spazia su al piú N valori)
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 19/36
Terza Soluzione: Divide-et-Impera
Idea: Poni M = ⌊(N + 1)/2⌋. Il PMAC dell’array
A[1, . . . , N ] deve necessariamente essere uno dei
seguenti:
S1 : il PMAC dell’array A[1, . . . , M ],
S1
M M+1
oppure S2 : il PMAC dell’array A[M + 1, . . . , N ],
S2
M M+1
oppure é a "cavallo" di A[M ], ovvero e’ A = A1 ∪ A2
A1
A2
M M+1
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 20/36
Esempio
1 -5 4 2 -7 3 6 -1 2 -4 7 -10 2 6 1 -3
In questo caso S1 = [3, 6] con valore 3 + 6 = 9, e
S2 = [2, 6, 1] con valore 2 + 6 + 1 = 9.
1 -5 4 2 -7 3 6 -1 2 -4 7 -10 2 6 1 -3
Ma abbiamo anche A1 = [3, 6, 1], A2 = [2, −4, 7], con
A = A1 ∪ A2 = [3, 6, 1, 2, −4, 7], di valore totale
3 + 6 + 1 + 2 − 4 + 7 = 13.
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 21/36
Dobbiamo quindi trovare S1 , S2 e A ...
S1 lo si trova determinando il PMAC di A[1 . . . M ],
ovvero chiamando l’algoritmo ricorsivamente sulla parte
sinistra A[1 . . . M ] dell’array A[1 . . . N ]
S2 lo si trova determinando il PMAC di A[M + 1 . . . N ],
ovvero chiamando l’algoritmo ricorsivamente sulla parte
destra A[M + 1 . . . N ] dell’array A[1 . . . N ]
Come trovare A lo vediamo in un secondo ...
Il PMAC dell’intero array A[1 . . . N ] sará quindi quel
sottovettore che tra S1 , S2 , ed A, ha valore massimo.
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 22/36
Come trovare A: la fase di Conquer
A1
A2
i
M M+1
j
A1 é della forma A[i . . . M ]:
ci sono solo M ≤ N tali sequenze, tante quanti sono i
corrispondenti valori di i, 1 ≤ i ≤ M . Pertanto la sequenza
contigua A1 di valore massimo puó essere trovata usando al
piú O(M ) = O(N ) operazioni.
Analogamente, A2 é della forma A[M + 1 . . . j]:
ci sono solo N − M ≤ N tali sequenze, tante quanti sono i
corrispondenti valori di j, M ≤ j ≤ N . Pertanto la sequenza
contigua A2 di valore massimo puó essere trovata in
O(N − M ) = O(N ) operazioni.
A = A1 ∪ A2 puó essere trovato in O(N ) operazioni!
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 23/36
L’Algoritmo Completo Divide-et-Impera
Input: A[i . . . j], con i ≤ j
P M AC(A, i, j)
1. if i = j return A[i] else
2. trova P M AC(A, i, ⌊(i + j)/2⌋)
3. trova P M AC(A, ⌊(i + j)/2⌋ + 1, j)
4. trova P M AC che contiene sia
A[⌊(i + j)/2⌋)]
che
A[⌊(i + j)/2⌋ + 1]
5. return il MASSIMO delle tre sequenze trovate
Detto T (N ) il numero di operazioni di P M AC(A, 1, N ),
abbiamo:
1. richiede tempo O(1), 2. e 3. richiedono tempo T (N/2),
4. richiede tempo O(N ), 5. richiede tempo O(1).
T (N ) = 2T (N/2) + O(N ) ⇒ T (N ) = O(N log N )
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 24/36
Analisi dell’ Algoritmo Divide-et-Impera
Per semplificare l’analisi, assumiamo che N = 2h . I passi
4. e 5. dell’algoritmo richiedono O(N ) operazioni, ovvero
richiedono un numero di operazioni ≤ cN , per qualche
costante c. Quindi
N
2
+ cN
T (N ) ≤ 2T (N/2) + cN ≤ 2 2T (N/2 ) + c
2
N
3
2
2
2
= 2 T (N/2 ) + 2cN ≤ 2 2T (N/2 ) + c 2 + 2cN
2
= 23 T (N/23 ) + 3cN ≤ . . . ≤ 2h T (N/2h ) + hcN
Ponendo h = log N , si ha 2h = 2log N = N ,
e quindi
T (N ) ≤ N T (1) + (log N )cN = O(N log N )
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 25/36
Riassumendo...
Abbiamo visto:
un algoritmo basato sulla generazione di tutte le
possibili soluzioni, di complessitá O(N 3 )
un algoritmo basato sul riuso di dati precedentemente
calcolati di complessitá O(N 2 )
un algoritmo basato su Divide-et-Impera di complessitá
O(N log N )
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 26/36
Ne é valsa la pena?
Confrontiamo gli algoritmi su di un computer che esegue un
milione di operazioni al secondo.
Algoritmo
1
2
3
N3
N2
N log N
102
1s
1/100s
0.00066438561s
103
16.67m
1s
0.00996578428s
104
277,78h
100s
0.13287712379s
105
31,69y
16,67m
1.66096404744s
106
31688,09y
277,78h
19.9315685693s
Tempo esecuzione
Tempo per risolvere
un problema di taglia
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 27/36
Morale della lezione
Ne é valsa la pena
Abbiamo visto che è possibile progettare algoritmi
seguendo tecniche "generali" (forza bruta, divide-et
impera, ....)
Abbiamo visto che è possibile analizzare e valutare
algoritmi in base al numero di operazioni che essi
compiono per produrre l’output, in funzione della
"taglia" dell’input, e che questa analisi riflette il
comportamento degli algoritmi in pratica
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 28/36
Circa PMAC: si può far meglio di O(N log N )?
Si
Esiste un algoritmo che risolve il Problema del Profitto
Massimo in anni contigui in O(N ) operazioni
Però per oggi basta, trovatelo voi....
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 29/36
Informazioni sul corso
Libro di testo: Jon Kleinberg ed Eva Tardos, Algorithm Design,
Addison Wesley, 2005
Alla pagina WEB
http://www.di.unisa.it/professori/uv/ALGO/ALGO.html apparirá
tutto il materiale relativo al corso (copie delle slides usate,
esercizi, date delle prove d’esame, comunicazioni varie, etc.)
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 30/36
Informazioni pratiche sul corso
In generale, le copie delle slide usate al corso
compariranno in anticipo rispetto alla relativa lezione.
É fortemente consigliato che le stampiate e le studiate
(o almeno le leggiate...) prima della lezione.
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 31/36
Come superare l’esame con buon voto?
Seguire il corso
Studiare lezione per lezione
Studiare le slide anche prima della lezione
Studiare anche dal libro di testo
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 32/36
Ma soprattutto....
Fare tanti esercizi!
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 33/36
e dove li trovo gli esercizi, direte voi...
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 34/36
Promessa:
Prometto che gli esercizi d’esame li
conoscerete in anticipo!
ovvero, gli esercizi d’esame saranno presi dalla lista di
esercizi che saranno via via disponibili alla pagina
http://www.dia.unisa.it/∼uv/ALGO/ALGO.html
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 35/36
Orario Lezioni e Ricevimento
Lezioni: Lunedí ore 9:00–11:00, Aula F8, Mercoledí,
ore 9:00–11:00, Aula F8
Controllare spesso la pagina WEB
www.dia.unisa.it/professori/uv/ALGO/Avvisi.html per
eventuali cambiamenti all’ultimo minuto di orari.
Ricevimento: Lunedí e Mercoledí dopo la lezione
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Accademico 2014/15 – p. 36/36