Algoritmi - Dipartimento di Informatica

Algoritmi
Un tema centrale dell’informatica è lo studio degli algoritmi.
Ora nostro obiettivo sarà quello di esplorare a sufficienza questa
materia fondamentale per poter capire e apprezzare appieno
l’informatica.
Brookshear – Informatica XI ed – Capitolo 5 l
00/00/00
1
ALGORITMI e PROGRAMMI
Programmazione: Lavoro che si fa per costruire sequenze di
istruzioni (operazioni) adatte a svolgere un dato calcolo
INPUT: x,y,z
INPUT: dati iniziali
AZIONI
OUTPUT:
esempio:
risultato
Somma x ed y
Somma z al risultato
OUTPUT: x+y+z
Algoritmo: Sequenza di azioni per svolgere il calcolo
Programma: Algoritmo espresso in notazione formale
(linguaggio di programmazione)
Creazione programma:
Fase 1 = algoritmo
Fase 2 = implementazione in dato linguaggio (C)
Vedremo:
Elementi di base per semplici algoritmi e programmi
ALGORITMI
Tecniche algoritmiche permettono di risolvere problemi di:
• Trasmissione dati in Internet
•
come si gestisce in pratica il flusso di dati nella rete?
• Ricerca nel WEB
• come fa 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?
Il termine Algoritmo deriva dal matematico Arabo
al-Khwarizmı (c. 780-850), autore del testo
Al-jabrw’al-muqabâla
(da cui anche il termine Algebra)
Algoritmi di tipo numerico furono studiati da matematici babilonesi ed
indiani più di di 3000 anni fa.
Algoritmi in uso fino a tempi recenti furono studiati dai matematici greci nel
500 a.C.
Esempio: Algoritmo di Euclide per il Massimo Comun Divisore
Esempio: Algoritmi geometrici (calcolo di tangenti, sezioni di angoli, ...)
Algoritmo: procedura computazionale che
• prende certi valori in input (ingresso) e
• produce i valori richiesti in output (uscita)
Un esempio
 
si prepara ad un’uscita galante...
Va in profumeria, ma vuole risparmiare …
Come identificare il profumo più economico?
0. Prendi la prima bottiglia,
1. Vai alla prossima bottiglia nello scaffale
2. Confronta il prezzo sulla bottiglia nello scaffale con quello in mano
3. Se e’ minore scambia la bottiglia in mano con quella sullo scaffale
4. Se ci sono bottiglie non controllare, allora ripeti da 1.
5. Se le bottiglie sono finite, la bottiglia più economica è quella in mano
 
Algoritmo: procedura computazionale che
• prende certi valori in input (ingresso) e
• produce i valori richiesti in output (uscita)
_______________
Problema: determina il profumo più economico
Input: profumi con relativi costi
Output: profumo di costo minimo
Algoritmo:
0.
1.
2.
3.
4.
5.
Prendi la prima bottiglia,
Vai alla prossima bottiglia nello scaffale
Confronta il prezzo sulla bottiglia nello scaffale con quello in mano
Se è minore scambia la bottiglia in mano con quella sullo scaffale
Se ci sono bottiglie non controllare, allora ripeti da 1.
Se le bottiglie sono finite, la bottiglia più economica è quella in mano
Procedura computazionale per ottenere la relazione costi/costo minimo
Riassumendo
Un’algoritmo è una serie di operazion non
ambigue ed efficientemente computabili, che
una volta eseguite producono un risultato in un
tempo finito
Se possiamo specificare un algoritmo allora
possiamo automatizzare la soluzione
Un esempio
 
Come identificare il profumo più economico?
0. Prendi la prima bottiglia,
1. Vai alla prossima bottiglia nello scaffale
2. Confronta il prezzo sulla bottiglia nello scaffale con quello in mano
3. Se è minore scambia la bottiglia in mano con quella sullo scaffale
4. Se ci sono bottiglie non controllare, allora ripeti da 1.
5. Se le bottiglie sono finite, la bottiglia più economica è quella in mano
• E’ un algoritmo?
• La soluzione è corretta?
• Quanto tempo prende?
 
Algoritmo
Un algoritmo è una sequenza finita di passi elementari che
descrive come risolvere in un tempo finito un problema
Altri esempi di algoritmi:
• Istruzioni di montaggio
• Preparazione del caffè
• Prelievo bancomat
• Preparazione di un ricetta
• Calcolo del massimo comun divisore tra due interi
Algoritmo
Dati iniziali
ALGORITMO
Dati finali (soluzione)
Algoritmo: sequenza di azioni elementari
che consenta di trasformare i dati iniziali nei risultati finali
attraverso un numero finito di passi, elementari e non ambigui.
Note:
• Insieme di dati iniziali ben definito
• Sequenza di passi può essere eseguita da un opportuno
esecutore (es. calcolatore).
Algoritmo
Dati iniziali
ALGORITMO
Dati finali (soluzione)
Proprietà fondamentali di un Algoritmo
• Correttezza; produce sempre una soluzione
• Efficienza: L’algoritmo perviene alla soluzione del problema
usando la minor quantità possibile di risorse fisiche, quali
tempo di esecuzione, memoria, ….
Algoritmo
Dati iniziali
ALGORITMO
Dati finali (soluzione)
Ricapitolando, un algoritmo deve essere:
• applicabile a qualsiasi insieme di dati di ingresso appartenenti
al dominio di definizione dell’algoritmo
• costituito da operazioni appartenenti ad un determinato
• insieme di operazioni fondamentali
• costituito da regole non ambigue, cioè interpretabili in modo
univoco qualunque sia l’esecutore (persona o “macchina”) che le
legge
Un esempio
 
Come identificare il profumo più economico?
0. Prendi la prima bottiglia,
1. Vai alla prossima bottiglia nello scaffale
2. Confronta il prezzo sulla bottiglia nello scaffale con quello in mano
3. Se è minore scambia la bottiglia in mano con quella sullo scaffale
4. Se ci sono bottiglie non controllare, allora ripeti da 1.
5. Se le bottiglie sono finite, la bottiglia più economica è quella in mano
• Dati ingresso?
• Operazioni?
• Esecutore?
 
Algoritmo
Esempio: prendere l’automobile
1. Aprire l’auto
2. Aprire la portiera
3. Sedersi al posto di guida
4. Schiacciare la frizione
5. Avviare il motore
6. Inserire la prima marcia
7. Rilasciare “delicatamente” la frizione per partire
I passi sono eseguiti in sequenza
l'ordine delle istruzioni è essenziale per la correttezza
Esempio: Biblioteca
I libri sono disposti sugli scaffali
•La posizione di ogni libro è fissa ed è individuata da due coordinate:
-Scaffale(i.e. numero dello scaffale)
-Posizione nello scaffale
•La biblioteca è dotata di uno schedario (ordinato per autore/i e titolo). Ogni
scheda contiene, nell’ordine:
-cognome e nome dell’autore
-titolo del libro
-data di pubblicazione
-numero dello scaffale in cui si trova
-posizione attribuita al libro nello scaffale.
Esempio: Biblioteca
Esempio di scheda
Autore/i:Sciuto, DonatellaBuonanno, GiacomoMari, Luca
Titolo:Introduzione ai Sistemi Informatici,
III Edizione, 2005
Scaffale:22
Posizione:11
Esempio: Biblioteca
Formulazione dell’algoritmo
1.Decidi il libro da richiedere
2.Preleva il libro richiesto
Raffinamenti successivi : se un passo non è direttamente comprensibile ed
eseguibile dall’esecutore (operazione semplice),
occorre dettagliarlo a sua volta mediante un ulteriore algoritmo.
Esempio: Biblioteca
Un algoritmo per il prelievo
1.Decidi il libro da richiedere
2.Cerca la scheda del libro richiesto
3.Segnati numero scaffale e posizione
4.Cerca lo scaffale indicato
5.Accedi alla posizione indicata e preleva il libro
6.Scrivi i tuoi dati sulla "scheda prestito"
Esempio: Biblioteca
Il sotto-algoritmo di ricerca
1.Prendi la prima scheda.
2.Esamina se titolo e autore/i sono quelli cercati.
In caso positivo la ricerca termina con successo,
altrimenti passa alla scheda successiva e ripeti.
3.Se esaurisci le schede il libro cercato non esiste.
Esempio: Biblioteca
Un algoritmo per il prelievo
1.Decidi il libro da richiedere
2.Cerca la scheda del libro richiesto come segue:
2.1. Prendi la prima scheda.
2.2. Esamina se titolo e autore/i sono quelli cercati.
In caso positivo la ricerca termina con successo,
altrimenti passa alla scheda successiva e ripeti.
2.3. Se esaurisci le schede il libro cercato non esiste.
3.Segnati numero scaffale e posizione
4.Cerca lo scaffale indicato
5.Accedi alla posizione indicata e preleva il libro
6.Scrivi i tuoi dati sulla "scheda prestito"
ES. Come piegare un foglio quadrato per ottenere un uccello.
Brookshear – Informatica XI ed – Capitolo 5 l
00/00/00
23
Primitive per l’origami.
Sono richieste delle primitive ben
definite
• Un insieme di primitive costituisce un
linguaggio di programmazione.
• Ogni primitiva è costituita da due
parti:
– Sintassi
– Semantica
Brookshear – Informatica XI ed – Capitolo 5 l
00/00/00
24
Pseudocodice Primitivo
• Istruzione di assegnamento
• Selezione condizionale
• Esecuzione ripetuta
• Procedura
nome  espressione
if condizione then attività
while condizione do azione
procedure nome
Brookshear – Informatica XI ed – Capitolo 5 l
00/00/00
25
ISTRUZIONI
Assegnamento: x  E, Calcola il valore dell’espressione E
e lo assegna alla variabile x
Esempio: xx+y calcola il valore di x+y e lo assegna ad x
se x vale 5 e y vale 3, x=x+y da ad x valore 8
ISTRUZIONI
Assegnamento: x E, Calcola il valore dell’espressione E
e lo assegna alla variabile x
Esempio: xx+y calcola il valore di x+y e lo assegna ad x
se x vale 5 e y vale 3, x x+y da ad x valore 8
Istruzioni Strutturate:
1) Composizione di Istruzioni:
I 1;
I 2;

Im;
Esegui I1, quando e’ terminata
esegui I2, quando e’ terminata
…
esegui Im.
X1;
y  2;
x  x+y; (x vale 3)
y  x*y (y vale 6)
ISTRUZIONI Strutturate
2) Istruzioni Condizionali:
If (C) then I;
Es. if (x<=y) then z  0:
Poni z=0 se x<=y; altrimenti lascia il valore di z inalterato
ISTRUZIONI Strutturate
2) Istruzioni Condizionali:
If (C) then I;
C condizione, I azione
Es. if (x<=y) then z  0:
Poni z=0 se x<=y; altrimenti lascia il valore di z inalterato
If (C) then I’ else I’’;
C condizione, I’ ed I’’ azioni
Es. Poni z=0 se x<=y; poni z=x-y se x>y
if (x<=y) then z  0 else z  x-y
Pseudocodice Primitivo
• Istruzione di assegnamento
nome  espressione
• Selezione condizionale
if condizione then attività
• Esecuzione ripetuta
while condizione do azione
• Procedura
procedure nome
Brookshear – Informatica XI ed – Capitolo 5 l
00/00/00
30
while ( Condizione ) Azione;
ES. Calcolo 1+2+… +n, risultato in y
X1; y0;
while (x<=n) {yy+x;
x x+1}
x
1
2
3
…
n
y
0
1
1+2=3
1+2+3=6
…
1+2+…+n
repeat I while (C);
X 1;
Y  0;
repeat {y y+x; x x+1 while (x<=n)
y
0
1
1+2=3
1+2+3=6
…
1+2+…+n
x
1
2 (>1)
3 (>2)
4 (>3)
…
n+1 (>n)
repeat I while (C);
X 1;
Y  0;
repeat {y y+x; x x+1 while (x<=n)
n=0?
y
0
1
1+2=3
1+2+3=6
…
1+2+…+n
x
1
2 (>1)
3 (>2)
4 (>3)
…
n+1 (>n)
repeat I while (C);
X 0;
Y  0;
repeat {y y+x; x x+1 while (x<=n)
n=0?
y
0
0
0+1=1
0+1+2=3
…
0+1+2+…+n
x
0
0 (>0)
1 (>1)
2 (>2)
…
n+1 (>n)
Pseudocodice Primitivo
• Istruzione di assegnamento
• Selezione condizionale
• Esecuzione ripetuta
• Procedura
nome  espressione
if condizione then attività
while condizione do azione
procedure nome
Brookshear – Informatica XI ed – Capitolo 5 l
00/00/00
35
Algoritmo di ricerca sequenziale in pseudocodice
Data una lista (Lista) ordinata vogliamo sapere se un elemento
(ValoreCercato) è nella lista
Lista ordinata: elementi ordinati in ordine decrescente da sinistra a
destra
Es: (1,2,6,11,12,15,21,34,56,88,97,123) è una lista ordinata di interi
Es. (albero, erba, pianta, vaso) è una lista ordinata di nomi in ordine
albabetico.
(ricorda es. Ricerca scheda libro nello schedario della biblioteca)
Brookshear – Informatica XI ed – Capitolo 5 l
00/00/00
36
Algoritmo di ricerca sequenziale in pseudocodice
Data una lista (Lista) ordinata vogliamo sapere se un
elemento (ValoreCercato) è nella lista
(ricorda es. scheda libro)
Brookshear – Informatica XI ed – Capitolo 5 l
00/00/00
37
Algoritmo di ricerca sequenziale in pseudocodice
Data una lista (Lista) ordinata vogliamo sapere se un
elemento (ValoreCercato) è nella lista
Es..
• Cerchiamo 34 nella Lista (1,2,6,11,12,15,21,34,56,88,97,123)
• Cerchiamo 38 nella Lista (1,2,6,11,12,15,21,34,56,88,97,123)
Brookshear – Informatica XI ed – Capitolo 5 l
00/00/00
38
Algoritmo di ricerca sequenziale in pseudocodice
Data una lista (Lista) ordinata vogliamo sapere se un
elemento (ValoreCercato) è nella lista
(ricorda es. scheda libro)
ALGORITMO ITERATIVO:
ripete stessa serie istruzioni
Brookshear – Informatica XI ed – Capitolo 5 l
00/00/00
39
Iterazione
ripetere piu’ volte una sequenza di operazioni
Componenti del controllo iterativo.
Brookshear – Informatica XI ed – Capitolo 5 l
00/00/00
40
Iterazione
ripetere piu’ volte una sequenza di operazioni
Ordinamento alfabetico della lista:
Fred, Alex, Diana, Byron e Carol.
Brookshear – Informatica XI ed – Capitolo 5 l
00/00/00
41
Algoritmo di ordinamento per inserimento espresso in pseudocodice.
Brookshear – Informatica XI ed – Capitolo 5 l
00/00/00
42
• Scrivere un algoritmo in pseudocodice per calcolare il massimo di una sequenza di
valori. Più precisamente, scrivere una procedura max(Lista) che restituisce il
massimo valore in Lista, dove si assume che Lista non sia vuota e che i suoi elementi
siano numeri interi positivi.
• Scrivere un algoritmo che calcoli il prodotto dei primi n numeri naturali.
• Sia Lista una lista contenente n numeri interi. Scrivere un algoritmo che calcoli la
somma degli elementi di Lista.
Ricorda: while (condizione) azione
ES. Calcolo 1+2+… +n, risultato in y
X1; y0;
while (x<=n) {yy+x;
x x+1}
43
Sia A una lista contenente n numeri interi positivi (ed A[i] l’elemento i-mo della lista).
Si consideri il seguente algoritmo
somma = 0;
i = 1;
A[n+1] = 10;
while (A[i] < 10) i := i + 1;
if (i <= n ) somma = somma +A[i]
Qual’è il valore di somma al termine del ciclo?
Ricorda: while (condizione) azione
ES. Calcolo 1+2+… +n, risultato in y
X1; y0;
while (x<=n) {yy+x;
x x+1}
44
Chiamate a procedure
• L’esecuzione di una procedura conduce
all’esecuzione di un’altra procedura
ES.
ProceduraA(n)
if (n>100) then restituisci 0
else esegui PorceduraB(n)
ProceduraB(n)
c=0;
while (n<100) do {n=2*n; c=c+1;}
restituisci c;
45
Strutture ricorsive
• L’esecuzione di una procedura conduce
all’esecuzione della stessa procedura su diverso
input
46
Strutture ricorsive
Es. Calcolo di n! =1*2*3*… *n
– Base. 1!=1
– In generale
n!= (n-1)! * n
= (n-2)! *(n-1)* (n)
= (n-3)! * (n-2) *(n-1)* (n)
…
=1*2* … (n-2) *(n-1)* (n)
fact(n)
{
if (n<=1) then restituisci 1 /*Base*/
else restituisci n*fact(n-1);
47
RICORSIONE
• L’esecuzione di una procedura conduce all’esecuzione
della stessa procedura su diverso input
• Vengono avviate attivazioni multiple della procedura
• Di queste tutte attendono il completamento
dell’ultima (caso base) che è quella che viene
effettivamente eseguita.
fact(n)
{
if (n<=1) then restituisci 1 /*Caso Base - termina*/
else restituisci n*fact(n-1) }
RICERCA BINARIA
Applicazione della nostra strategia per la ricerca della voce John in una
lista ordinata.
Brookshear – Informatica XI ed – Capitolo 5 l
00/00/00
49
Prima bozza della tecnica di ricerca binaria:
Cerchiamo il valore ‘’ElementoCercato’’ nella lista ordinata ‘’Lista’’
Brookshear – Informatica XI ed – Capitolo 5 l
00/00/00
50
Algoritmo binario di ricerca in pseudocodice
Cerchiamo il valore ‘’ElementoCercato’’ nella lista ordinata ‘’Lista’’
Brookshear – Informatica XI ed – Capitolo 5 l
00/00/00
51
Cerchiamo Bill
nella lista
Alice
Bill
Carol
David
Evelyn
Fred
George
Brookshear – Informatica XI ed – Capitolo 5 l
00/00/00
52
Cerchiamo David
nella lista
Alice
Carol
Evelyn
Fred
George
Brookshear – Informatica XI ed – Capitolo 5 l
00/00/00
53
Brookshear – Informatica XI ed – Capitolo 5 l
00/00/00
54
Tempo di computazione (Running Time) di programmi
ANALISI: analizza il r.t. di un dato programma
Si raggruppano input per dimensione
(es. ordinamento: dimensione= numero elementi da ordinare,
sisteme di n equazioni in n incognite: dimensione=n)
Running time: funzione T(n), con n=dimensione input,
che rappresenta il numero di “istruzioni semplici” usate
dall’algoritmo
Tempo effettivo dipende da vari paramentri: velocità del
processore usato, compilatore,….
Tempo di computazione (Running Time) di programmi
Worst case (caso peggiore): su diversi input di stessa
dimensione n si possono avere r.t. differenti
T(n)= max tempo su qualsiasi input di dimensione n
Es. ricerca iterativa di un elemento in una lista
(dimensione=n = elementi nella lista)
caso peggiore elemento non presente
Tempo di computazione (Running Time) di programmi
Confronto di r.t. Dato un problema consideriamo 2 algoritmi
A e B con r.t. T’(n) e T’’(n)
T’(n)=100n
T’’(n)=2n2
T’’(n)
T’(n)
n
n<50,
T’’(n) < T’(n)
n>50,
T’’(n) > T’(n)
n=100,
T’’(n) = 2 T’(n)
n=1000,
T’’(n) = 20 T’(n)
Tempo di computazione (Running Time) di programmi
T’(n)=100n
T’’(n)=2n2
Unità di tempo= 1ms (millisec)  1000 operazioni/sec
sec (1000ms) | max n per A
| (100n=1000*sec)
1
10
100
1000
|
|
|
|
10
100
1000
10000
| max n per B
|
|
|
|
|
|
|
|
|
| ( 2n2=1000*sec)
22
70
223
707
|
Tempo di computazione (Running Time) di programmi
T’(n)=100n
T’’(n)=2n2
Unità di tempo= 1ms (millisec)  1000 operazioni/sec
sec (1000ms) | max n per A
| (100n=1000*sec)
1
10
100
1000
|
|
|
|
10
100
1000
10000
| max n per B
|
|
|
|
|
|
|
|
|
| ( 2n2=1000*sec)
22
70
223
707
|
Se calcolatori diventano 100 volte più veloci
(unità di tempo =1/100 di ms  100.000 operazioni/sec)
In 10 sec
A passa da n=100 ad n=10000 (*100)
B passa da n=70
ad n=707
(*10)
Notazione Q-grande e r.t. approssimato
Dato un programma ed un input, r.t. dipende ancora da
1. Calcolatore usato (velocità di esecuzione istruzioni)
2. Compilatore (numero istruzioni macchina/istruzione C)
Quindi non ha senso parlare di tempo in sec per analizzare un
algoritmo.
Notazione Q-grande e r.t. approssimato
Dato un programma ed un input r.t. dipende ancora da
1. Calcolatore usato (velocità di esecuzione istruzioni)
2. Compilatore (numero istruzioni macchina/istruzione C)
Quindi non ha senso parlare di tempo in sec per analizzare un
algoritmo.
Per nascondere effetti di 1. e 2. si usa la notazione
Θ-grande (big-Theta) che ignora le costanti
Es. 4m-1=Q(m) (ignorando la costante moltiplicativa 4
e quella additiva 1)
Efficienza degli Algoritmi
• Misurata attraverso il numero di istruzioni eseguite
• Big theta notation: Utilizzata per rappresentare classi di efficienza
– Esempio: Insertion sort è Θ(n2)
• Analisi del caso migliore (Best), del caso peggiore (worst) e del caso medio
(average)
Applicazione dell’ordinamento per inserimento in una situazione di caso pessimo.
Brookshear – Informatica XI ed – Capitolo 5 l
00/00/00
62
Algoritmo di ordinamento per inserimento: analisi del caso pessimo.
Brookshear – Informatica XI ed – Capitolo 5 l
00/00/00
63
Algoritmo di ricerca binaria: analisi del caso pessimo.
Brookshear – Informatica XI ed – Capitolo 5 l
00/00/00
64
65
Esercizi RICORSIONE
• Scrivere un algoritmo in pseudocodice per calcolare il massimo di una sequenza di
valori. Più precisamente, scrivere una procedura max(Lista) che restituisce il
massimo valore in Lista, dove si assume che Lista non sia vuota e che i suoi elementi
siano numeri interi positivi.
• Scrivere un algoritmo che calcoli il prodotto dei primi n numeri naturali.
• Sia L una lista contenente n numeri interi. Scrivere un algoritmo che calcoli la
somma degli elementi di L.
• Qual è il risultato di emmecidi(18,24), dove emmecidi è la seguente procedura?
•
•
•
•
•
•
procedure emmecidi(X,Y)
if (X = Y)
then return X
else if (X > Y)
then return emmecidi(X-Y, Y)
else return emmecidi(X, Y-X)
66