PR1 Lezione 13: STRUTTURE NON LINEARI Michele Nappi mnappi@unisa.it www.dmi.unisa.it/people/nappi Per la realizzazione della presentazione è stato utilizzato in parte materiale didattico prodotto da Oronzo Altamura, Maria Francesca, Costabile e Floriana Esposito, Università degli Studi di Bari.
Indice Astrazione e Specifiche Esempi di Specifiche Assiomatiche: Vettori e Liste Generalità su grafi e alberi. Alberi binari: specifiche sintattiche e semantiche. Realizzazioni. Visita di alberi binari. M. Nappi/PR1 2
Astrazione Dati e Funzionale L astrazione di dati ricalca ed estende il concetto di astrazione funzionale. Così come l'astrazione funzionale permette di ampliare l'insieme dei modi di operare sui dati, cioè gli operatori sui tipi di dati già disponibili, l astrazione di dati permette di ampliare i tipi di dati disponibili attraverso l'introduzione sia di nuovi tipi di dati che di nuovi operatori. L astrazione funzionale stimola gli sforzi per evidenziare operazioni ricorrenti o ben caratterizzate all interno della soluzione di un problema. L astrazione di dati sollecita ad individuare le organizzazioni dei dati più adatte alla soluzione del problema. M. Nappi/PR1 3
Astrazione Dati e Funzionale Un'astrazione di dati consente una estensione dell algebra dei dati disponibile in un linguaggio di programmazione. Cosa e un algebra? È un sistema matematico costituito da un dominio, cioè un insieme di valori e da un insieme di funzioni applicabili su tali valori. Un algebra dei dati può essere definita come costituita da: Una famiglia di insiemi (insieme di dati) Una famiglia di operatori sui dati (operatori) Un repertorio di simboli (o nomi) per indicare l insieme di dati Un repertorio di simboli (o nomi) per indicare gli operatori Un repertorio di simboli (detti costanti) per indicare elementi singoli degli insiemi di dati M. Nappi/PR1 4
Astrazione Dati e Funzionale Un astrazione di dati è costituita da una specifica e da una realizzazione: La Specifica ha il compito di descrivere sinteticamente il tipo dei dati e gli operatori che li caratterizzano La Realizzazione stabilisce come i dati e gli operatori vengono ricondotti ai tipi di dati e agli operatori già disponibili M. Nappi/PR1 5
Le Specifiche Assiomatiche Specifica Sintattica determina: l ELENCO dei nomi dei domini e delle operazioni i DOMINI di partenza e di arrivo per ogni nome di operatore M. Nappi/PR1 6
Le Specifiche Assiomatiche Specifica Semantica assegna: un INSIEME ad ogni nome di tipo introdotto nella Specifica Sintattica una FUNZIONE ad ogni nome di operatore, esplicitando le seguenti condizioni sui domini precondizione, che definisce quando l operatore è applicabile postcondizione, che stabilisce la relazione tra argomenti e risultato M. Nappi/PR1 7
Il tipo astratto Vettore: Una Specifica Assiomatica M. Nappi/PR1 8
Il tipo astratto Lista Una lista è una sequenza di elementi di un certo tipo, in cui è possibile aggiungere o togliere elementi. Per far questo occorre specificare la posizione relativa all interno della sequenza nella quale il nuovo elemento va aggiunto o nella quale il vecchio elemento va tolto. A differenza del array, che è una struttura a dimensione fissa dove è possibile accedere direttamente ad ogni elemento specificandone l indice, la lista è a dimensione variabile e si può accedere direttamente solo al primo elemento della lista. Per accedere ad un generico elemento, occorre scandire sequenzialmente gli elementi della lista. M. Nappi/PR1 9
Il tipo astratto Lista: Una Specifica Assiomatica Specifica sintattica Tipi: lista, tipoelem, booleano Operatori: CREALISTA: ( ) lista LISTAVUOTA: (lista) booleano INSERISCI: (tipoelem, lista) lista CANCELLA: (lista) lista PRIMOLISTA: (lista) tipoel M. Nappi/PR1 10
Il tipo astratto Lista: Una Specifica Assiomatica Specifica semantica Tipi: lista = insieme delle sequenze L=a1,a2,,an di tipo tipoelem booleano = insieme dei valori di verità {vero,falso} M. Nappi/PR1 11
Il tipo astratto Lista: Una specifica assiomatica Specifica semantica Operatori: CREALISTA()=L Post: L = ^, la sequenza vuota LISTAVUOTA(L)=b Post: b=vero, se L=^; b=falso, altrimenti INSERISCI(el,L)=L Pre: L = a1, a2,, an n>=0 Post: L = el, a1, a2,, an M. Nappi/PR1 12
Il tipo astratto Lista: Una specifica assiomatica Specifica semantica Operatori: CANCELLA(L)= L Pre: L = a1, a2,, an n>0 Post: L = a2,, an PRIMOLISTA(L)= el Pre: L = a1, a2,, an n>0 Post: el = a1 M. Nappi/PR1 13
Il tipo astratto Lista: Realizzazione // prototipi lista crealista(void); typedef struct nodo *lista; typedef struct nodo { tipoelem val; lista next; } nodo; int listavuota(lista L); lista cancella (lista L); lista inserisci(tipoelem val, lista L); tipoelem primolista (lista L); M. Nappi/PR1 14
I Grafi Una relazione tra due insiemi U e V è un sottoinsieme A di UxV La descrizione di A in forma diagrammatica si ottiene congiungendo elementi di U con elementi di V. La rappresentazione che si ottiene e detta grafo (bipartito). M. Nappi/PR1 15
I Grafi U V A UxU. In tal caso gli elementi di u vengono scritti una sola volta e viene segnata una freccia sulla congiunzione da ui a uj per quelle coppie <ui,uj > A. Si parla in questo caso di grafo orientato. Gli elementi u U sono detti nodi o vertici del grafo orientato. La linea di congiunzione è detta arco. Se <ui,uj > sono congiunti tanto attraverso l arco (i,j) quanto attraverso l arco (j,i) si potrà utilizzare una unica connessione senza freccia: l arco incide sui due nodi e si parla di grafo non orientato. M. Nappi/PR1 16
I Grafi Un grafo orientato G è una coppia <N,A> dove N è un insieme finito non vuoto (insieme di nodi) e A NxN è un insieme finito di coppie ordinate di nodi, detti archi (o spigoli o linee). Se < ui, uj > A nel grafo vi è un arco da ui ad uj Nell esempio N= {u1,u2,u3}, A= {(u1,u1),(u1,u2),(u2,u1),(u1,u3)}. M. Nappi/PR1 17
I Grafi In un grafo orientato G un cammino è una sequenza di nodi u0, u1,.., uk tali che (ui, ui+1) A, per i = 0, 1, 2,, k-1. Il cammino parte dal nodo u0, attraversa i nodi u1,, uk-1, arriva al nodo uk, ed ha lunghezza uguale a k. Se non ci sono nodi ripetuti il cammino è semplice (ui u j per 0 j k ) Se u0=uk il cammino è chiuso. Un cammino sia semplice che chiuso è un ciclo. Un grafo è detto completo se per ogni coppia di nodi ui, uj N esiste un arco che va da ui ad uj (A = NxN) M. Nappi/PR1 18
I Grafi M. Nappi/PR1 19
Gli Alberi Il GRAFO è una struttura dati alla quale si possono ricondurre strutture più semplici: LISTE ed ALBERI L ALBERO è una struttura informativa per rappresentare: partizioni successive di un insieme in sottoinsiemi disgiunti organizzazioni gerarchiche di dati procedimenti decisionali enumerativi M. Nappi/PR1 20
Gli Alberi M. Nappi/PR1 21
Gli Alberi M. Nappi/PR1 22
Gli Alberi M. Nappi/PR1 23
Gli Alberi Proprietà Un albero e un grafo aciclico, in cui per ogni nodo esiste un solo arco entrante (tranne che per la radice che non ne ha nessuno) Un albero è un grafo debolmente connesso Se esiste un cammino che va da un nodo u ad un altro nodo v, tale cammino è unico In un albero esiste un solo cammino che va dalla Radice a qualunque altro nodo Tutti i nodi di un albero t (tranne la radice) possono essere ripartiti in insiemi disgiunti ciascuno dei quali individua un albero: dato un nodo u, i suoi discendenti costituiscono un albero detto sottoalbero di radice u M. Nappi/PR1 24
Gli Alberi La natura ricorsiva degli alberi Un albero può essere definito ricorsivamente Un albero e un insieme di nodi ai quali sono associate delle informazioni Tra i nodi esiste un nodo particolare che e la radice (livello 0) Gli altri nodi sono partizionati in sottoinsiemi che sono a loro volta alberi (livelli successivi): Vuoto o costituito da un solo nodo (detto radice) Oppure è una radice cui sono connessi altri alberi M. Nappi/PR1 25
Gli Alberi Alberi Binari Sono particolari alberi ordinati in cui ogni nodo ha al più due figli e si fa sempre distinzione tra il figlio sinistro, che viene prima nell ordinamento e il figlio destro. Nell esempio gli alberi sono etichettati con interi e con caratteri Un albero binario è un grafo orientato che o è vuoto o è costituito da un solo nodo o è formato da un nodo n (detto radice) e da due sottoalberi binari, chiamati rispettivamente sottoalbero (o figlio) sinistro e sottoalbero (o figlio) destro M. Nappi/PR1 26
Gli Alberi M. Nappi/PR1 27
Gli Alberi M. Nappi/PR1 28
Gli Alberi M. Nappi/PR1 29
Gli Alberi M. Nappi/PR1 30
Gli Alberi L algebra che abbiamo presentato ovviamente rappresenta una scelta precisa di progetto: enfatizzare la natura ricorsiva degli Alberi e di costruire l albero binario dal basso verso l alto, cioè dal livello delle foglie verso la radice. Non sempre questa scelta è opportuna: soprattutto se l albero è usato per rappresentare un processo decisionale è preferibile un algebra che preveda di costruire l albero dall alto verso il basso, inserendo prima la radice e poi i nodi figli via via. In tal caso, mentre rimangono validi gli operatori creabinalbero, binalberovuoto, binradice, binpadre, figliosinistro, figliodestro, sinistrovuoto, destrovuoto, cancsottobinalbero Andrebbe sostituito l operatore di costruzione con tre operatori nuovi, uno dedicato all inserimento della radice e gli altri due dedicati all inserimento del figlio sinistro e del figliodestro. M. Nappi/PR1 31
Gli Alberi M. Nappi/PR1 32
Algoritmi di Visita La visita di un albero consiste nel seguire una rotta di viaggio che consenta di esaminare ogni nodo dell albero esattamente una volta. Visita in pre-ordine: si applica ad un albero non vuoto e richiede dapprima l analisi della radice dell albero e, poi, la visita, effettuata con lo stesso metodo, dei due sottoalberi, prima il sinistro, poi il destro Visita in post-ordine: si applica ad un albero non vuoto e richiede dapprima la visita, effettuata con lo stesso metodo, dei sottoalberi, prima il sinistro e poi il destro, e, in seguito, l analisi della radice dell albero Visita simmetrica: richiede prima la visita del sottoalbero sinistro (effettuata sempre con lo stesso metodo), poi l analisi della radice, e poi la visita del sottoalbero destro M. Nappi/PR1 33
Algoritmi di Visita M. Nappi/PR1 34
Algoritmi di Visita visita in preordine l albero binario t { se l albero non è vuoto allora visita la radice di t visita in preordine il sottoalbero sinistro di t visita in preordine il sottoalbero destro di t fine } M. Nappi/PR1 35