04 Algoritmi
04 Algoritmi
Sara Montagna
email: [email protected]
Ringraziamenti
❖ Le loro applicazioni
Identificare problemi importanti e progettare applicazioni software corrette ed
efficienti in grado di risolverli
Norman E Gibbs Allen B. Tucker. “A model curriculum for a liberal arts degree in computer science”
Communication of the ACM, vol 29 n3 (Marzo 1986)
Definizione di algoritmo
❖ Definizione dalla TRECCANI:
❖ algoritmo (ant. algorismo) s. m. [dal lat. mediev. algorithmus o algorismus, dal nome
d’origine, al-Khuwārizmī, del matematico arabo Muḥammad ibn Mūsa del 9° sec.
(così chiamato perché nativo di Khwarizm, regione dell’Asia Centrale)]. – 1. Termine
che indicò nel medioevo i procedimenti di calcolo numerico fondati sopra l’uso delle
cifre arabiche. Nell’uso odierno, anche con riferimento all’uso dei calcolatori,
qualunque schema o procedimento matematico di calcolo; più precisamente, un
procedimento di calcolo esplicito e descrivibile con un numero finito di regole che
conduce al risultato dopo un numero finito di operazioni, cioè di applicazioni delle
regole. In partic., a. euclideo, metodo per determinare il massimo comune divisore di
due numeri interi a e b, basato su divisioni successive. 2. In informatica, insieme di
istruzioni che deve essere applicato per eseguire un’elaborazione o risolvere un
problema. 3. In logica matematica, qualsiasi procedimento «effettivo» di computo di
una funzione o di decisione di un insieme (o predicato), cioè qualsiasi procedimento
che consenta, con un numero finito di passi eseguiti secondo un insieme finito di
regole esplicite, di ottenere il valore della funzione per un dato argomento, o di
decidere se un dato individuo appartiene all’insieme (o soddisfa il predicato).
Definizione di algoritmo
❖ Sequenza di passi che definisce il modo con cui viene eseguita
una operazione
❖ Passo 1: fa qualcosa
❖ Passo 2: fa qualcosa
❖ Passo 3: fa qualcosa
❖ …
❖ Passo N: stop, terminato
❖ Più formalmente
❖ “Un insieme ordinato di operazioni non ambigue ed effettivamente
computabili che, quando eseguito, produce un risultato e si arresta in un
tempo finito.”
Qualche esempio
❖ Algoritmi per convertire la rappresentazione numerica da una forma a
un’altra
❖ Algoritmo base della CPU
❖ Finché non incontri l’istruzione di halt, continua a eseguire i seguenti passi:
1. Preleva una istruzione
2. Decodifica l’istruzione
3. Esegui l’istruzione
❖ Non riguardano solo attività tecniche, ma sono alla base di attività comuni
❖ Eseguiamo un algoritmo quando montiamo un giocattolo, cuciniamo un dolce,
calcoliamo il saldo di un conto, impostiamo un termostato…
Algoritmo:
…ovvero: se siamo in grado di specificare un algoritmo per risolvere un problema, allora possiamo automatizzare
la risoluzione del problema
Esecuzione
Risultati
Proprietà di un algoritmo
❖ Atomicità
❖ I passi costituenti devono essere elementari, cioè non ulteriormente scomponibili
❖ Non ambiguità
❖ I passi devono essere interpretabili in modo diretto e univoco dall'esecutore, sia esso umano o artificiale.
Di qui, i risultati non devono variare in funzione della macchina o persona che esegue l’algoritmo
❖ Effettivamente computabile
❖ Deve esistere un processo computazionale che consenta di completare l’operazione con successo
❖ Finitezza
❖ L'algoritmo deve essere composto da un numero finito di passi elementari e richiedere una quantità finita
di risorse (es., memoria, ...) per la sua esecuzione; le operazioni sono eseguite un numero finito di volte
❖ Terminazione
❖ L'esecuzione deve avere termine dopo un tempo finito
❖ Efficienza
❖ Deve avere un costo accettabile, se non ottimo, in termini di risorse consumate: tempo di CPU richiesto per
completare, quantità di memoria utilizzata, quantità di bit trasferiti)
Definizione di un algoritmo
❖ Tutte le operazioni utilizzate per realizzare algoritmi rientrano in una delle
seguenti tre categorie:
❖ Operazioni sequenziali
Un’istruzione sequenziale esegue una singola attività ben definita. Terminata
l’attività, l’algoritmo passa all’operazione successiva. Solitamente le operazioni
sequenziali sono espresse come semplici frasi dichiarative.
❖ Operazioni condizionali
Si tratta delle istruzioni di un algoritmo che “pongono una domanda”.
L’operazione successiva è selezionata sulla base della risposta fornita alla
domanda.
❖ Operazioni iterative
Si tratta delle istruzioni “di ciclo” di un algoritmo. Indicano di non proseguire
con l’istruzione successiva, ma di tornare indietro e ripetere l’esecuzione di un
precedente blocco di istruzioni.
Programmazione strutturata
❖ Programmazione strutturata
❖ Qualsiasi algoritmo può essere espresso combinando tra loro le strutture di
controllo fondamentali
1. Sequenza
2. Condizione
3. Iterazione
❖ Decisione
I blocchi a forma di rombo vengono utilizzati per rappresentare Vero
x=1
istruzioni condizionali, subordinate al risultato TEST (Vero, Falso) di
un test
Falso
❖ Input/output
I blocchi a forma di parallelepipedo sono utilizzati per rappresentare Leggi/
istruzioni di Input/Output dei dati scrivi x
❖ Inizio/fine
I blocchi ovali vengono utilizzati per rappresentare l’inizio e la fine Inizio
dell’algoritmo
Fine
Costrutti fondamentali della programmazione strutturata
Costrutti fondamentali della programmazione strutturata
Qualche esempio dall’aritmetica
Esempio: Massimo Comun Divisore
❖ Descrizione in linguaggio naturale
1. Siano n e m due valori interi positivi
2. Se n = m, termina indicando n come risultato
3. Se n > m:
1. assegna a n il valore (n-m);
2. torna al punto 2
4. Se n < m:
1. assegna a m il valore (m-n);
2. torna al punto 2
Vantaggi e svantaggi del linguaggio naturale
❖ Vantaggi ❖ Svantaggi
❖ Notazione comprensibile ❖ Il linguaggio naturale può
anche ai non esperti risultare verboso, e quindi
produrre una descrizione
prolissa
❖ Persone diverse hanno stili
di scrittura diversi, e questo
può generare ambiguità
Esempio: Massimo Comun Divisore
❖ Descrizione mediante pseudocodice
while (n ≠ m) do
if (n > m) then
n ← n – m;
else
m ← m – n;
end if
end while
print n;
Vantaggi e svantaggi dello pseudocodice
❖ Vantaggi ❖ Svantaggi
❖ Più preciso e compatto ❖ Notazione non univoca: non
rispetto al linguaggio esiste un unico “tipo” di
naturale pseudocodice
❖ Può essere compreso anche
da utenti non esperti purché
abbiano una minima
confidenza con la notazione
❖ Facilita la traduzione
dell'algoritmo in programma
per un "vero" linguaggio di
programmazione
Esempio: Massimo Comun Divisore
❖ Descrizione mediante flowchart
Vantaggi e svantaggi dei diagrammi di flusso
❖ Vantaggi ❖ Svantaggi
❖ Notazione di facile ❖ Possono risultare complessi
comprensione anche per non per algoritmi di dimensioni
esperti medio-grandi
❖ Consente di individuare “a ❖ I flowchart richiedono uno
colpo d'occhio” strutture spazio maggiore rispetto
particolari come cicli e
alle descrizioni testuali
condizioni
❖ Se abusati, possono
❖ Esistono software per
produrre descrizioni
disegnare flowchart e
incomprensibili
tradurli in programmi
Tecniche di progettazione di algoritmi
❖ Divide et Impera
1. Si divide il problema in a sottoproblemi di dimensione inferiore
2. Si risolvono i sottoproblemi.
3. Si combinano le soluzioni dei sottoproblemi in modo da ottenere
la soluzione del problema principale.
m ←2
while (m ≠ n) do
if (n%m == 0) then
print “Il numero non è primo”
stop
else
m ← m+1;
end if
end while
print “Il numero è primo”;
Passo 4 - Flowchart
m ←2
m ← m+1
Esempio: Prodotto tra due numeri
❖ Ingressi
❖ L'informazione che ci viene data dall'esterno sono i
numeri a e b che devono essere maggiori o uguali di 0
❖ Uscite
❖ L'uscita dell'algoritmo (e del programma) è un
numero p corrispondente al prodotto tra a e b
Passo 4 - Algoritmo
❖ Prima specifica in linguaggio naturale
1. Siano a e b i numeri dati in ingresso
2. Creo una variabile prodotto p e la inizializzo a 0
3. Creo una variabile conteggio c e la inizializzo a 0
4. Finché c < b
i. Imposta il valore di p a (p + a)
ii. Imposta il valore di c a (c+1)
Fine del ciclo
5. Stampa il valore di p
❖ Analisi della correttezza dell’algoritmo:
❖ L’algoritmo proposto risolve il problema in esame?
❖ Analisi del corretto funzionamento per i valori limite:
l’algoritmo funziona anche per a = 0 e/o b = 0 ?
p ← 0
if a ≠ 0 && b ≠ 0
for c ← 0 to b-1 do
p ← p+a
c ← c+1
end for
end if
print p
Esercizi
Min ← v0
Max ← v0
for i ← 1 to n-1 do
if (vi < Min) then
Min ← v
else
if (vi > Max) then
Max ← vi
end if
end if
end for