Sei sulla pagina 1di 66

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


1
00/00/00
ALGORITMI e PROGRAMMI
Programmazione: Lavoro che si fa per costruire sequenze di
istruzioni (operazioni) adatte a svolgere un dato calcolo
INPUT: dati iniziali INPUT: x,y,z
AZIONI esempio: Somma x ed y
Somma z al risultato
OUTPUT: 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. 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
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

ALGORITMO
Dati iniziali 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

ALGORITMO
Dati iniziali 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

ALGORITMO
Dati iniziali 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


23
00/00/00
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


24
00/00/00
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


25
00/00/00
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; Esegui I1, quando e’ terminata X1;
I 2; esegui I2, quando e’ terminata y  2;
 … x  x+y; (x vale 3)
Im; esegui Im. 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 30


00/00/00
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 y
0
1 1
2 1+2=3
3 1+2+3=6
… …
n 1+2+…+n
repeat I while (C);

X 1;
Y  0;
repeat {y y+x; x x+1 while (x<=n)

y x
0 1
1 2 (>1)
1+2=3 3 (>2)
1+2+3=6 4 (>3)
… …
1+2+…+n n+1 (>n)
repeat I while (C);

X 1;
Y  0;
repeat {y y+x; x x+1 while (x<=n)

y x
0 1
1 2 (>1)
1+2=3 3 (>2)
1+2+3=6 4 (>3)
… …
n=0? 1+2+…+n n+1 (>n)
repeat I while (C);

X 0;
Y  0;
repeat {y y+x; x x+1 while (x<=n)

y x
0 0
0 0 (>0)
0+1=1 1 (>1)
0+1+2=3 2 (>2)
… …
n=0? 0+1+2+…+n n+1 (>n)
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


35
00/00/00
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


36
00/00/00
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


37
00/00/00
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
38
00/00/00
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


40
00/00/00
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


41
00/00/00
Algoritmo di ordinamento per inserimento espresso in pseudocodice.

Brookshear – Informatica XI ed – Capitolo 5 l


42
00/00/00
• 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


49
00/00/00
Prima bozza della tecnica di ricerca binaria:
Cerchiamo il valore ‘’ElementoCercato’’ nella lista ordinata ‘’Lista’’

Brookshear – Informatica XI ed – Capitolo 5 l


50
00/00/00
Algoritmo binario di ricerca in pseudocodice
Cerchiamo il valore ‘’ElementoCercato’’ nella lista ordinata ‘’Lista’’

Brookshear – Informatica XI ed – Capitolo 5 l


51
00/00/00
Cerchiamo Bill
nella lista
Alice
Bill
Carol
David
Evelyn
Fred
George

Brookshear – Informatica XI ed – Capitolo 5 l


52
00/00/00
Cerchiamo David
nella lista
Alice
Carol
Evelyn
Fred
George

Brookshear – Informatica XI ed – Capitolo 5 l


53
00/00/00
Brookshear – Informatica XI ed – Capitolo 5 l
54
00/00/00
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) n<50, T’’(n) < T’(n)

T’(n) n>50, T’’(n) > T’(n)

n=100, T’’(n) = 2 T’(n)

n=1000, T’’(n) = 20 T’(n)


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 | max n per B |


| (100n=1000*sec) | ( 2n2=1000*sec) |
1 | 10 | 22 |
10 | 100 | 70 |
100 | 1000 | 223 |
1000 | 10000 | 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 | max n per B |


| (100n=1000*sec) | ( 2n2=1000*sec) |
1 | 10 | 22 |
10 | 100 | 70 |
100 | 1000 | 223 |
1000 | 10000 | 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


62
00/00/00
Algoritmo di ordinamento per inserimento: analisi del caso pessimo.

Brookshear – Informatica XI ed – Capitolo 5 l


63
00/00/00
Algoritmo di ricerca binaria: analisi del caso pessimo.

Brookshear – Informatica XI ed – Capitolo 5 l


64
00/00/00
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

Potrebbero piacerti anche