Cenno agli Algoritmi
Stefano Bilotta
Corso di Informatica
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
1 / 40
L’approccio ad un problema
Quando si pensa di poter affrontare e risolvere un problema per
mezzo dell’Informatica, si procede alla sua analisi cercando di trovare
un metodo di soluzione o più in generale un modello matematico.
Il processo che porta alla soluzione del problema è un’attività di
natura logico-linguistica che può essere effettuata a prescindere dalla
struttura fisica dell’elaboratore.
Tale metodo di soluzione deve tuttavia essere ben formulato, senza
ambiguità o ridondanze, meglio se con strumenti matematici, e deve
portare alla soluzione in un tempo finito.
Un metodo di risoluzione come quello descritto si dice un algoritmo.
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
2 / 40
L’approccio ad un problema
In generale, l’approccio ad un problema, nel tentativo di trovare un
metodo di risoluzione, prevede in prima istanza una suddivisione del
problema stesso in sottoproblemi più elementari.
Trovando soluzioni per tali sottoproblemi si giunge all’algoritmo che
risolve il problema di partenza.
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
3 / 40
La definizione di algoritmo
Il termine Algoritmo deriva dal nome del matematico persiano
Muhammad ibn Musa ’l-Khwarizmi che durante il IX secolo si dedicò
allo studio algebrico di equazioni.
Formalmente, per algoritmo si intende una successione finita di passi
o istruzioni che definiscono le operazioni da eseguire su dei dati
(istanza del problema): in generale un algoritmo è definito per
risolvere ogni istanza di un problema di un certo tipo.
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
4 / 40
Proprietà dell’algoritmo
Un algoritmo deve necessariamente avere le seguenti proprietà:
Finitezza: ogni istruzione va eseguita in un tempo finito e deve
essere eseguita un numero finito di volte;
Generalità: un algoritmo deve fornire soluzione per tutti i problemi di
una classe;
Non ambiguità: i passi devono essere univoci, evitare paradossi,
contraddizioni e ambiguità.
Inoltre un algoritmo deve essere corretto ed efficiente, ossia arrivare alla
soluzione giusta e nel modo più veloce possibile, usando la minore quantità
di memoria possibile.
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
5 / 40
L’importanza dell’algoritmo
La ricerca e lo studio degli algoritmi è il vero nucleo dell’opera degli
informatici.
La sostanza di un programma sta nel lavoro a monte che ha portato
alla formulazione dell’algoritmo sottostante.
Si noti che un algoritmo è indipendente dal particolare elaboratore su
cui verrà realizzato il programma corrispondente. Se un giorno si
dovesse risolvere lo stesso problema su una macchina nuova usando
un nuovo linguaggio, l’algoritmo resterebbe comunque valido e non
sarebbe necessario eseguire di nuovo l’analisi del problema.
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
6 / 40
Un esempio di algoritmo
Consideriamo un semplice algoritmo per la somma dei primi n naturali.
0.
1.
2.
3.
4.
5.
6.
7.
(Stefano Bilotta)
Inizio;
Leggi n;
Poni i = 0 e s = 0;
Se i > n :
3.1. Stampa s (il risultato);
3.2. Vai al passo 7;
Aggiungi i ad s (s := s + i);
Incrementa i di 1 (i := i + 1);
Torna al passo 3;
Fine.
Cenno agli Algoritmi
Corso di Informatica
7 / 40
Osservazioni sull’esempio
L’argoritmo dell’esempio precedente ha la proprietà di finitezza.
Diversamente, è facile notare che se il passo 3.2 oppure il passo 5
fossero omessi l’algoritmo non terminerebbe.
Ha la proprietà di generalità, infatti l’algoritmo funziona per ogni n
generico (a meno che N non sia cosı̀ grande da non essere contenuto
in memoria).
Inoltre risulta non ambiguo. Diversamente, se il passo 2 fosse omesso
non sarebbero definiti i ed s ai passi successivi.
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
8 / 40
Un altro esempio di algoritmo
Consideriamo un semplice algoritmo per trovare il Massimo Comune
Divisore (MCD) tra due numeri.
Prima di iniziare si ricordi il procedimento di Eulero, il quale afferma
che:
MCD(a, b) = MCD(b, r ) se r 6= 0,
MDC (a, b) = b
se r = 0,
dove a, b sono numeri naturali con a > b e r = a mod b (ovvero r è il
resto della divisione di a con b).
Esempi:
MCD(105, 90) = MCD(90, 15) = 15;
MCD(27, 10) = MCD(10, 7) = MCD(7, 3) = MCD(3, 1) = 1.
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
9 / 40
L’algoritmo per MCD
Consideriamo un semplice algoritmo per trovare il Massimo Comune
Divisore (MCD) tra due numeri a, b.
0. Inizio;
1. Acquisisci i valori di a e b;
2. Se a < b :
2.1. Scambia b con a;
3. Calcola r (r := a mod b);
4. Se r = 0 :
4.1. Salta al passo 7;
5. Sostituisci a con b e b con r ;
6. Torna al passo 3;
7. Scrivi b (ovvero il risulato);
8. Fine.
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
10 / 40
Osservazioni sull’algoritmo
L’algoritmo dell’esempio precedente ha la proprietà di finitezza.
L’unico problema si potrebbe verificare al passo 6, in cui si dice di
tornare al passo 3. Si noti che r assumerà sicuramente valore 0.
Ha la proprità di generalità. Si può osservare come l’algoritmo risulti
valido anche per a = b.
Inoltre risulta non ambiguo.
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
11 / 40
Le istruzioni dell’algoritmo
Le istruzioni di un algoritmo sono semplici e basilari. Si possono
distinguere in:
lettura e scrittura (acquisizione e stampa);
operative (operazione aritmetiche o di assegnamento);
di controllo;
di salto.
Inoltre, dagli esempi precedenti emerge che lo stesso concetto può
essere espresso in più modi (leggi/acquisisci, stampa/scrivi, vai
a/salta a, ...)
Nasce dunque l’esigenza di uno pseudolinguaggio il più possibile
uniforme per la scrittura degli algoritmi. Tale pseudolinguaggio risulta
indipendente da uno specifico linguaggio di programmazione.
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
12 / 40
Diagramma di flusso
I diagrammi di flusso (flow chart) detti anche diagrammi a blocchi
rappresentano un linguaggio di modellazione grafica per la stesura degli
algoritmi. In particolare, in tali diagrammi le varie istruzioni dell’algoritmo
sono rappresentate mediante simboli grafici, detti blocchi elementari,
opportunamente collegati.
Blocco di inizio
Blocco di controllo
Inizio
x>0
Blocco di fine
V
F
Fine
Blocco di elaborazione
Blocco di input/output
Leggi/
scrivi x
x:=x+1
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
13 / 40
Proprietà
In un diagramma a blocchi sono presenti:
Un blocco di inizio e uno di fine;
Un numero finito di blocchi di elaborazione (o azione) e di
input/output;
Un numero finito di blocchi di controllo.
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
14 / 40
Proprietà
Inoltre valgono le seguenti proprietà:
Ogni blocco di elaborazione (o azione) o di input/output ha una
freccia in ingresso e una in uscita;
Ogni blocco di controllo ha una freccia in ingresso e due in uscita;
Ogni freccia entra in un blocco e si raccorda con un’altra freccia
(escluso la freccia in uscita del blocco di inizio e quella in entrata del
blocco di fine);
Ogni blocco è raggiungibile dal blocco di inizio;
Il blocco di fine è raggiungibile da ogni altro blocco.
Il blocco di controllo contiene una condizione solitamente
un’espressione che può essere vera o falsa (Ogni blocco di controllo
ha una freccia in ingresso e due in uscita).
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
15 / 40
Esempio
Diagramma di flusso per l’algoritmo che somma i primi n naturali.
Inizio
Leggi n
i:=0, s:=0
i>n
V
Scrivi s
Fine
F
s:=s+i
i:=i+1
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
16 / 40
Esempio
Diagramma di flusso per l’algoritmo che trova MCD(a, b).
x:=a
a:=b
b:=x
V
Inizio
Leggi a,b
b>a
r:=a mod b
r=0
V
Scrivi b
Fine
F
F
a:=b
b:=r
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
17 / 40
Alcuni costrutti fondamentali
Nello pseudolinguaggio si usano spesso dei costrutti fondamentali.
Il costrutto if Si usa nella forma:
if B then C1 else C2
dove B è un’espressione che può assumere valore di verità oppure
valore di falsità (B si dice espressione booleana), C1 e C2 sono invece
comandi.
Se B è vera allora si esegue C1, altrimenti C2
Il costrutto if si può trovare anche senza else:
if B then C1.
In questo caso se B è falsa non si esegue C1 ma si passa al comando
successivo all’if.
Il costrutto if è detto comando condizionale (o di selezione).
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
18 / 40
Alcuni costrutti fondamentali
Il costrutto for si usa nella forma:
for I from inizio to fine by passo do C
I è l’indice o contatore o variabile di controllo, inizio e fine sono
espressioni di tipo intero, passo è una costante.
Il ciclo for si può sinteticamente esprimere come segue:
1. inizializzare I con il valore di inizio (I:=inizio);
2. se I > fine, il ciclo termina; altrimenti:
2.1 eseguire il comando C;
2.2 incrementare I del valore di passo (I:=I+passo);
2.3 tornare al punto 2.
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
19 / 40
Alcuni costrutti fondamentali
Il costrutto while si usa nella forma:
while B do C
dove B è un’espressione booleana e C è un comando.
Il ciclo while si può sinteticamente esprimere come segue:
1. valutare l’espressione booleana B;
2. se B è vera eseguire il comando C e tornare al passo 1, altrimenti il
ciclo termina.
I cicli for e while si dicono comandi iterativi. Il ciclo for è un’iterazione
determinata poiché conoscendo il valore di inizio, fine e passo (che sono
praticamente numeri) è possibile sapere quante volte sarà eseguito il
comando C. Ciò non è possibile nel ciclo while, che sono iterazioni
indeterminate.
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
20 / 40
Algoritmi di base
Alcuni problemi basilari si ritrovano molto spesso, eventualmente
come sottoproblemi di situazioni più complesse.
Specificatamente, in Informatica si considerano due problemi,
l’ordinamento e la ricerca dei dati, come fondamentali, e si dicono di
base gli algoritmi che li risolvono.
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
21 / 40
Ordinamento: Selection sort
Si consideri un elenco disordinato: 13
23
19
11
5.
Cercare il minimo fra gli elementi e lo si scambia con il primo
elemento dell’elenco. Dopodiché si cerca il minimo fra gli elementi
rimanenti e si scambia col secondo elemento e si prosegue in questo
senso...
Si ha:
5 23
(Stefano Bilotta)
19
11
13
5
11 19
23
13
5
11
13
23
19
5
11
13
19 23
5
11
13
19
Cenno agli Algoritmi
23
Corso di Informatica
22 / 40
Ordinamento: Bubble sort
Si consideri un elenco disordinato: 13
23
19
11
5.
Scandire l’elenco, confrontare un elemento con il successivo e
proseguire verso destra. Se il primo elemento è minore del secondo
allora si lasciano le cose invariate, altrimenti si scambiano le posizioni
dei due elementi.
Schematizzando:
(Stefano Bilotta)
13
19
11
5
23
13
11
5 19
23
11
5
13
19
23
5
11
13
19
23
5
11
13
19
23
Cenno agli Algoritmi
Corso di Informatica
23 / 40
Cenni sulla complessità
La complessità di un algoritmo è la misura della sua efficienza.
Se l’algoritmo deve gestire n dati, la complessità si misura in funzione
di n e determina in media il numero di operazioni che devono essere
effettuate per raggiungere il risultato.
Gli algoritmi di ordinamento visti in precedenza hanno complessità
quadratica. Si noti che, raddoppiando n il numero di operazioni
diviene quattro volte più grande.
Dalla complessità dipende dunque il tempo di eleborazione
dell’algoritmo.
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
24 / 40
Strutture dati
Un elenco di dati, dal punto di vista informatico, rappresenta una
sequenza di posizioni contigue nella memoria centrale dell’elaboratore
e ogni dato corrisponde ad un certo numero di Byte.
Un elenco costituito da elementi in posizioni contigue, di lunghezza
fissata in numero di Byte, si dice in gergo vettore o array ed è la più
semplice struttura dati.
V1
(Stefano Bilotta)
V2
V3
Vn-1 Vn
Cenno agli Algoritmi
Corso di Informatica
25 / 40
Strutture dati
Un altro esempio di struttura dati è costituito dalle liste. Un lista
come un vettore è una sequenza di dati, ognuno di lunghezza fissata,
ma che risiedono in posizioni non contigue della memoria.
Ogni elemento della lista è dunque costituito da due parti: il dato e il
collegamento (puntatore) all’elemento successivo. L’ultimo elemento
della lista è il puntatore vuoto.
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
26 / 40
Strutture dati
Il vantaggio della lista rispetto al vettore sta nel fatto che gli elementi
possono essere sparsi nella memoria, garantendo una grande
flessibilità alla struttura, contro la rigidità del vettore.
Tra le capacità delle liste vanno considerate le seguenti:
Crescita indefinita,
Possibilità di poter inserire velocemente e facilmente un elemento in
prima posizione
Tuttavia, nella lista non è possibile sapere dove si trova un certo
elemento. La liste va scorsa e gli elementi contati con gran perdita di
tempo.
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
27 / 40
Strutture dati
Mediante la filosofia delle liste si ottengono delle altre utilissime
strutture dati: la pila e la coda.
La pila è una lista lineare (un insieme ordinato di oggetti) a lunghezza
variabile in cui inserimenti ed estrazioni avvengono dalla stessa parte,
detta testa della pila. Si realizza il principio LIFO: Last In First Out.
La coda è una lista lineare a lunghezza variabile in cui l’inserimento
viene effettuato ad un estremo (fondo) e l’estrazione all’altro estremo
(testa). Si realizza il principio FIFO: First IN First Out.
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
28 / 40
Alberi binari
Una delle strutture più interessanti è quella degli alberi binari.
Un albero binario è costituito dalla radice (ovvero il nodo iniziale), e
da questa si dipartono al più due rami ognuno dei quali raggiunge un
nodo (destra e sinistra), dal quale partono altri due rami e cosı̀ di
seguito.
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
29 / 40
Alberi binari di ricerca
Gli alberi binari hanno svariati usi, in Informatica i più famosi sono gli
alberi binari di ricerca.
Il loro nome deriva dal fatto che sono utilizzati per la ricerca veloce
delle informazioni, ma sono di fondamentale importanza soprattutto
per la memorizzazione dei dati. Inoltre, i dati memorizzati risultano
implicitamente ordinati.
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
30 / 40
Alberi binari di ricerca
Avendo a disposizione un elenco di dati, si inserisce il primo
dell’elenco in radice, il secondo elemento si confronta con la radice: se
è maggiore della radice si inserisce nel nodo figlio di destra, altrimenti
nel nodo figlio di sinistra. Questa operazione si ripete fino ad esaurire
tutti gli elementi.
Dunque, durante l’inserimento dei dati, spostiamo l’inserimento verso
sinistra se l’elemento è minore del nodo padre, lo spostiamo verso
destra se è maggiore (implicando l’ordinamento).
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
31 / 40
Alberi binari di ricerca
Dato l’elenco: 13
23
19
11
5, si ha:
13
11
5
23
19
L’ordinamento è dunque ottenuto dal seguente procedimento:
1. Ordinare gli elementi del sottoalbero di sinistra,
2. Inserire radice,
3. Ordinare gli elementi del sottoalbero di destra.
Si ottiene: 5
(Stefano Bilotta)
11
13
19
23
Cenno agli Algoritmi
Corso di Informatica
32 / 40
Vari tipi di problemi
I moderni elaboratori elettronici si sono acquistati la fama di
macchine velocissime, che riescono ad affrontare e risolvere tutti i
problemi che la realtà ci propone in termini algoritmici. Questo è ben
lontano dal vero.
1. Vi sono problemi dei quali conosciamo benissimo le soluzioni
possibili, ma che l’elaboratore affronta solo con estrema difficoltà.
2. Esistono problemi che non sono risolubili in termini algoritmici,
quindi non sono risolubili né con gli elaboratori di oggi né con quelli
che saranno costruiti in futuro.
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
33 / 40
Problemi risolubili
Un problema si dice risolubile quando esiste un metodo, ovvero un
algoritmo, che trova la soluzione (se esiste soluzione) oppure che
stabilisce che non vi è soluzione (se non esiste soluzione).
Un problema che sia sempre risolubile in questo senso si dice
tecnicamente decidibile, e la parola sta ad indicare il fatto che, in ogni
caso, sappiamo decidere se il problema ha soluzione (e, quindi, quale
essa sia) o non ha soluzione.
Fra i problemi decidibili vi sono quelli che l’elaboratore tratta con
troppa difficoltà, anche se gli viene fornita soluzione algoritmica
(problemi intrattabili).
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
34 / 40
Il commesso viaggiatore
Uno tra i più famosi problemi intrattabili è quello del commesso
viaggiatore:
Nella città X vive un commesso viaggiatore che all’inizio di ogni mese
è abituato a mettere a punto il piano delle proprie visite nel periodo in
questione. Egli sa quali città visitare per il suo lavoro, sa le spese che
deve affrontare per i suoi spostamenti, e desidera trovare il percorso
ottimale, cioè il percorso che, partendo da X, lo riporta a X dopo aver
visitato tutte le città, ma con la minor spesa
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
35 / 40
Il commesso viaggiatore
2 città da visitare: i percorsi possibili sono XABX e XBAX. Soluzione
banale, che consiste nel calcolare il costo dei due percorsi e scegliere
quello che costa meno.
3 città da visitare: i percorsi possibili sono XABCX, XACBX, XBACX,
XBCAX, XCABX, XCBAX. Tali percorsi corrispondono alle possibili
permutazioni di A, B, C cioè al loro possibile ordinamento.
La questione comincia a diventare complicata...
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
36 / 40
Il commesso viaggiatore
In generale, le permutazioni di n elementi sono
n! = n ∗ (n − 1) ∗ (n − 2) ∗ . . . ∗ 2 ∗ 1 (il fattoriale di n). Il fattoriale è
una quantità che cresce molto rapidamente. Ad esempio:
10! = 3628800 e addirittura 20! è dell’ordine di 1018 .
Se il commesso viaggiatore volesse visitare 20 città, il suo elaboratore
dovrebbe trattare circa 1018 permutazioni. Supponendo che il
calcolatore ne tratti una ogni milionesimo di secondo, impiegherebbe
circa 1012 secondi, ovvero circa 35 mila anni.
Si potrebbe pensare di trovare algoritmi che non devono passare in
rassegna tutte le permutazioni possibili. Ad oggi, dopo svariati studi,
nulla si è potuto fare in questa direzione.
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
37 / 40
Problemi intrattabili
Formalmente, il numero di permutazioni cresce in modo più che
esponenziale (Stirling 1780).
Un problema si dice intrattabile se la sua complessità è almeno
esponenziale. Si dice invece trattabile se la sua complessità è al più
polinomiale.
Quando un algoritmo di risoluzione di un problema ha complessità
esponenziale, l’aumento di poche unità nella dimensione del problema
comporta una crescita enorme nel numero di operazioni da effettuare
e quindi ad una impennata nel tempo di elaborazione.
Un altro esempio di problema intrattabile è la scomposizione di un
numero in fattori primi, tale difficoltà viene appunto sfruttata per la
sicurezza dei dati.
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
38 / 40
Congetture
Ad oggi, esistono anche problemi di cui non conosciamo algoritmi di
risoluzione. Due fra i più famosi:
1. Si può osservare che esistono coppie di numeri primi gemelli, cioè
che differiscono di 2 unità (11 e 13, 29 e 31). E’ stata fatta l’ipotesi
che i primi gemelli siano infiniti, ma nessuno è mai riuscito a
dimostrare.
2. Congettura di Goldbach: ogni numero pari maggiore di 2 si può
ottenere come somma di due numeri primi (30 = 19 + 11,
32 = 19 + 13). Ancora nessuno è riuscito a trovare una dimostrazione.
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
39 / 40
Problemi indecidibili
Esistono addirittura problemi, correttamente formulabili, dei quali non
possiamo stabilire se esiste oppure se non esiste una data soluzione
algoritmica, dunque problemi che risultano irrisolubili
algoritmicamente. Tali problemi si dicono in genere indecidibili.
Problema della fermata: Dato un algoritmo A e un dato D, entrambi
arbitrari, stabilire se la computazione A(D) termina in un numero
finito di passi o se la sua esecuzione continua all’infinito. E’ stato
dimostrato che il Problema della fermata è indecidibile, ovvero non è
possibile stabilire se esiste o meno un algoritmo generale che possa
risolvere il problema per tutti i possibili input (Turing, 1937).
(Stefano Bilotta)
Cenno agli Algoritmi
Corso di Informatica
40 / 40