Tipi di Dato Astratto

Transcript

Tipi di Dato Astratto
Tipi di Dato Astratto
(cenni)
Tipi di dato astratto
• Progettare un tipi di dato astratto significa:
– in astratto, definirne le proprietà e le operazioni
ammissibili
– in pratica, definirne la struttura dati e scrivere le
funzioni che realizzano le operazioni previste
Punti chiave
• L’oggetto dovrebbe essere manipolabile solo
tramite le operazioni previste per esso
• Nessuno dovrebbe poter accedere alla struttura
interna dell’oggetto in modo diretto
Programmazione - Michele Colajanni, 2006/2007
557
1
Tipi di dato astratto (cont.)
• Possibilità di creare astrazioni che corrispondono
a entità esistenti nel mondo “non informatico”
• Incapsulamento e riuso dell’astrazione
• Progettazione per assemblaggio di componenti e
astrazioni
• Separazione fra interfaccia e implementazione
• Possibilità di modificare l’implementazione senza
alterare il resto
Programmazione - Michele Colajanni, 2006/2007
558
Organizzazione tipica
• Un file header (.h) che contiene la dichiarazione
del tipo e le dichiarazioni delle operazioni
(funzioni)
• Un file sorgente (.c) che include il proprio
header (per importare la definizione di tipo)
e contiene le definizioni delle operazioni
Programmazione - Michele Colajanni, 2006/2007
559
2
Tipo di Dato Astratto
LISTA
Tipi di dato astratto (cont.)
• Come ogni tipo di dato astratto, anche la lista è
definita in termini di:
– Dominio dei suoi elementi (dominio-base):
qualsiasi
– Operazioni di costruzione sul tipo lista
– Operazioni di selezione sul tipo lista
Programmazione - Michele Colajanni, 2006/2007
561
3
Funzioni e Predicato su lista
head:
list → D
tail:
list → list
cons:
D x list → list
emptylist:
→ list
empty:
list → boolean
(selettore “testa”)
(selettore “coda”)
(costruttore)
(costante “lista vuota”)
(test di lista vuota)
Programmazione - Michele Colajanni, 2006/2007
562
Esempi
head( [ 6,7,11,21,3,6 ] )
→
6
tail( [ 6,7,11,21,3,6 ] )
→
[ 7,11,21,3,6 ]
cons( 6, [ 7,11,21,3,6 ] )
→
[ 6,7,11,21,3,6 ]
empty( [ 6,7,11,21,3,6 ] )
→
false
empty( [ ] )
→
true
Programmazione - Michele Colajanni, 2006/2007
563
4
Realizzazione dell’ADT “Lista”
• Pochissimi linguaggi forniscono il tipo lista fra
quelli predefiniti (LISP, Prolog)
• Per tutti gli altri linguaggi, l’ADT lista si costruisce
a partire da altre strutture dati
• Nel linguaggio C, si possono usare in alternativa:
– Vettori (per memoria statica)
– Puntatori e Struct (per memoria dinamica)
Programmazione - Michele Colajanni, 2006/2007
564
Realizzazione LISTE LINEARI
mediante Vettori
• Sono necessari
– un vettore per memorizzare gli elementi della
lista uno dopo l’altro (rappresentazione
sequenziale)
– una variabile primo per memorizzare l’indice
del vettore in cui è inserito il primo elemento
– una variabile lunghezza per indicare da quanti
elementi è composta la lista
Programmazione - Michele Colajanni, 2006/2007
565
5
Esempio
• Lista [‘a’, ‘b’, ‘c’, ‘a’, ‘f’]
primo
0
lunghezza
5
0
1
2
3
4
5
6
7
8
9
‘a’
‘b’
‘c’
‘a’
‘f’
• Le componenti del vettore con indice successivo a
(primo+lunghezza) non sono significative
Programmazione - Michele Colajanni, 2006/2007
566
Inconvenienti
• La dimensione (massima) della lista
rappresentata mediante vettore è fissata a priori
Ma questo non corrisponde pienamente alla
definizione di LISTA
• Le seguenti operazioni sono dispendiose:
– Inserimento di un elemento in testa o interno alla lista
– Cancellazione di un elemento in testa o interno
In entrambi i casi è necessario spostare tutti o
parte degli elementi della struttura dati
Programmazione - Michele Colajanni, 2006/2007
567
6
Esempio: eliminazione dalla testa
Tail( [‘a’, ‘b’, ‘c’, ‘a’, ‘f’] )
primo
0
lunghezza
5
0
1
2
3
4
5
6
7
8
9
‘a’
‘b’
‘c’
‘a’
‘f’
primo
0
lunghezza
4
0
1
2
3
4
5
6
7
8
9
‘b’
‘c’
‘a’
‘f’
Programmazione - Michele Colajanni, 2006/2007
568
Implementazione di LISTE LINEARI
mediante puntatori e struct
• Ciascun nodo della lista è una struttura di due
campi:
– il valore dell’elemento
– un puntatore al nodo successivo della lista
(NULL nel caso dell'ultimo elemento)
p
value next value next
‘a’
‘b’
Programmazione - Michele Colajanni, 2006/2007
value next
‘c’
value next
‘a’
value next
‘f’
NULL
569
7
Vantaggi della soluzione “dinamica”
• La dimensione (massima) della lista
rappresentata mediante struct concatenate in
memoria HEAP non è fissata a priori, ma la lista
può crescere e diminuire a seconda delle
necessità
• Le operazioni di inserimento e cancellazione,
dispendiose nel caso di implementazione
mediante vettori, sono molto più efficienti nel caso
di implementazione mediante struct concatenate
Programmazione - Michele Colajanni, 2006/2007
570
Tipo di Dato Astratto
INSIEME
8
Esempio: Tipo di dato astratto “insieme”
• Il tipo di dato astratto insieme consente di
rappresentare collezioni (senza ripetizioni) di
elementi di un tipo base D
OPERAZIONI PRIMITIVE
insert: ins x D → ins
(inserimento)
delete: ins x D → ins
(eliminazione)
empty:
→ ins
(dà l’insieme vuoto)
member: ins x D → boolean
(appartenenza)
isEmpty: ins
→ boolean
(test se vuoto)
Programmazione - Michele Colajanni, 2006/2007
572
Implementazione di insiemi
• In C gli insiemi possono essere rappresentati
usando come contenitori, per esempio dei vettori
4
Esempio: {4, 9, 2, 8, 1}
9
2
8
1
• In particolare, insiemi finiti possono
essere rappresentati anche mediante
il loro vettore caratteristico
Programmazione - Michele Colajanni, 2006/2007
0
1
2
0
3
4
5
6
0
7
8
9
0
1
1
1
0
0
1
1
573
9
File header: set_list.h
boolean setEmpty(insieme);
boolean setMember(elem, insieme);
insieme setInsert(elem, insieme);
insieme setDelete(elem, insieme);
Programmazione - Michele Colajanni, 2006/2007
574
File implementazione: set_list.c
#include "set_list.h"
boolean setEmpty(insieme S)
{ return empty(S); }
boolean setMember(elem el, insieme S)
{ return member(el,S); }
insieme setInsert(elem el, insieme S)
{ return insord(el,S); }
insieme setDelete(elem el, insieme S)
{ return delete(el,S); }
Programmazione - Michele Colajanni, 2006/2007
575
10
Operazioni derivate
Uguaglianza fra insiemi (A=B)
Ogni elemento x∈A appartiene anche a B (x∈B) e viceversa
Sottoinsieme (A⊆B)
Ogni elemento x∈A appartiene anche a B (x∈B), ma non
viceversa
Unione (A∪B)
L’insieme di tutti gli elementi x∈A e di quelli x∈B
Intersezione (A∩B)
L’insieme di tutti gli elementi x∈A appartenenti anche a B
Differenza (A−B)
L’insieme di elementi x∈A tali che x∉B
Programmazione - Michele Colajanni, 2006/2007
576
Esercizi
• Realizzare le operazioni derivate
– Unione
– Intersezione
– Differenza
– Inclusione
– Uguaglianza
Programmazione - Michele Colajanni, 2006/2007
577
11
Futuro
• Analoghe considerazioni valgono per altri tipi
di dato astratto “classici”, quali:
–
–
–
–
–
PILA (stack)
CODA
ALBERO BINARIO
GRAFO
…
• Questi ed altri tipi di dato astratto, con relative
operazioni, verranno illustrati nel corso di
ALGORITMICA 1
Programmazione - Michele Colajanni, 2006/2007
578
12