Sei sulla pagina 1di 48

Corsi di Laurea in

04 - Algoritmi Ingegneria Biomedica e


Ingegneria Elettronica per
l'Energia e L’Informazione
a.a. 2020-2021
Sede di Cesena

Sara Montagna
email: sara.montagna@unibo.it
Ringraziamenti

❖ Professor Moreno Marzolla


❖ Professor Andrea Roli

Copyright © 2016–2019 Moreno Marzolla http://www.moreno.marzolla.name/teaching/FINFA/


Copyright © 2016–2019 Andrea Roli https://www.unibo.it/sitoweb/andrea.roli/en
Copyright © 2020 Sara Montagna https://www.unibo.it/sitoweb/sara.montagna/en
“L’informatica è lo studio sistematico degli
algoritmi che descrivono e trasformano
l’informazione: la loro teoria, analisi, progetto,
efficienza, realizzazione e applicazione”
–ACM
Informatica e Algoritmi
❖ L’informatica è lo studio degli algoritmi, e comprende
❖ Le loro proprietà formali e matematiche
Studiare il comportamento degli algoritmi per determinare se sono corretti ed
efficienti

❖ Le loro implementazioni hardware


Progettare e realizzare computer in grado di eseguire gli algoritmi

❖ Le loro implementazioni linguistiche


Progettare linguaggi di programmazione e tradurre attraverso essi gli algoritmi
affinché possano essere eseguiti mediante l’hardware

❖ 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…

❖ I matematici utilizzano continuamente algoritmi


❖ Algoritmo di Euclide per MCD
❖ Algoritmo per sommare due numeri
Algoritmo per sommare due numeri di m cifre
Dati: m ≥ 1 e due numeri positivi ognuno contenente m cifre
am-1, am-2, am-3,… a1, a0
bm-1, bm-2, bm-3,… b1, b0
trovare cm-1, cm-2, cm-3,… c1, c0 = (bm-1, bm-2, bm-3,… b1, b0 + am-1, am-2, am-3,… a1, a0)

Algoritmo:

Passo 1. Imposta il valore di riporto a 0


Passo 2. Imposta il valore di i a 0
Passo 3. Finché il valore di i è minore o uguale a m-1 ripeti le istruzioni dei passi da 4 a 6
Passo 4. Somma le due cifre ai e bi al valore corrente di riporto per ottenere ci
Passo 5. Se ci ≥ 10, allora riporta ci a ci-10 e imposta il valore di riporto a 1;
altrimenti imposta il valore di riporto a 0
Passo 6. Somma 1 a i, spostandoti di una colonna a sinistra
Passo 7. Se il valore del riporto è uguale a 1, imposta cm al valore di riporto
Passo 8. Stampa la soluzione finale (c_m),cm-1, cm-2, cm-3,… c1, c0
Passo 9. Stop.
Da Fig. 1.2 di Michael G Schneider. e Judith L. Gersting, Informatica. APOGEO (2013)
Algoritmi e intelligenza
❖ Prima che un dispositivo possa svolgere una qualsiasi operazione, bisogna
individuare un algoritmo per effettuarla, e rappresentare tale algoritmo in una
forma compatibile con la macchina
❖ Una volta individuato un algoritmo per risolvere un problema, svolgerlo non
richiede più la conoscenza dei principi su cui si basa. Basta eseguire
pedissequamente le istruzioni che lo compongono
❖ Troviamo algoritmo che formalizza l’esecuzione di una operazione
❖ Poi troviamo una macchina in grado di automatizzarla

…ovvero: se siamo in grado di specificare un algoritmo per risolvere un problema, allora possiamo automatizzare
la risoluzione del problema

❖ L’intelligenza necessaria per risolvere un problema è codificata nell’algoritmo


❖ Un computer non è in grado di svolgere alcuna attività in assenza di un
algoritmo Lo studio degli algoritmi è la base dell’informatica
I passi per risolvere un problema
L’informatica è la scienza della
risoluzione di problemi mediante
algoritmi. Tuttavia:
Problema
❖ Teorema di incompletezza di Gödel
(1930): Non tutti i problemi sono
risolvibili
Analisi
❖ Problemi per cui l’esecuzione ❖ Diagramma a blocchi
dell’algoritmo richiede talmente tanto
tempo da rendere la soluzione inutili Algoritmo ❖ Pseudocodice
❖ Problemi che non sappiamo ancora ❖ Descrizione testuale
risolvere
Implementazione
❖ Linguaggio di
Programma Programmazione
❖ C, Java, Matlab, Python…

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

❖ Ognuna di esse ha un singolo punto di ingresso e un singolo punto di uscita


❖ Una celebre pubblicazione che risultò fondamentale all'affermarsi della
programmazione strutturata fu “Flow Diagrams, Turing Machines, and
Languages with Only Two Formation Rules”, in cui Corrado Böhm e Giuseppe
Jacopini dimostrarono il loro celebre teorema.
❖ Teorema di Jacopini-Böhm: Qualsiasi programma può essere scritto usando tre
tipi di strutture di controllo: sequenza, selezione e iterazione.
Come rappresentare gli algoritmi
❖ La rappresentazione di un algoritmo richiede qualche forma di
linguaggio
❖ Il linguaggio di descrizione di un algoritmo deve essere adeguato alle
caratteristiche del suo esecutore
❖ Esecutore umano
❖ Linguaggio naturale
❖ Pseudocodice (linguaggio naturale “strutturato”)
❖ Linguaggio grafico (es. diagrammi di flusso)

❖ Esecutore automatico (calcolatore):


❖ Linguaggio di programmazione
Pseudocodice

❖ Molti studiosi di informatica utilizzano una notazione


denominata pseudocodice per progettare e rappresentare gli
algoritmi. Si tratta di costrutti in simil-linguaggio naturale
studiati per assomigliare alle istruzioni di un linguaggio di
programmazione, ma che in realtà non si eseguono su un
computer.
❖ Lo pseudocodice rappresenta un compromesso tra i due estremi
del linguaggio naturale e di quello formale; è semplice,
altamente leggibile e praticamente privo di regole grammaticali.
Diagramma di flusso
❖ Un diagramma di flusso (flow chart) è la rappresentazione grafica dei passi che
costituiscono un algoritmo
❖ E’ uno strumento efficace per la descrizione degli algoritmi
❖ Ogni istruzione dell’algoritmo viene rappresentata all’interno di un blocco
elementare, la cui forma grafica è determinata dal tipo di istruzione
❖ trasferimento di informazioni (lettura dati, scrittura risultati, visualizzazione
dati intermedi)
❖ esecuzione di calcoli
❖ assunzione di decisioni
❖ esecuzione di iterazioni (ripetizione di sequenze di operazioni)
❖ I blocchi sono collegati tra loro da linee di flusso, munite di frecce, che indicano il
susseguirsi di azioni elementari
Diagramma di flusso: simboli convenzionali
❖ Elaborazione
I blocchi rettangolari possono rappresentare istruzioni che comportano
x<—x+1
una qualche modifica dello stato globale della computazione (es.:
istruzioni di assegnamento, aggiornamento valore variabile)

❖ 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

Pre: n > 0, m > 0 entrambi interi


Post: Stampa il MCD(n,m)

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

❖ Per definire un algoritmo è necessario:


1. Condurre un'attenta analisi del problema
2. Individuare i possibili ingressi
3. Precisare le uscite
4. Definire completamente e dettagliatamente la sequenza dei passi
che portano alla soluzione (è conveniente suddividere il problema
in piccoli sottoproblemi)
Dal problema ai sottoproblemi

❖ 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.

NOTA: i sottoproblemi possono essere a loro volta risolti con la


tecnica divide et impera (quindi operando in maniera ricorsiva)

Dividendo il problema in porzioni più piccole è possibile governare la complessità che


altrimenti ci sovrasterebbe
Esempio: Numero Primo

❖ Problema: Scrivere un algoritmo che verifichi se un


numero dato n è primo
Passo 1 - Analisi del problema

❖ Definizione di numero primo: un numero naturale


maggiore di 1 che sia divisibile solamente per 1 e per sé
stesso
❖ Idea preliminare: usiamo la definizione per progettare
l'algoritmo. Proviamo tutti i possibili divisori di n: se ne
esiste almeno uno che non sia 1 o n, allora il numero
non è primo. Altrimenti lo è.
Passo 2 - Ingressi / Passo 3 - Uscite
❖ Ingressi
❖ Gli ingressi rappresentano le informazioni specifiche, i dati, che
abbiamo a disposizione per risolvere il problema
❖ In questo caso l'informazione che ci viene data dall'esterno è
solamente il numero n, che supponiamo essere maggiore di 1
❖ NOTA: nella pratica è sempre opportuno controllare che i dati inseriti
dall'utente siano coerenti e soddisfino i vincoli
❖ Uscite
❖ L'uscita dell'algoritmo (e del programma) è la risposta che cerchiamo.
❖ In questo caso cerchiamo una risposta di tipo SÌ/NO.
Passo 4 - Algoritmo
❖ Prima specifica in linguaggio naturale

1.Sia n il numero dato in ingresso

2.Prova a dividere n per tutti i numeri da 2 a n - 1

3.Se trovi un divisore (cioè il resto della divisione è 0),


allora fermati e stampa la risposta “Il NUMERO NON
È PRIMO”

4.Altrimenti, stampa “Il NUMERO È PRIMO”


Passo 4 - Algoritmo
❖ Specifica dettagliata in pseudocodice

Pre: n > 0, valore intero


Post: Stampa se il numero è primo o no

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

❖ Problema: dati due numeri naturali a e b (maggiori o


uguali a 0), determinarne il prodotto p, utilizzando la
sola operazione ‘+’, ovvero mediante la tecnica della
somma ripetuta.

Ossia determinare il valore della somma


a + a + a +…+ a (b volte)
Passo 1 - Analisi del problema
❖ Idea preliminare: occorre creare un ciclo da eseguire
esattamente b volte, dove in ciascuna esecuzione venga
aggiunto il valore a al totale progressivo
❖ Ho la necessità di contare quante volte il ciclo viene eseguito:
1. creo una variabile conteggio
2. la inizializzo a 0
3. la incremento di 1 ad ogni iterazione del ciclo
4. mi fermo quando conteggio è uguale a b (oppure, rimango dentro il
ciclo finché conteggio ha un valore minore di b)
❖ Lo scopo del ciclo è aggiungere a al totale progressivo di una variabile
prodotto inizializzata a 0 e ogni volta incrementata del valore di a
Passo 2 - Ingressi / Passo 3 - Uscite

❖ 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 ?

Aggiungere una condizione che li gestisce!!! Esempio:


Solo se a != 0 AND b != 0 esegui il punto 3,4
Passo 4 - pseudocodice prodotto
❖ Specifica dettagliata in pseudocodice

Pre: a >= 0, b >= 0


Post: Stampa p = a*b

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

❖ Scrivere un algoritmo che, dati in input un numero reale


x ≠ 0 e un intero n ≥ 0, calcola il valore xn
❖ Per definizione si pone x0 = 1
Qualche esempio classico dell’informatica
Ricerca in un elenco

❖ Problema: individuare il nome di una persona specifica


in un elenco telefonico, supponendo di avere 10000
nomi definiti come insieme ai relativi numeri telefonici
denotati come N1, N2, N3, …, N10000 insieme ai relativi
numeri telefonici denotati come T1, T2, T3, …, T10000
Analisi, Input e Output
❖ L’algoritmo deve consentire di immettere il nome N di una
persona: se N è in elenco, per esempio all’indice j, l’algoritmo
restituisce Tj, altrimenti restituisce un messaggio del tipo:
“Spiacente, questo nome non è presente in elenco”
❖ L’elenco è ordinato?
❖ NO: non esiste alcun metodo più efficiente di quello che
consiste nel cominciare dall’inizio ed esaminare ciascun
nome nell’elenco finché non si trova quello cercato o non si
giunge alla fine dell’elenco
—> RICERCA SEQUENZIALE (su elenco non ordinato)
Pseudocodice

Da Fig. 2.13 di Michael G Schneider. e Judith L. Gersting,


Informatica. APOGEO (2013) ❖ Costo computazionale:
❖ Caso migliore: 1
❖ Caso peggiore: n O(n)
❖ Caso medio: n/2
Massimo e minimo di un elenco di numeri

❖ Problema: dato un elenco non vuoto di valori reali v0,


v1, ... vn-1, scrivere un algoritmo per determinare il valore
massimo e minimo
❖ Se tutti i valori sono uguali, massimo e minimo
coincidono
❖ Se l'array ha un solo elemento (n = 1), massimo e
minimo coincidono con l'unico valore presente
Pseudocodice
Pre: v0, v1, … vn-1 elenco non vuoto di valori reali (n ≥ 1)
Post: Min, Max sono i valori minimo e massimo presenti nell'array

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

print Min, Max;


Flowchart
Dall’algoritmo al programma
❖ Se…
❖ per risolvere un certo problema esiste un algoritmo, cioè un
procedimento infallibile, che può essere descritto in modo non
ambiguo fino ai dettagli, e conduce sempre all’obiettivo
desiderato in un tempo finito
❖ …allora
❖ esistono le condizioni per affidare questo compito a un
computer, semplicemente descrivendo l'algoritmo in questione
in un programma scritto in un opportuno linguaggio
comprensibile alla macchina.

Potrebbero piacerti anche