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