AA 03/04 Le sruure dai I programmi lavorano su informazioni Corso di laurea in Informaica Le informazioni sono spesso organizzae in avole Che non sono semplicemene una massa di dai numerici Ma è che coinvolgono relazioni sruurali ra i dai In genere c è mola più informazione sruurale ra i dai di quella che sia necessario rappresenare 1 2 Proprieà delle sruure dai Le sruure dai hanno proprieà saiche e dinamiche che possono essere molo diverse Le sruure dai devono essere rappresenae e implemenae nei linguaggi di programmazione Spazio di memoria per l archiviazione La rappresenazione influenza le funzionalià Creazione, manipolazione, ricerca, accesso 3 Rappresenazione della sruura dai Decidere caso per caso quana sruura rappresenare Occorre considerare non solo la sruura dai ma anche la classe d operazioni da effeuare sui dai La rappresenazione dipende ano dalle proprieà inrinseche delle sruura dai quano dalle funzionalià che si desiderano Forma e funzione 4 Tabelle d informazioni Nella forma più semplice una abella è una lisa lineare di elemeni La sua relazione sruurale più imporane consene di rispondere a domande come Chi è il della lisa? Chi è l ulimo? Chi precede e chi segue un dao elemeno? Quani elemeni ci sono nella lisa? In alri casi una abella può essere a 2 o più dimensioni Può avere una sruura gerarchica ad albero Può essere una sruura più complessa con ramificazioni a reicolo Lise lineari Un insieme di n 0 di nodi le cui proprieà sruurali coinvolgono essenzialmene solo le posizioni lineari (a 1-dimensione) relaive dei nodi Se n 0, x[1] è il nodo allora k con 1<k< n, il k-esimo nodo x[k] è preceduo dal nodo x[k-1] ed è seguio dal nodo x[k+1]; inolre x[n] è l ulimo nodo 5 6 lise, code 1
AA 03/04 Operazioni sulle lise Le operazioni che vogliamo eseguire su una lisa, includono (non esclusivamene): Accedere al k-esimo nodo Inserire un nuovo nodo in una posizione opporuna Eliminare il k-esimo nodo Unire 2 o più lise Fare una copia di una lisa Deerminare il numero di nodi in una lisa Ordinare i nodi di una lisa secondo un crierio Cercare le occorrenze di una nodo con un paricolare valore Paricolari lise Sono frequeni lise lineari in cui inserimeni, cancellazioni e accesso ai dai avvengono quasi sempre solo in prima o in ulima posizione Sack o pila. Inserimeni e cancellazioni (e spesso anche gli accessi) avvengono solo a un esremo della lisa Coda. Inserimeni avvengono a un esremo della lisa e le cancellazioni all alro Deque (coda a doppi esremi). Inserimeni e cancellazioni possono avvenire ai 2 esremi della lisa 7 8 Esempio Nomenclaura Spesso vengono usai alri nomi per indicare sack e lise in genere LIFO. Las In Firs Ou, per sack FIFO. Firs In Firs Ou, per le code In paricolare per gli sack si usano i ermini Top o cima per indicare il elemeno dello sack Un binario moro ad una sazione di esa èrappresenabile con uno sack. Il reno ad uscire è l ulimo che è enrao 9 Boom o fine per indicare l ulimo elemeno Pop per eliminare l elemeno al op Push per inserire un nuovo dao 10 Rappresenazione di una lisa Lise saiche vs dinamiche A seconda della classe di operazioni più frequeni è uile una paricolare rappresenazione Non esise una singola rappresenazione che rende le operazioni ue ugualmene efficieni L accesso random alla k-esimo nodo è diffcile se conemporaneamene inseriamo e cancelliamo nodi Disinguiamo rappresenazioni di lise in funzione delle principali operazioni da eseguire 11 Le lise saiche sono quelle che adoano una rappresenazione saica Viene allocaa un area di memoria di dimensione prefissaa quindi hanno una dimensione fissa Le lise dinamiche adoano una rappresenazione dinamica L area di memoria per archiviare i nodi viene riservaa dinamicamene in esecuzione quando serve Possono avere una dimensione non prefissaa 12 lise, code 2
AA 03/04 Implemenazione di pile public void push(objec o) Aggiunge l oggeo passao come paramero sullo sack. Se lo sack è pieno solleva una OuOfBoundsSackExcepion public Objec pop() Ripora il riferimeno dell oggeo che sa al op dello sack. Se lo sack è vuoo solleva una EmpySackExcepion public boolean empy() Ripora rue se lo sack è vuoo, false alrimeni Sack() Il cosruore che cosruisce uno sack vuoo 13 L eccezione per sack vuoo public class EmpySackExcepion exends RunTimeExcepion { Un eccezione definia come esensione di RunTimeExcepion quindi non conrollaa Viene sollevaa dal meodo pop() 14 L eccezione per sack pieno Implemenazione saica public class OuOfBoundsSackExcepion exends RunTimeExcepion { Un eccezione definia come esensione di RunTimeExcepion quindi non conrollaa Può essere sollevaa dal meodo push() Per un implemenazione saica di sack, possiamo adoare un array di oggei Lo sack viene rappresenao come un array di riferimeni a Objec L array sarà predimensionao in modo conveniene Occorre enere presene la dimensione massima dell array Porà sempre essere possibile andare in overflow 15 16 Implemenazione saica Implemenazione dinamica Ogni posizione dell array rappresena un nodo dello sack La posizione 0 viene usaa per conenere l elemeno più in basso dello sack. Un indice indica la cima dello sack Sack.java e l eccezioni EmpySackExcepion.java OuOfBoundsSackExcepion.java Si usa una lisa lineare concaenaa Olre all informazioni del nodo è necessario archiviare l indirizzo del nodo successivo Ogni nodo coniene un campo per conenere il riferimeno all oggeo con il valore che ci ineressa archiviare 17 18 lise, code 3
AA 03/04 Rappresenazione del nodo La classe che rappresena il nodo dello sack Class NodoSack { Objec dao; NodoSack pros; La definizione è ricorsiva, cioè il nodo è definio in ermini di sé sesso Rappresenazione dello sack Per definire lo sack è sufficiene dare il riferimeno alla cima dello sack La cima sarà null nel caso di sack vuoo public class Sack { privae NodoSack cima; alri meodi 19 Cosruore e meodi Il meodo push() public Sack() { cima = null; public boolean empy() { reurn cima == null; Il meodo ha come paramero il riferimeno all oggeo che deve inserire alla cima dello sack Dovrà creare un nuovo nodo Copiare il riferimeno passao come paramero nel campo dao del nuovo nodo Inserire il nuovo nodo alla cima della lisa 21 22 Il meodo pop() Classi inerne Il meodo non ha parameri. Deve eliminare il nodo alla cima dello sack Dovrà memorizzare il riferimeno conenuo nella cima Eliminare la cima Riporare all ambiene il riferimeno memorizzao La classe NodoSack viene usaa solo dalla classe Sack e quindi viene dichiaraa saic e privae È una risorsa privaa della classe Sack che avrà accesso perciò ai suoi campi Se la lisa è vuoa deve sollevare un eccezione Sack.java EmpySackExcepion 23 24 lise, code 4
AA 03/04 Le code Negli sack l elemeno che si preleva è l ulimo che si è inserio (LIFO) Nelle code gli elemeni si inseriscono ad un esremo e prelevano all alro (FIFO) Quindi si preleva nell ordine in cui si è inserio Ad esempio: una lisa d aesa Implemenazione dinamica Si può usare una lisa concaenaa Uile avere anche un riferimeno all ulimo nodo della lisa 25 26 Implemenazione in Java Operazioni sulla coda Rappresenazione del singolo nodo class NodoCoda { Objec dao; NodoCoda pros; Rappresenazione della coda public class Coda { privae NodoCoda, ulimo; privae saic NodoCoda { alri meodi 27 Inserire nodi Avviene alla fine della lisa Eliminare nodi Avviene all inizio della lisa 28 Cosruore e meodi Inserire nodi Il cosruore cosruisce una coda vuoa public Coda() { = ulimo = null; Funzione per inserire un nodo Cosruire il nuovo nodo da inserire Collegare il nuovo nodo dopo l ulimo Aggiornare il riferimeno all ulimo nodo public void aggiugi (Objec o) { Creare il nuovo nodo con il dao riferio da o NodoCoda = new NodoCoda();.dao = o;.pros = null; ulimo 29 30 lise, code 5
AA 03/04 inserire nodi Collegare dopo l ulimo nodo ulimo.pros = ; inserire nodi Aggiornare il riferimeno all ulimo nodo ulimo = ; ulimo ulimo 31 32 inserire nodi Eliminare nodi Ma se la coda era vuoa allora if ( == null) = ulimo = ; ulimo ulimo Conrollare se la coda è vuoa e nel caso sollevare l eccezione CodaVuoaExcepion if ( == null) hrow new CodaVuoaExcepion(); Eliminare il riferimeno al nodo e riporare all ambiene il riferimeno conenuo nel campo dao Objec risulao =.dao; =.pros; 33 34 eliminare nodi Se la lisa rimane vuoa dopo il prelievo, occorre ricordarsi di aggiornare ulimo if ( == null) ulimo = null; Coda.java con l eccezioni CodaVuoaExcepion.java e il driver ProvaCoda.java 35 lise, code 6