Sei sulla pagina 1di 39

Algoritmi e Strutture Dati

Lezione 1
Presentazione del corso
Obiettivi del corso

Definire formalmente la nozione di


algoritmo

Organizzare le informazioni in strutture dati

Progettare algoritmi corretti ed efficienti


 risolvendo il problema il più velocemente
possibile
 usando il minor spazio di memoria
possibile. 2
Cos’è un algoritmo

Il termine algoritmo deriva dal


matematico persiano
al-Khowârizmî (c.780-850),
autore del testo Al-jabr w’al-
muqabâla (da cui anche il
termine Algebra), che
descrisse delle procedure per i
calcoli matematici.

3
Cos’è un algoritmo

Dato un problema per arrivare ad un programma


che lo risolva dobbiamo:
 individuare gli input
 definire gli output
 trovare un metodo di risoluzione
 un algoritmo
 strutture dati

 codificare l’algoritmo e strutture dati in un linguaggio


comprensibile dalla macchina (C)
Un algoritmo è un insieme di regole (non ambigue) che ci
permette di calcolare i risultati voluti a partire dai dati di input
 una procedura che descrive una sequenza di passi ben definiti
finalizzato a risolvere un dato problema (computazionale).
4
Esempi di problemi computazionali

Problema dell’ordinamento
 Input: a0,a1,...,an-1
 Output: a'0,a'1,...,a'n-1 permutazione di a0,a1,...,an-1
tale che a'0  a'1 ...  a'n-1
 Algoritmo di ordinamento: una procedura che prende
in input a0,a1,...,an-1 e produce in output a'0,a'1,...,a'n-1

Problema della ricerca di un elemento


 Input: Tabella A[1…n] ed un elemento x
 Output: “SI” se x è presente in A, “NO” altrimenti
 Algoritmo di ricerca: una procedura che prende in
input A[1…n] e produce in output “SI” se x è presente
in A, “NO” altrimenti. 5
Algoritmo e programma

Un algoritmo può essere visto come l’essenza


computazionale di un programma
 fornisce il procedimento per giungere alla soluzione di un dato
problema di calcolo.
L’algoritmo è diverso dal programma
 il programma è la codifica (in un linguaggio di programmazione) di un
algoritmo
 un algoritmo può essere visto come un programma distillato da dettagli
riguardanti il linguaggio di programmazione, ambiente di sviluppo,
sistema operativo
 un algoritmo è un concetto autonomo da quello di programma.

6
Descrizione del corso

Analisi e Complessità degli algoritmi


• iterativi
• ricorsivi
Strutture Dati
Algoritmi di Ordinamento

7
Analisi degli algoritmi

Impareremo ad analizzare e progettare “buoni”


algoritmi
Cosa si intende per “buoni”?
 corretti: producono correttamente il risultato
desiderato
 efficienti: usano poche risorse di calcolo, come
tempo e memoria.

8
Le Strutture Dati

Una Struttura Dati è un modo per organizzare un insieme


di informazioni, con delle precise regole per aggiungere
o togliere elementi, passare da un elemento all'altro,
individuare il primo o l'ultimo elemento, ecc.
Esistono delle strutture dati che sono direttamente
utilizzabili nei Linguaggi di Programmazione Evoluti.
Tali strutture possono essere classificate come
 strutture dati fisiche
 strutture dati logiche.

9
Le Strutture Dati

Strutture dati fisiche Strutture dati logiche


Il vettore o array La lista
La matrice La pila o stack
Il file La coda
L’albero
La tabella hash
Il grafo

10
Le strutture dati logiche: la lista

La lista è una Struttura Dati in cui ogni elemento è


formato da due parti
 una parte serve per contenere l'informazione vera e propria
(campo key) e l'altra per contenere il riferimento all'elemento
successivo (campo link).
La lista viene utilizzata quando è necessario mantenere
una sequenza logica fra i vari elementi
 la ricerca di un'informazione può avvenire solo con i canoni
della ricerca sequenziale.

La struttura lista trova molteplici applicazioni


 la gestione dello spazio su disco da parte del Sistema Windows.
11
Le strutture dati logiche: la pila

La pila o stack è una Struttura Dati in cui le


informazioni vengono immesse e prelevate
secondo la regola L.I.F.O. (Last In First Out).
Un'applicazione caratteristica della pila è quella che
permette al Sistema Operativo di memorizzare gli
indirizzi di memoria delle istruzioni a cui tornare dopo
l'esecuzione di sottoprogrammi che si attivano in
sequenza.
Un'altra applicazione è quella che permette al S.O. di
gestire l'utilizzo dei settori liberi sul disco.
12
Le strutture dati logiche: la coda

La coda è una Struttura Dati in cui le informazioni


vengono immesse e prelevate secondo la regola F.I.F.O.
(First In First Out).
La coda trova varie applicazioni in campo informatico
 viene utilizzata dal Sistema Operativo per gestire le richieste
di risorse da parte di più utenti (in alcuni casi gli utenti sono
dei dispositivi hardware).

13
Le strutture dati logiche: l’albero

L'albero è una Struttura Dati logica


dove ogni elemento è collocato
all'interno di un ordine gerarchico
 fra gli elementi, chiamati nodi, ne esiste uno da cui si parte per
raggiungere gli altri chiamato radice
 ogni nodo, compresa la radice, può essere collegato con più nodi,
a livello gerarchico inferiore.
L'albero trova svariate applicazioni in Informatica
 per memorizzare e gestire informazioni, fra di loro in ordine
gerarchico, per la ricerca rapida delle informazioni (Information
Retrieval) (albero binario di ricerca)
 per la rappresentazione del calcolo delle espressioni aritmetiche.
14
Le strutture dati logiche: tabella hash

Una tabella hash è una Struttura


Dati che permette operazioni di
ricerca e inserimento molto veloci.
La realizzazione di una tabella hash
è basata sull’uso di array.
Se si vogliono memorizzare degli oggetti in una tabella di
dimensione n (con posizioni da 0 a n-1)
 si memorizzano gli oggetti assegnando ad ogni oggetto un
numero intero i, detto codice hash, compreso tra 0 e n-1 e
inserendo tale oggetto nell’i-esima posizione della tabella.

15
Le strutture dati logiche: il grafo

Un grafo è formato da un insieme di elementi,


detti vertici o nodi, collegati fra di loro
mediante dei link, detti archi o lati
 a differenza dell'albero, per il grafo non esiste una gerarchia e
non ci sono restrizioni sui collegamenti.

Il grafo è una struttura dati, estremamente utile, che trova


infinite applicazioni, anche al di fuori dell'area
informatica
 dalla chimica ai trasporti
 dalla sociologia all'analisi dei circuiti elettrici
 dai giochi alla ricerca operativa. 16
Algoritmi di ordinamento

L’ordinamento è una operazione fondamentale in


informatica per questo sono stati sviluppati vari algoritmi
di ordinamento.
La scelta dell’algoritmo più appropriato a una data
applicazione dipende, fra l’altro, dal numero di elementi
da ordinare, dal livello di ordinamento iniziale degli
elementi, da eventuali vincoli sui valori degli elementi
• ordinamento per selezione e per inserzione
• ordinamento rapido (Quicksort)
• ordinamento per fusione (Mergesort)
• ordinamento con heap e con radice. 17
Prerequisiti…

E’ richiesta la conoscenza:
Analisi matematica
Algebra lineare (vettori e matrici)
Buone capacità di programmazione in C
E’ quindi preferibile che lo studente abbia seguito
e superato con successo l’esame:
Programmazione I

18
Orario

Lezioni in aula
Martedì e Giovedì dalle 9:00 alle 10:40
Laboratorio
I turno: Martedì dalle 14:30 alle 17:00
II turno: Mercoledì dalle 14:30 alle 17:00
Tutoraggio
Ricevimento
Lunedì 10:00-12:00
On demand
19
Calendario

Secondo semestre (12 settimane)


 Inizio: 3 marzo
 Fine: 28 maggio
 Prima verifica: 16 aprile
 Seconda verifica: 28 maggio

6 appelli d’esame
 11-25 giugno  gennaio
 9 luglio  febbraio
 10 settembre
20
Come funziona…

La frequenza al corso è obbligatoria.

L’esame consiste in una prova scritta ed una


prova orale.
Durante il corso vengono effettuate 2 prove
valutative (con voto in 30esimi): una intermedia
ed una finale che coprono circa il 50% del
programma ciascuna.

21
Come funziona…

La partecipazione ai compiti di valutazione


intermedia e finale non è obbligatoria.
Il voto finale è dato dalla media delle due prove di
valutazione (si può partecipare alla seconda con
voto 16 nella prima).

Il corso di Algoritmi e Strutture Dati comprende


esercitazioni pratiche da svolgersi il Mar/Mer.
Per sostenere la prova orale è necessario aver
svolto tutti gli esercizi proposti durante il corso.
22
Coordinate del docente

Cecilia Di Ruberto
Telefono: 070 6758507
E-mail: dirubert@unica.it
Ricevimento: lunedì 10:00-12:00

Tutors
Gianmarco Cherchi, e-mail: g.cherchi@unica.it
Andrea Loddo, e-mail: andrea.loddo@unica.it

23
Materiale didattico

Di base:
 C. Demetrescu, I. Finocchi, G. Italiano, Algoritmi e Strutture
Dati, McGraw-Hill, 2004
 T.H. Cormen, C.E. Leiserson, R.L. Rivest, Introduzione agli
algoritmi e Strutture Dati, McGraw-Hill, 2005
Per approfondimento
 F. Luccio, La struttura degli algoritmi, Bollati-Boringhieri,
Torino, 1982 Rogers, Adams
 E. Horowitz, S. Sahni, S. Anderson-Freed, Strutture Dati in C,
McGraw-Hill, Milano, 1993
 R. Sedgewick, Algoritmi in C, Addison-Wesley Masson,
Milano 1993
Verranno distribuite (sulla piattaforma di elearning
Moodle) le slides delle lezioni. 24
Qualche suggerimento…

Seguire attentamente tutte le lezioni.


Quando non si hanno le idee chiare: interrompere, fare
domande e chiedere di ripetere.
Ripassare la lezione (ogni volta!).
Svolgere le esercitazioni di laboratorio (ogni volta!).
Fare le prove di valutazione.

Sfruttare i ricevimenti e il tutoraggio per risolvere i


problemi quando si manifestano, senza accumularli.

25
Cos’è un algoritmo

Dato un problema per arrivare ad un programma che lo


risolva dobbiamo:
 individuare gli input
 definire gli output
 trovare un metodo di risoluzione
 un algoritmo
 strutture dati

 codificare l’algoritmo e strutture dati in un linguaggio comprensibile


dalla macchina (C)
Un algoritmo è un insieme di regole (non ambigue) che ci
permette di calcolare i risultati voluti a partire dai dati di
input
 una procedura che descrive una sequenza di passi ben definiti
finalizzato a risolvere un dato problema (computazionale). 26
Come analizzare un algoritmo

Correttezza
 dimostrazione formale
 ispezione informale

Utilizzo delle risorse


 tempo di esecuzione
 utilizzo della memoria

Semplicità
 comprensibilità
 manutenzione
27
Problema dell’ordinamento

Input: a0,a1,...,an-1
Output: a'0,a'1,...,a'n-1 permutazione di
a0,a1,...,an-1  tale che a'0  a'1  ...  a'n-1.

Algoritmo di ordinamento: una procedura che


prende in input a0,a1,...,an-1  e produce in output
a'0,a'1,...,a'n-1

28
Ordinamento per selezione

Una semplice soluzione


 tra quei numeri interi che non sono attualmente in
ordine trova il valore più piccolo e fallo avanzare di
una posizione nella lista.

for i0 to n-2 do


Esamina A[i] fino a A[n-1] e trova il numero intero più
piccolo A[min]
Scambia A[i] con A[min]

29
Ordinamento per selezione: codice

algoritmo selectionSort(array A)

for i  0 to n-2 do
min  i
for j  i+1 to n-1 do
if (A[j] < A[min]) then min  j
scambia A[min] con A[i]

30
Ordinamento per selezione: esempio
5 2 8 4 7 1 3 6 1 2 3 4 7 5 8 6
5 2 8 4 7 1 3 6 1 1 2 3 4 7 5 8 6 5
5 2 8 4 7 1 3 6 1 2 3 4 7 5 8 6
1 2 8 4 7 5 3 6 1 2 3 4 5 7 8 6
1 2 8 4 7 5 3 6 2 1 2 3 4 5 7 8 6 6
1 2 8 4 7 5 3 6 1 2 3 4 5 7 8 6
1 2 8 4 7 5 3 6 1 2 3 4 5 6 8 7
1 2 8 4 7 5 3 6 3 1 2 3 4 5 6 8 7 7
1 2 8 4 7 5 3 6 1 2 3 4 5 6 8 7
1 2 3 4 7 5 8 6 1 2 3 4 5 6 7 8
1 2 3 4 7 5 8 6 4
1 2 3 4 7 5 8 6
31
Analisi dell’algoritmo: correttezza

Quando il ciclo for esterno completa la sua


iterazione per i=k, abbiamo che
A[k] A[r] con k<r<n
Nelle iterazioni successive i>k,
A[0],…, A[k] rimangono invariati
Dopo l’ultima iterazione del for esterno
(i=n-1), abbiamo A[0] A[1] A[n-1]

32
Il problema della ricerca binaria

Input: a0,a1,...,an-1 numeri distinti ordinati


Output: Verificare se numric appartiene
all’insieme:
 i se numric = ai
 -1 altrimenti

33
Algoritmo di ricerca binaria

Supponiamo che primo e ultimo indichino il primo e


l’ultimo numero della lista di lunghezza n
Inizialmente primo=0 e ultimo=n-1
Sia mezzo=(primo+ultimo)/2 la posizione centrale della
lista
Confrontare numric con lista[mezzo]
 numric<lista[mezzo]
 numric=lista[mezzo]
 numric>lista[mezzo]

34
Algoritmo di ricerca binaria

Se numric<lista[mezzo]
 numric va ricercato tra le posizioni 0 e mezzo-1
Se numric=lista[mezzo]
 l’algoritmo fornisce il valore mezzo
Se numric>lista[mezzo]
 numric va ricercato tra le posizioni mezzo+1 e n-1

while (esistono altri numeri confrontare) do


mezzo  (primo+ultimo)/2
if (numric<lista[mezzo]) then ultimo  mezzo-1
else if (numric=lista[mezzo]) then return mezzo
else primo  mezzo+1
35
Algoritmo di ricerca binaria: codice

algoritmo ricercaBinariaIter(array lista, elemento numric) intero

primo  0
ultimo  lunghezza di lista - 1
while (primo ≤ ultimo) do
mezzo  (primo+ultimo)/2
if (numric < lista[mezzo]) then ultimo  mezzo - 1
else if (numric = lista[mezzo]) then return mezzo
else primo  mezzo+1
return -1

36
La ricerca binaria: esempio
numric=6
0 1 2 3 4 5 6 7 8
2 4 6 8 10 12 18 20 24

primo=0
2 4 6 8 10 12 18 20 24 ultimo=8
mezzo=4

primo=0
2 4 6 8 10 12 18 20 24 ultimo=3
mezzo=1

primo=2
2 4 6 8 10 12 18 20 24 ultimo=3
mezzo=2

Trovato! mezzo=2
37
La ricerca binaria: esempio
numric=7
0 1 2 3 4 5 6 7 8
2 4 6 8 10 12 18 20 24
primo=0
2 4 6 8 10 12 18 20 24 ultimo=8
mezzo=4
primo=0
2 4 6 8 10 12 18 20 24 ultimo=3
mezzo=1

primo=2
2 4 6 8 10 12 18 20 24 ultimo=3
mezzo=2

primo=3
2 4 6 8 10 12 18 20 24 ultimo=3
mezzo=3
primo=3>ultimo=2!!!!! 38
Riassumendo …

Introduzione al corso
Cosa è un algoritmo
Cosa sono le strutture dati
Esempi di algoritmi

La prossima volta impareremo a valutare la bontà


di un algoritmo.

39