Interfacce per il riutilizzo del codice

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Interfacce per il riutilizzo del codice"

Transcript

1 Interfacce per il riutilizzo del Nelle SoluzioniLab3 c è una classe di nome Operasunumeri con la quale si esegue il calcolo della somma, del massimo e del numero di dati inseriti. public class Operasunumeri{ private double s; private double max; private int cont; /* costruttore: inizializza la somma a zero, il massimo con l'estremo inferiore, il contatore dei numeri a zero */ public Operasunumeri(){ s = 0; max = - Double.MAX_VALUE; cont = 0; //fine costruttore /* metodo aggiungi : aggiunge un valore alla volta aggiornando il valore della somma, del massimo e del contatore dei valori inseriti */ public void aggiungi(double x){ s = s + x; if(max < x) max = x; cont++; //fine aggiungi /* metodo somma : restituisce la somma dei valori inseriti */ public double somma(){ return s; /* metodo massimo : restituisce il massimo dei valori inseriti */ public double massimo(){ return max; /**metodo quanti : restituisce il numero di valori inseriti */ public int quanti(){ return cont; //fine classe Operasunumeri Consideriamo la classe BankAccount e supponiamo di avere un certo numero di conti bancari (una banca) e di voler calcolare quanti soldi ci sono in totale nella banca (somma). 1

2 Supponiamo anche di voler sapere quanti sono i conti gestiti dalla banca (contatore) e quale è il conto bancario che ha il saldo maggiore (massimo). Avendo a disposizione la classe Operasunumeri, possiamo riscriverla adattandola agli oggetti di tipo BankAccount. Dovremo fare qualche modifica. public class OperasuBankAccount{ private double s; private BankAccount max; private int cont; //usiamo il costruttore di default: //numeri = 0, riferimenti = null /* Il massimo che cerchiamo è il conto corrente che possiede il saldo maggiore */ public void aggiungi (BankAccount x){ s = s + x.getbalance(); if(cont==0 max.getbalance()< x.getbalance()) max = x; //quando cont = 0 si inizializza max //con il primo conto cont++; public BankAccount massimo(){ return max;... // altri metodi: quanti, somma... //fine OperasuBankAccount In maniera analoga potremo dover risolvere un altro problema in cui si vuole trovare quale oggetto, in un elenco di oggetti, ha il valore massimo in uno dei suoi dati. Esempio. Dati dei numeri complessi trovare quello il cui modulo è maggiore; dato un borsellino contenente delle monete vogliamo sapere quale è la somma totale e quale è la moneta con il valore più elevato. Dovremo scrivere una classe OperasuMonete? Vediamo di risolvere il problema in altro modo. Dato un insieme di oggetti possiamo stabilire cosa si intende per misura di quell oggetto; vogliamo poi risolvere il problema di trovare l oggetto che ha la misura più grande. Esempio. Dato un insieme di Pile vogliamo trovare la Pila che contiene più elementi. Abbiamo bisogno di definire una proprietà astratta: essere misurabile. 2

3 Abbiamo visto che in Java per definire una proprietà astratta si usa una interfaccia nella quale si dichiarano le firme dei metodi che rappresentano la proprietà. Le classi che realizzano l interfaccia dovranno costruire il per tutti i metodi dell interfaccia. Definiamo pertanto l interfaccia Misurabile per definire la proprietà di: avere una misura public interface Misurabile{ //metodo che rappresenta una misura double estraimisura(); //Object altridati(); Possiamo aggiungere un metodo altridati per poter rappresentare altre informazioni sugli oggetti misurabili: ad esempio il nome del correntista il cui conto bancario è il massimo. Vogliamo non aver più bisogno di scrivere la classe OperasuBankAccount e classi analoghe per risolvere problemi analoghi. Per prima cosa dovremo dichiarare che BankAccount realizza l interfaccia Misurabile e stabilire cosa intendiamo per misura di un conto bancario. Stabiliamo che la misura in BA è il valore del suo saldo. public class BankAccount implements Misurabile{... public double estraimisura(){ return balance; public Object altridati(){ return nome; //fine BankAccount Però dobbiamo ancora fare della modifiche sulla classe che esegue la somma e trova il massimo, in modo da poterla riutilizzare nella soluzione di problemi analoghi. La classe OperasuBankAccount eseguiva le operazioni per il calcolo della somma, del numero di elementi inseriti e trovava l elemento max: il conto bancario con il saldo maggiore. Un altra classe avrebbe trovato come max la moneta con il valore più grande, oppure la Pila con il maggior numero di elementi. Pensiamo allora di costruire una classe per gestire questi oggetti misurabili. Costruiamo una classe OperasuOggetti per oggetti le cui classi realizzano l interfaccia Misurabile: 3

4 public class OperasuOggetti{ private double s; private Misurabile max; private int cont;...//costruttore public void aggiungi(misurabile x){ s = s + x.estraimisura(); if(cont==0 max.estraimisura()< x.estraimisura()) max = x; cont++; //fine aggiungi public Misurabile massimo(){ return max;...//metodi quanti, somma //fine OperasuOggetti Questa classe potrà essere utilizzata dagli oggetti la cui classe che realizza Misurabile. Questo è un esempio di polimorfismo. Il metodo estraimisura è polimorfo. Con l invocazione del metodo x.estraimisura() otteniamo diversi comportamenti. La classe BankAccount realizza estraimisura restituendo il saldo; un altra classe realizerà estraimisura restituendo un valore double con il significato di misura in quella classe. In realtà x non ha un suo tipo di dato: x è di tipo interfaccia. Sarà l interprete Java che, durante l esecuzione, vede quale riferimento è memorizzato in x ed attiva il metodo della classe corrispondente. Con l interfaccia Misurabile abbiamo trasferito agli oggetti una caratteristica dei numeri: avere un valore; con i numeri possiamo eseguire somme, trovare un massimo, rappresentare una misura. Possiamo anche ordinare oggetti? Prima di tutto ci dobbiamo chiedere se ha senso confrontare oggetti. Lo abbiamo appena fatto cercando il massimo, quindi i confronti possono avere significato. Esempio. Vogliamo mettere in ordine i conti bancari in modo che seguano un ordine dal saldo minimo al saldo massimo (crescente). Volgiamo mettere in fila dei numeri complessi in modo che siano secondo l ordine crescente del loro modulo (reale). Cosa significa per oggetti il dire: l oggetto1 è minore (maggiore o uguale) dell oggetto2? Abbiamo già visto con le stringhe che non possiamo confrontare i riferimenti. Dobbiamo pensare ad una proprietà: essere confrontabile. Esempio. Per la classe Complex può essere il modulo: è un valore reale, esiste un ordine. 4

5 Nella classe BankAccount potrebbe essere il saldo, un numero reale, e pensare un ordine dal più povero al più ricco; oppure potrebbe essere il numero di conto, numero intero: dal cliente che per primo ha aperto un conto all ultimo che lo ha attivato. Per la classe Studente potrebbe essere la matricola, numero intero, oppure il nome, è una stringa e sappiamo che le stringhe hanno un ordine. Nel pacchetto java.lang c è un interfaccia che rappresenta la proprietà astratta essere confrontabile : l interfaccia Comparable (Par. 13.8). public interface Comparable{ int compareto(object other); Il metodo compareto restituisce un valore intero; la classe String realizza Comparable: s1.compareto(s2) con s1, s2 di tipo String. Interfaccia Comparable Siano a e b due oggetti di una classe che realizza Comparable, si ha: < 0 a precede b a.compareto(b) = 0 a è uguale a b > 0 a segue b Cosa significano i termini precede, segue, uguale, dipende dalle scelte che facciamo. Esempio. Consideriamo la classe Studente i campi nome e matricola; stabiliamo un confronto in base alla matricola. Interfaccia Comparable public int compareto(object altrostud) {Studente altro = (Studente)altrostud; int valore; if(this.matricola < altro.matricola) valore = -1; else if(matricola > altro.matricola) valore = 1; else valore = 0; return valore; Interfaccia Comparable Abbiamo dovuto fare il cast Studente altro = (Studente)altrostud; perché altrostud non possiede il campo matricola, dato che è Object. Possiamo fare altro.matricola perché siamo nella classe Studente. Vediamo la classe BankAccount che implementa due interfacce. Interfaccia Comparable public class BankAccount implements Misurabile, Comparable{... //estraimisura, altridati public int compareto(object other){ BankAccount ab = (BankAccount)other; if(this.balance < ab.balance) return -1; if(this.balance > ab.balance) return 1; return 0; //non strutturato, ma possibile 5

6 Interfaccia Comparable Possiamo anche confrontare stringhe, ad esempio ordinare gli studenti per nome (purché diversi): public int compareto(object altrostud) { Studente altro = (Studente)altrostud; return nome.compareto(altro.nome); dove nome è this.nome e compareto è quello delle stringhe. Interfaccia Comparable Ora che sappiamo cosa significa confrontare oggetti, possiamo metterli in ordine: public static void ordlineare ( BankAccount a[]){ BankAccount sc; //ciclo su i //ciclo su k if(a[i].compareto(a[k]) > 0) //scambio Interfaccia Comparable Se dobbiamo ordinare elementi di tipo Complex o Studente dobbiamo riscrivere l ordinamento. Possiamo fare meglio? All ordinamento basta avere degli oggetti che siano confrontabili, la cui classe realizzi Comparable. In maniera analoga a quanto fatto con Misurabile, andiamo a definire una variabile di tipo Comparable e scriviamo un ordinamento per oggetti qualunque. Interfaccia Comparable public static void ordlineare( Comparable a[]){ //ordinamento per oggetti confrontabili Comparable sc; for(int i=0; i<a.length-1; i++) for(int k=i+1; k<a.length; k++) if(a[i].compareto(a[k])> 0){ sc = a[i]; a[i] = a[k]; a[k] = sc; //fine if Sovrascrivere il metodo equals Sovrascrivere il metodo equals Consideriamo un array di numeri, ci interessa sapere se ci sono oppure no degli elementi ripetuti nella sequenza; esempio a = (1, 3, 2, 7, 3, 4) il 3 è ripetuto a = (1, 2, 4, 7, -5, 0) sono tutti diversi avremo un algoritmo del tipo: algoritmo boolean distinti (array a) def. variabili diverso logico i, k intero 6

7 Sovrascrivere il metodo equals diverso vero i 0 mentre i < a.length -1 e diverso eseguire per k = i+1 fino a a.length-1 eseguire se a[i] == a[k] allora diverso falso //fineif //fineper i i+1 //finementre restituire diverso // fine algoritmo Sovrascrivere il metodo equals Possiamo fare una cosa simile con gli oggetti? La superclasse Object possiede un metodo per verificare se due oggetti sono uguali: public boolean equals(object ob){ return (this == ob); Il confronto this==ob restituisce vero o falso. Il confronto precedente è fatto tra riferimenti, quindi per gestire oggetti uguali andiamo a sovrascrivere il metodo equals: lo abbiamo visto con la classe String. Sovrascrivere il metodo equals public class BankAccount{... //saldo, numeroconto, nome public boolean equals(object ob){ BankAccount ab = (BankAccount)ob; if(this.balance == ob.balance) return true; else return false; //fine equals //fine BA Sovrascrivere il metodo equals In BA potevamo scegliere di usare compareto invece di equals: a.compareto(b) == 0 corrisponde a a.equals(b) vero non per tutti gli oggetti può aver senso cercare l ordine, mentre l uguaglianza è una caratteristica degli oggetti. Esercizio. Costruire un metodo per verificare se in un array di oggetti ci sono elementi ripetuti. Lista concatenata Struttura di dati lista concatenata Consideriamo una nuova modalità di memorizzare i dati in cui l accesso non avviene più tramite un indice, che individua la posizione del dato nella struttura, ma tramite un indirizzo di memoria. Per poter costruire una sequenza di informazioni è necessario che ogni dato della struttura memorizzi l indirizzo di memoria dell elemento successivo. Si costruisce pertanto una struttura di dati collegata, chiamata lista concatenata o catena. 7

8 Lista concatenata Ogni nodo (anello) di una lista concatenata oltre all informazione memorizza il riferimento dell elemento successivo: avremo bisogno di un nodo con le caratteristiche del record per poter rappresentare due (o più) campi di tipo diverso: dato: info riferimento: next Lista concatenata Il nodo sarà composto da : l informazione: un elemento di tipo base o un oggetto, tutto ciò che possiamo memorizzare in un array; il riferimento sarà un riferimento ad un nodo: un riferimento ad un elemento dello stesso tipo del nodo. Si intuisce che le definizione del nodo sarà un po particolare: dobbiamo definire il tipo del nodo, ma al suo interno dobbiamo usare quel tipo (il nodo ha un campo riferimento). Lista concatenata Le informazioni memorizzate non sono più necessariamente contigue in memoria, come nell array. Lista concatenata Supponiamo di voler costruire una struttura di dati lista concatenata per rappresentare una sequenza di interi. Sintassi per definire il nodo: class ElemIntero{ int info; //dato ElemIntero next; //riferimento Lista concatenata Come possiamo gestire l accesso per la classe ElemIntero? 1) classe public, elementi private: si devono costruire i metodi per accesso e modifica dei campi; 2) controllo di pacchetto (nessuna specifica) sia per la classe che per i campi: l accesso ai campi è tramite il nome; 3) classe interna privata e nessuna specifica sui campi; adottiamo questa scelta. Lista concatenata public class TDAListaConc{... //metodi per gestire il TDA... private class ElemIntero{ int info; ElemIntero next; //fine classe ElemIntero 8

9 Lista concatenata Quale vantaggio e quale sicurezza comporta questa scelta? Essendo privata la classe non è visibile dall esterno: quindi si rispettano per i suoi campi le direttive dell incapsulamento. Essendo interna e non specificando l accesso i suoi campi sono visibili internamente alla classe che realizza il TDA e si possono utilizzare senza dover scrivere, in ElemIntero, i metodi di accesso e di modifica. Confronto tra array e lista concatenata Confronto tra array e lista concatenata Prima di vedere i metodi per costruire una Pila con una lista concatenata, mettiamo a confronto le due strutture di dati: accesso elemento successivo inserimento e cancellazione dimensione spazio di memoria Accesso: lista concatenata L accesso è sequenziale: per accedere ad un dato si deve scorrere la lista facendo una scansione lineare. Di fatto si esegue una ricerca nella struttura esaminando i nodi fino a trovare il valore cercato. Non si può ritornare indietro: si può solo vedere in avanti. Sia a di tipo ElemIntero, cerchiamo se a.info è uguale ad un valore x, iniziando dal primo elemento della struttura fino all ultimo elemento della struttura. Accesso: lista concatenata L accesso è: a.info Accesso: array L accesso è diretto: per accedere ad un dato si utilizza l indice dell array inizio La struttura è accessibile da un riferimento inizio che vede il primo nodo. Si può anche gestire la struttura con un primo elemento privo di informazione: nodo vuoto. x x Se v è il nome dell array, v[i] rappresenta l accesso all i-esimo elemento: nel nostro esempio x coincide con v[3]. Con l accesso diretto non c è un ordine da rispettare: v[3], v[0], v[5], : si può tornare indietro. 9

10 Successivo: lista concatenata Ogni nodo, tranne l ultimo, contiene nel campo next la referenza (indirizzo di memoria) al nodo successivo. Se a è di tipo ElemIntero e a vede un nodo della lista, per passare al nodo successivo si memorizza in a il riferimento al nodo successivo: a = a.next; //riferimento a.next Successivo: array Dato un elemento nella posizione i, v[i], il successivo (se i v.length-1) si trova nella posizione i+1; per passare al successivo si fa i+1, quindi v[++i] oppure i = i+1; uso v[i] a Inserimento e cancellazione: lista concatenata Per inserire un nuovo nodo bisogna: 1) costruire il nuovo nodo 2) agganciarlo nella posizione voluta con assegnazioni sui riferimenti 1) costruzione del nuovo nodo: ElemIntero nuovo = new ElemIntero(); nuovo.info = x; 2) per poterlo agganciare bisogna sapere dove. Inserimento e cancellazione: lista concatenata Bisogna trovare una posizione nella lista, dopo la quale effettuare l inserimento del nuovo nodo: questa posizione si ottiene facendo la scansione lineare alla ricerca di un valore z (un campo info) che dovrà essere presente nella lista. z x Inserimento e cancellazione: lista concatenata Per cancellare un nodo bisogna assegnare ad un riferimento next il valore del riferimento successivo: a.next = a.next.next; Inserimento e cancellazione: array Per inserire un nuovo dato nella i-esima posizione si deve: 1) aumentare la lunghezza dell array, se l array è pieno: costruire un nuovo array w 2) copiare i valori fino alla posizione i nel nuovo array, inserire il nuovo elemento, copiare i rimanenti valori 2 bis) se non serve la posizione intermedia, si può aggiungere alla fine. 10

11 Inserimento e cancellazione: array Per cancellare un dato dalla i-esima posizione si deve: 1) ricopiare gli elementi a partire dalla posizione i+1 sul precedente 1 bis) se l elemento da togliere è unico e non interessa l ordine, si può copiare l ultimo sull i-esimo posto. Dimensione: lista concatenata La dimensione non è fissata: non c è un limite sulla dimensione massima, l unico limite è lo spazio di memoria: non bisogna mai ridimensionare una lista concatenata. Si può gestire male la memoria e occuparla tutta: se viene esaurita la memoria disponibile la JVM interrompe l esecuzione segnalando: OutOfMemoryError Dimensione: array L array è a dimensione fissa. Possiamo risolvere il problema con la tecnica del raddoppio e riassegnando il riferimento della nuova area di memoria. Anche in questo caso il limite è lo spazio di memoria complessivo. Spazio di memoria: lista concatenata La lista concatenata occupa più spazio: ogni nodo è composto da due campi: l informazione il riferimento Se anche l informazione è un oggetto, il nodo è composto da due riferimenti, uno dei quali vede l elemento successivo e l altro l oggetto. Spazio di memoria: array L array occupa meno spazio: c è solo l informazione che deve essere memorizzata Conclusione. L array richiede spostamento di dati (O(n)) nel caso di inserimento e cancellazione, che per la lista sono O(1); possiede invece accesso diretto, che è O(1), mentre la lista accesso sequenziale, che è O(n). Pertanto il tipo di problema suggerirà quale struttura di dati sia più idonea: molti accessi e poche modifiche oppure pochi accessi e molte modifiche. Lista concatenata Se la lista concatenata non ha una dimensione massima dobbiamo però individuarne la fine: un valore di riferimento dal quale non si acceda ad alcun nodo. Tale valore è null. inizio 11

12 Pila su lista concatenata Vogliamo ora realizzare il TDA Pila di interi su una lista concatenata: dovremo realizzare gli assiomi: verifica se la Pila è vuota guarda la testa inserisci in testa estrai la testa Pila su lista concatenata Dobbiamo avere un riferimento al primo nodo per poter accedere alla struttura di dati: ElemIntero primo; Dobbiamo rappresentare la situazione: Pila vuota. Se la Pila è vuota, non c è alcun elemento nella Pila, quindi primo non contiene nulla : primo = null; Pila su lista concatenata Dobbiamo inserire in testa: 1) costruiamo un elemento: ElemIntero nuovo = new ElemIntero(); nuovo.info = valore; 2) agganciamo nuovo in testa: nuovo deve diventare la nuova testa: nuovo.next = primo; //aggancio alla Pila primo = nuovo; //nuovo diventa la testa Pila su lista concatenata Queste assegnazioni valgono anche quando si inserisce il primo elemento, partendo da lista vuota: nuovo.next = primo; //aggancio alla Pila primo = nuovo; //nuovo diventa la testa Quando la lista è vuota, primo = null; quindi la prima assegnazione memorizza null nel campo nuovo.next: il nuovo elemento è l ultimo. La seconda assegnazione lo fa diventare il primo elemento della lista. Pila su lista concatenata Dobbiamo estrarre la testa: se la Pila non è vuota: primo = primo.next; se la Pila è vuota: lanciamo l eccezione EmptyStackException Se nella Pila c è un solo elemento, con l istruzione precedente si vuota la Pila: infatti, primo.next=null (uno solo è l ultimo), pertanto primo diventa null e quindi la Pila è vuota. Pila su lista concatenata Dobbiamo guardare la testa: se la Pila non è vuota: primo.info; se la Pila è vuota: lanciamo l eccezione EmptyStackException Vediamo pertanto la classe che realizza una Pila di interi su una lista concatenata. 12

13 Pila su lista concatenata public class PilaListaConc { // Pila di interi realizzata con // lista concatenata private ElemIntero primo = null; public boolean vuota() {// isempty() if(primo == null) return true; else return false; Pila su lista concatenata public void inserisci (int elem) { // push ElemIntero nuovo = new ElemIntero(); nuovo.next= primo; nuovo.info=elem; primo = nuovo; Pila su lista concatenata public void estrai() {// pop if (!vuota() ) primo = primo.next; else throw new EmptyStackException(); public int testa () {// top if (!vuota() ) return primo.info; else throw new EmptyStackException(); Pila su lista concatenata /** Classe interna: la classe e' privata ma le sue variabili d'istanza sono visibili ai metodi della classe PilaListaConc */ private class ElemIntero { int info; ElemIntero next; //fine PilaListaConc Prestazioni della Pila sulle due strutture di dati lista concatenata array 1) isempty: if( ) O(1) O(1) 2) pop: primo=primo.next O(1) O(1) sp 3) top: restituisce un valore O(1) O(1) 4) push: nuovo +2 assegnazioni raddoppio se l array è pieno O(1) O(1) in media Strutture di dati per numeri e oggetti 13

14 Strutture di dati per numeri e oggetti Come abbiamo portato agli oggetti le proprietà dei numeri (Misurabile, Comparable) così utilizziamo le strutture di dati per memorizzare sia numeri che oggetti: array di numeri e array di oggetti, lista concatenata di numeri e lista concatenata di oggetti. In realtà dovremmo dire: array e lista concatenata di riferimenti a oggetti. Infatti la struttura di dati gestisce i riferimenti per le operazioni di inserimento, cancellazione, ecc. Array numeri oggetti Numeri e oggetti campi Lista concatenata numeri oggetti Numeri e oggetti Strutture di dati per numeri e oggetti Quando vogliamo capire come funziona una struttura di dati o cosa fa un TDA, ci basta trattare numeri. Per utilizzare gli oggetti aggiungeremo al TDA e alla struttura di dati le caratteristiche dell oggetto. Esempio. Abbiamo visto un array per memorizzare informazioni di tipo Stud, che riguardavano gli studenti. Per accedere al campo matricola dell i-esimo studente corso23[i].matricola(). Strutture di dati per numeri e oggetti Se vogliamo costruire una lista concatenata per informazioni di tipo Stud dovremo definire il nodo: class ElemStud{ Stud info; ElemStud next; e per accedere al campo matricola da un riferimento a che vede il nodo: a.info.matricola() 14

15 Una Coda è un TDA ad accesso limitato. Si può accedere al primo elemento della Coda, detto testa e all ultimo elemento detto coda. Le sue funzioni sono: verifica se la coda è vuota: isempty guarda la testa: front inserisci in coda: enqueue estrai la testa: dequeue In una Coda gli oggetti possono essere inseriti ed estratti secondo un comportamento definito FIFO: First In First Out il primo inserito è il primo a uscire Il nome ricorda una fila in attesa : viene estratto l elemento che si trova in coda da più tempo, testa. Gli assiomi assomigliano a quelli della Pila: verifica se la Coda è vuota: isempty guarda la testa: top, front estrai un elemento (la testa): pop, dequeue inserisci un elemento: push (testa), enqueue (coda) Solo l inserimento è diverso: nella Pila si inserisce in testa, nella Coda alla fine. La Coda si può realizzare su array riempito solo in parte oppure su lista concatenata. Realizziamo la Coda su array. Nella Pila si estraeva e si inseriva da un unica parte: l estremo destro dell array sp-- sp++ Nella Coda decidiamo di: inserire a destra e di estrarre a sinistra. Costruiamo l array: int v[] = new int[6]; int qp; //queue pointer: prima posizione libera qp = 0; //Coda vuota; Per accedere alla testa: restituire v[0] Per inserire un elemento in coda: v[qp] = valore; qp++; Se la Coda è piena si effettua il raddoppio. Per togliere la testa ed avere la nuova testa nella prima posizione (qp=0) si devono ricopiare all indietro gli elementi: qp--; for(int i = 0; i<qp; i++) v[i] = v[i+1]; 15

16 Questa realizzazione, efficiente per la Pila, è poco efficiente per la Coda. Nella Pila tutte le operazioni sono O(1), tranne inserisci che è O(1) in media. Nella Coda le operazioni sono O(1), tranne inserisci che è O(1) in media (raddoppio) e togli che è O(n): infatti per mantenere la struttura compatta, si devono sempre spostare tutti gli elementi. Per realizzare una Coda più efficiente usiamo due indici. Un indice vede il primo elemento, l altro indice vede l ultimo. L ultimo rappresenta la prima posizione libera in cui inserire un nuovo elemento (inserimento in coda); il primo è la testa. L array è riempito nella parte centrale. primo ultimo Abbiamo quindi: int primo, ultimo; primo = 0; //testa ultimo = 0; //prima posizione libera Coda vuota: primo == ultimo la prima posizione libera è la testa della coda accedere alla testa (se non è vuota): restituire v[primo] togliere la testa (se non è vuota): primo ++; inserire un elemento, in coda: v[ultimo] = valore; ultimo++; e se l array è pieno si raddoppia In tale modo tutte le operazioni sono O(1) tranne inserisci che è O(1) in media: la realizzazione con due indici è più efficiente. Rimane un problema. Supponiamo che l array abbia 10 componenti (i=0,1, 2,..., 9), si inizia con coda vuota: primo=0 e ultimo=0. Eseguiamo 10 operazioni di inserimento: ultimo=10, che rappresenta Coda piena e per un prossimo inserimento si dovrà eseguire il raddoppio. Eseguiamo 10 operazioni di estrazione: primo=ultimo, che rappresenta Coda vuota. Ora vogliamo inserire un nuovo dato: poiché ultimo = 10 si effettua il raddoppio, anche se la Coda è vuota: in tale modo lo spazio va perduto e se continuiamo in questo modo, occupiamo spazio per rappresentare Code vuote. Si risolve il problema con la tecnica dell array circolare: se c è posto prima non si effettua il raddoppio. 16

17 Quando ultimo==v.length invece del raddoppio ritorna al valore iniziale, in tale modo si recupera lo spazio lasciato libero dall eliminazione degli elementi, facendo il giro : ultimo primo Aritmetica modulo m. Siano a ed m due numeri naturali, indichiamo con a mod m il resto della divisione a/m Se m = 10 abbiamo: per a < m a mod m = a per a m ritroviamo come resti i valori compresi tra 0 e 9 Esempio. 1/10 resto 1 quoziente 0 3/10 resto 3 9/10 resto 9 10/10 resto 0 quoziente 1 24/10 resto 4 quoziente 2 Dobbiamo trovare un modo per calcolare l incremento di primo e di ultimo per fare il giro. Per costruire il successivo (dobbiamo gestire primo++ e ultimo++) costruiamo un metodo per calcolare il resto della divisione del successivo con la dimensione dell array (modulo la dimensione dell array): int incremento(int n){ return((n+1)%v.length); Invece di: primo++ incremento(primo) ultimo++ incremento(ultimo) Rimane ancora un problema. Per raddoppiare non si dovrà più vedere se ultimo==v.length ma se incremento(ultimo)==primo così consideriamo anche il caso in cui possiamo avere fatto tutto il giro (ultimo<primo). Rimane (giustamente) un posto libero prima di fare il raddoppio. Ma cosa succede nel raddoppio se avevamo fatto il giro? L array si raddoppia a destra, e la Coda è nella prima metà e non è ben memorizzata; dobbiamo quindi ricopiare la prima parte dalla testa fino al valore di ultimo (escluso) nella seconda metà: 17

18 public void inserisci(int elem) { /**enqueue: inserimento in coda: in media O(1)*/ if (incremento (ultimo) == primo){ //Coda piena: raddoppio int[] tmp = new int[2*vett.length]; for (int i = 0; i < vett.length; i++) tmp[i] = vett[i]; vett = tmp; if (ultimo < primo) {/** se gli ultimi elementi inseriti sono all inizio dell array e i primi verso la fine */ /**dopo il ridimensionamento la coda "funziona" male; si sposta nella seconda meta dell'array la parte che si trova all'inizio */ for (int i = 0; i < ultimo; i++) vett[vett.length/2 + i]=vett[i]; ultimo = ultimo + vett.length/2; //fine if //fine if vett[ultimo] = elem; ultimo = incremento(ultimo); 18

Conversioni di tipo fra sottoclasse e superclasse

Conversioni di tipo fra sottoclasse e superclasse Conversioni di tipo fra sottoclasse e superclasse Può esserci la necessità di memorizzare un riferimento di una sottoclasse in un riferimento a superclasse. È possibile? Abbiamo visto l invocazione del

Dettagli

Conversioni di tipo fra sottoclasse e superclasse

Conversioni di tipo fra sottoclasse e superclasse Conversioni di tipo fra sottoclasse e superclasse Conversioni di tipo fra sottoclasse e superclasse Può esserci la necessità di memorizzare un riferimento di una sottoclasse in un riferimento a superclasse.

Dettagli

Coda su lista concatenata

Coda su lista concatenata Cosa studiare nel libro Capitolo 7: tutto tranne Argomenti avanzati 7.2 e 7.5 Capitolo 8: solo 8.5, 8.6, 8.7, 8.8 e Argomenti avanzati 8.1 Capitolo 9: tutto fino a 9.6 (escluso) Capitolo 10: tutto fino

Dettagli

SOMMARIO STACK. STACK: specifica STACK

SOMMARIO STACK. STACK: specifica STACK SOMMARIO STACK Pila (stack): una struttura dati lineare a cui si può accedere soltanto mediante uno dei suoi capi per memorizzare e per estrarre dati. Specifica (descrizione). Implementazione (realizzazione).

Dettagli

Struttura di dati lista concatenata

Struttura di dati lista concatenata Struttura di dati lista concatenata Lista concatenata Consideriamo una nuova modalità di memorizzare i dati in cui l accesso non avviene più tramite un indice, che individua la posizione del dato nella

Dettagli

GenericContainer. Archivio. Interface GenericContainer. Interface GenericContainer Possiamo scrivere: Definizione del TDA contenitore generico :

GenericContainer. Archivio. Interface GenericContainer. Interface GenericContainer Possiamo scrivere: Definizione del TDA contenitore generico : Interface GenericContainer Definizione del TDA contenitore generico : GenericContainer public interface GenericContainer{ boolean isempty(); void makeempty(); /* si puo' aggiungere int getsize(); per sapere

Dettagli

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2 Dispensa 09 ADT: Lista, Pila, Coda A. Miola Marzo 2007 http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 1 Contenuti Tipo

Dettagli

tipi di dato astratti

tipi di dato astratti tipi di dato astratti A. FERRARI ADT Un tipo di dato astratto o ADT (Abstract Data Type) è un tipo di dato le cui istanze possono essere manipolate con modalità che dipendono esclusivamente dalla semantica

Dettagli

Array. Walter Didimo

Array. Walter Didimo Array Walter Didimo Un problema ricorrente Gli strumenti di programmazione che abbiamo visto sin qui non sono ancora sufficienti per risolvere tutti i problemi di base Consideriamo ad esempio il seguente

Dettagli

In questa lezione Strutture dati elementari: Pila Coda Loro uso nella costruzione di algoritmi.

In questa lezione Strutture dati elementari: Pila Coda Loro uso nella costruzione di algoritmi. In questa lezione Strutture dati elementari: Pila Coda Loro uso nella costruzione di algoritmi. 1 strutture dati (astratte) Una struttura dati astratti consiste di uno o più insiemi con delle operazioni

Dettagli

Casi di prova. Il problema dell ordinamento. Casi di prova. Casi di prova. Casi di prova

Casi di prova. Il problema dell ordinamento. Casi di prova. Casi di prova. Casi di prova Casi di prova Casi di prova Quando si vuole testare un algoritmo si devono costruire vari casi di prova. Invece di eseguire il programma più volte si può costruire un file di dati contenente tutti i casi

Dettagli

Tipi di dati astratti

Tipi di dati astratti Tipi di dati astratti ADT 1 Dati strutturati e algoritmi Una struttura di dati è un insieme di regole per organizzare e manipolare dei dati Un algoritmo è un procedimento composto in passi elementari in

Dettagli

TIPO DI DATO ASTRATTO

TIPO DI DATO ASTRATTO TIPO DI DATO ASTRATTO Tipo di dato astratto Esempio: Vogliamo rappresentare un sistema di prenotazione di esami universitari. Dati immagazzinati: prenotazioni esami Operazioni supportate: prenota(esame,

Dettagli

La struttura dati CODA

La struttura dati CODA Programmazione M-Z Ingegneria e Scienze Informatiche - Cesena A.A. 2016-2017 La struttura dati CODA Pietro Di Lena - pietro.dilena@unibo.it Introduzione Una coda (o queue) è una struttura dati astratta

Dettagli

Laboratorio di Programmazione

Laboratorio di Programmazione Laboratorio di Programmazione (Laurea triennale in matematica) Lezione 25 Le liste in C struct nodo { int info; struct nodo *next; }; typedef struct nodo Nodo; typedef Nodo *PNodo; Inserimento in ordine

Dettagli

Trasformare array paralleli in array di record

Trasformare array paralleli in array di record Trasformare array paralleli in array di record Un array è una struttura di dati omogenea: gli elementi dell array sono tutti dello stesso tipo (che è il tipo dell array). A volte è necessario gestire informazioni

Dettagli

Trasformare array paralleli in array di record

Trasformare array paralleli in array di record Trasformare array paralleli in array di record Un array è una struttura di dati omogenea: gli elementi dell array sono tutti dello stesso tipo (che è il tipo dell array). A volte è necessario gestire informazioni

Dettagli

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05 Strutture dati Il che cosa e il come Il che cosa ed il come Struttura dati: descrive come sono organizzati i dati e come sono realizzate le operazioni su di essi (cioe come si accede ai dati) Specifica

Dettagli

Laboratorio di Programmazione

Laboratorio di Programmazione Laboratorio di Programmazione (Laurea triennale in matematica) Lezione 33 Le liste in C struct nodo { int info; struct nodo *next; }; typedef struct nodo Nodo; typedef Nodo *PNodo; Pila (Stack ) La struttura

Dettagli

Trasformare array paralleli in array di record

Trasformare array paralleli in array di record Trasformare array paralleli in array di record Trasformare array paralleli in array di record Un array è una struttura di dati omogenea: gli elementi dell array sono tutti dello stesso tipo (che è il tipo

Dettagli

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati Strutture Elementari Maria Rita Di Berardini, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino 29 ottobre 2008 Strutture Dati Astratte Il concetto di dato Il concetto

Dettagli

LINKEDLIST: implementazione iteratore. LINKEDLIST: iteratore INNERITERATOR INNERITERATOR

LINKEDLIST: implementazione iteratore. LINKEDLIST: iteratore INNERITERATOR INNERITERATOR LINKEDLIST: iteratore Il metodo iterator() restituisce un oggetto iteratore sulla lista per scandire gli elementi in sequenza a partire dall inizio della lista. public Iterator iterator() { return new

Dettagli

Laboratorio di Programmazione

Laboratorio di Programmazione Laboratorio di Programmazione (Laurea triennale in matematica) Lezione 25 ADT (Abstract Data Types) tipo di dato astratto Un ADT è un modello matematico con una collezione di operatori definiti su tale

Dettagli

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati Maria Rita Di Berardini, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino A.A. 2006/07 Il concetto di dato Il concetto di tipo di dato Insertion Sort for j 2 to lenght[a]

Dettagli

semplici ogni elemento contiene un riferimento al successivo doppie ogni elemento contiene un riferimento al successivo e al precedente

semplici ogni elemento contiene un riferimento al successivo doppie ogni elemento contiene un riferimento al successivo e al precedente Liste doppie Liste: semplici ogni elemento contiene un riferimento al successivo doppie ogni elemento contiene un riferimento al successivo e al precedente Rappresentazione grafica semplice: doppia: Gli

Dettagli

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati Maria Rita Di Berardini 2, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino 2 Polo di Scienze Università di Camerino ad Ascoli Piceno Il concetto di dato Il concetto

Dettagli

Orario delle lezioni LABORATORIO TEORIA. mercoledì. martedì aula P/4. lab Turing. Strutture Dati

Orario delle lezioni LABORATORIO TEORIA. mercoledì. martedì aula P/4. lab Turing. Strutture Dati Orario delle lezioni LABORATORIO martedì 15.00-18.00 TEORIA mercoledì 16.00 18.00 lab Turing aula P/4 Libro di testo Data Structures & Algorithms in Java Michael T. Goodrich Roberto Tamassia John Wiley

Dettagli

Capitolo 9. Tipi enumerativi, tipi generici e interfacce. c 2005 Pearson Education Italia Capitolo 9-1 / 73

Capitolo 9. Tipi enumerativi, tipi generici e interfacce. c 2005 Pearson Education Italia Capitolo 9-1 / 73 Capitolo 9 Tipi enumerativi, tipi generici e interfacce c 2005 Pearson Education Italia Capitolo 9-1 / 73 Sommario: Tipi enumerativi, tipi generici e interfacce 1 Definizione di tipi enumerativi La classe

Dettagli

Calcolare x n = x x x (n volte)

Calcolare x n = x x x (n volte) Calcolare x n = x x x (n volte) Abbiamo bisogno di: una variabile ris in cui ad ogni iterazione del ciclo si ha un risultato parziale, e che dopo l ultima iterazione contiene il risultato finale; una variabile

Dettagli

Si usano quando serve accesso rapido sia in lettura che in scrittura su un insieme non ordinato

Si usano quando serve accesso rapido sia in lettura che in scrittura su un insieme non ordinato Le tavole hash È il modo con cui sono realizzati gli HashSet Si usano quando serve accesso rapido sia in lettura che in scrittura su un insieme non ordinato Principio base Gli array hanno le caratteristiche

Dettagli

Fondamenti di Informatica e Laboratorio T-AB T-15 Strutture dati

Fondamenti di Informatica e Laboratorio T-AB T-15 Strutture dati Fondamenti di Informatica e Laboratorio T-AB T-15 Strutture dati Paolo Torroni Dipartimento di Elettronica, Informatica e Sistemistica Università degli Studi di Bologna Anno Accademico 2008/2009 Sommario

Dettagli

Il vettore e la lista concatenate (o catena) sono due esempi di strutture interne.

Il vettore e la lista concatenate (o catena) sono due esempi di strutture interne. Strutture dati PILA e CODA Le strutture dati si dividono in interne e astratte. Quelle astratte sono rappresentazioni dei dati di un problema che rispecchiano le proprietà dei dati e le relazioni usate

Dettagli

Le liste con array. Rimuovere la perla rossa costringe a spostare molte altre perle. Dove mettere la perla verde se si è esaurito il filo?

Le liste con array. Rimuovere la perla rossa costringe a spostare molte altre perle. Dove mettere la perla verde se si è esaurito il filo? Liste Linkate Le liste con array Volendo usare una metafora, l implementazione delle liste tramite array è come infilare le perle (gli oggetti della lista) in un filo di lunghezza predefinita. E chiaro

Dettagli

Le liste. Prof. Francesco Accarino IIS Sesto San Giovanni Via Leopardi 132

Le liste. Prof. Francesco Accarino IIS Sesto San Giovanni Via Leopardi 132 Le liste Prof. Francesco Accarino IIS Sesto San Giovanni Via Leopardi 132 Le Liste Le liste non sequenziali (concatenate) sono costituite da elementi che vengono memorizzati in memoria centrale non uno

Dettagli

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2 Dispensa 04 Introduzione ai Tipi astratti di dato A. Miola Febbraio 2007 http://www.dia.uniroma3.it/~java/fondinf2/ Introduzione ADT 1

Dettagli

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione Alberi Strutture dati: Alberi Strutture gerarchiche di dati Esempi Il file system di un sistema operativo L organigramma di un azienda Alberi generali, alberi n-ari, alberi binari, Ogni nodo ha un unico

Dettagli

10/10/2016. Caratteristiche degli array. Il tipo RECORD. Il record. LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica

10/10/2016. Caratteristiche degli array. Il tipo RECORD. Il record. LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica Caratteristiche degli array Principali caratteristiche degli array: LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica Marco Lapegna Dipartimento di Matematica e Applicazioni Universita degli

Dettagli

Fondamenti di Informatica II

Fondamenti di Informatica II Università degli studi di Messina Facoltà di Ingegneria Corso di Laurea in Ingegneria Informatica e delle Telecomunicazioni Fondamenti di Informatica II Tipi di dati astratti(adt)- seconda parte Coda Struttura

Dettagli

Introduzione. Liste. Strutture ricorsive (2) Strutture ricorsive (1) DD p KP p

Introduzione. Liste. Strutture ricorsive (2) Strutture ricorsive (1) DD p KP p Introduzione Liste DD p. 449-474 KP p.397-424 Abbiamo fin ora studiato strutture dati con dimensione fissa: vettori e matrici strutture Introduciamo ora le strutture dati dinamiche (liste concatenate):

Dettagli

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa E16 Esercizi Strutture Collegate e Oggetti C. Limongelli Maggio 2012 1 Contenuti q Verifiche universali ed esistenziali su strutture

Dettagli

In una coda gli inserimenti si fanno alla fine e le cancellazioni all inizio! First In First Out

In una coda gli inserimenti si fanno alla fine e le cancellazioni all inizio! First In First Out In una coda gli inserimenti si fanno alla e e le cancellazioni all inizio! First In First Out Progr II - Coda 1 CODA: i requisiti Una coda (queue) è un ADT in cui le operazioni sono inserimenti e cancellazioni

Dettagli

Tipi di dato e Strutture dati elementari

Tipi di dato e Strutture dati elementari Tipi di dato e Strutture dati elementari Ing. Paolo Craca Anno accademico 2007/2008 Tipi di dato e Strutture dati elementari 1 / 40 Cosa vedremo in questo seminario 1 Introduzione 2 Pile 3 Code 4 5 Bibliografia

Dettagli

Fondamenti di Informatica

Fondamenti di Informatica Strutture dati complesse Esempi di strutture dati complesse analizzate in questa lezione: Fondamenti di Informatica 21. Strutture di dati complesse in C++ Array di puntatori Pila (Stack) Coda (queue) Liste

Dettagli

Liste concatenate. Violetta Lonati

Liste concatenate. Violetta Lonati Liste concatenate Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica 2 novembre 2017 Violetta Lonati Liste

Dettagli

Ad esempio, creazione di una lista di numeri interi e di una lista di oggetti di tipo Persona:

Ad esempio, creazione di una lista di numeri interi e di una lista di oggetti di tipo Persona: List e LinkedList La classe List consente di creare un array dinamico di oggetti di un certo tipo, specificato in fase di dichiarazione dell oggetto lista. Si dice che l array è dinamico nel senso

Dettagli

Liste concatenate e allocazione dinamica

Liste concatenate e allocazione dinamica Liste concatenate e allocazione dinamica Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2018/2019 Argomenti del Corso Ogni lezione consta di una spiegazione assistita da slide, e seguita

Dettagli

Stampare una Pila. Stampare una Pila. Stampare una Pila. Stampare una Pila

Stampare una Pila. Stampare una Pila. Stampare una Pila. Stampare una Pila Stampare una Pila Stampare una Pila Quando si stampa un Pila gli elementi appaiono nell ordine inverso a quello di inserimento; inoltre la Pila si vuota. Supponiamo di avere introdotto nella Pila i valori

Dettagli

Stampare una Pila. Stampare una Pila. Stampare una Pila. Stampare una Pila. Pila o Stack

Stampare una Pila. Stampare una Pila. Stampare una Pila. Stampare una Pila. Pila o Stack Stampare una Pila Stampare una Pila Quando si stampa un Pila gli elementi appaiono nell ordine inverso a quello di inserimento; inoltre la Pila si vuota. Supponiamo di avere introdotto nella Pila i valori

Dettagli

Prof. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1

Prof. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1 Operazioni sulle liste Definiamo una serie di procedure e funzioni per operare sulle liste. Usiamo liste di interi per semplicità, ma tutte le operazioni sono realizzabili in modo del tutto analogo su

Dettagli

Algoritmi e Strutture di Dati

Algoritmi e Strutture di Dati Algoritmi e Strutture di Dati Capitolo 4 - Strutture di dati elementari This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike License. To view a copy of this license, visit

Dettagli

Liste. Costo operazioni Tutte le operazioni hanno costo O(1)

Liste. Costo operazioni Tutte le operazioni hanno costo O(1) Liste Liste (List, Linked List) Una sequenza di nodi, contenenti dati arbitrari e 1-2 puntatori all'elemento successivo e/o precedente Contiguità nella lista contiguità nella memoria Costo operazioni Tutte

Dettagli

Interfacce. Esempio: interfaccia I con una sola funzione g() public interface I {

Interfacce. Esempio: interfaccia I con una sola funzione g() public interface I { Interfacce Una interfaccia è un astrazione per un insieme di funzioni pubbliche delle quali si definisce solo la segnatura, e non le istruzioni. Un interfaccia viene poi implementata da una o più classi

Dettagli

Corso sul linguaggio Java

Corso sul linguaggio Java Corso sul linguaggio Java Modulo JAVA7 B3 Gestione di una coda 1 Prerequisiti Programmazione base in Java Utilizzo di classi e oggetti Tecnica di allocazione dinamica Concetto di coda e operazioni relative

Dettagli

Altri Esercizi. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica. Dispensa E17. C. Limongelli Maggio 2012

Altri Esercizi. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica. Dispensa E17. C. Limongelli Maggio 2012 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa E17 C. Limongelli Maggio 2012 1 Contenuti q Definizione di classi con ereditarietà q Uso di tipi di dati astratti q Ricorsione

Dettagli

Algoritmi di Ricerca. Esempi di programmi Java

Algoritmi di Ricerca. Esempi di programmi Java Fondamenti di Informatica Algoritmi di Ricerca Esempi di programmi Java Fondamenti di Informatica - D. Talia - UNICAL 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare

Dettagli

Array e Oggetti. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica. Dispensa 17. A. Miola Gennaio 2012

Array e Oggetti. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica. Dispensa 17. A. Miola Gennaio 2012 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 17 A. Miola Gennaio 2012 1 Contenuti q Array paralleli q Array e oggetti q Ricerca sequenziale q Ricerca binaria q Fusione di sequenze

Dettagli

CORSO DI PROGRAMMAZIONE

CORSO DI PROGRAMMAZIONE ISTITUTO TECNICO INDUSTRIALE G. M. ANGIOY SASSARI CORSO DI PROGRAMMAZIONE PILE E CODE DI DATI DISPENSA 11.02 11-02_Pile_Code_[ver_15] Questa dispensa è rilasciata sotto la licenza Creative Common CC BY-NC-SA.

Dettagli

INTRODUZIONE INTRODUZIONE TABELLE HASH FUNZIONE HASH

INTRODUZIONE INTRODUZIONE TABELLE HASH FUNZIONE HASH INTRODUZIONE INTRODUZIONE Una tabella hash è una struttura dati che permette operazioni di ricerca e inserimento molto veloci: in pratica si ha un costo computazionale costante O(1). Si ricorda che la

Dettagli

Struttura dati astratta Coda

Struttura dati astratta Coda CODE Struttura dati astratta Coda La coda o queue è una struttura dati astratta in cui l'inserimento e l estrazione sono consentite solo in specifiche posizioni; in particolare, l'inserimento è consentito

Dettagli

ALGORITMI E STRUTTURE DATI

ALGORITMI E STRUTTURE DATI Esercitazioni del corso di: ALGORITMI E STRUTTURE DATI Tutor: Francesca Piersigilli email: francesca.piersigilli@unicam.it Strutture dati elementari Tecniche di organizzazione dei dati: scelta della struttura

Dettagli

Algoritmi di Ricerca. Esempi di programmi Java. Prof. Angela Bonifati

Algoritmi di Ricerca. Esempi di programmi Java. Prof. Angela Bonifati Passaggio dei parametri in Java Nel seguente esempio public class parametri2 public static void main(string args[]) int x = 1; int y; double d[] = new double[2]; d[0] = 25; y= metodo1(d, x); System.out.println("Il

Dettagli

Pile e Code. Definiamo una collezione come un gruppo di oggetti, detti gli elementi della collezione.

Pile e Code. Definiamo una collezione come un gruppo di oggetti, detti gli elementi della collezione. Pile e Code lezione 4 Collezioni Defiamo una collezione come un gruppo di oggetti, detti gli elementi della collezione. Durante il corso defiremo delle tecniche di base per gestire modo efficiente collezioni

Dettagli

semplici ogni elemento contiene un riferimento al successivo doppie ogni elemento contiene un riferimento al successivo e al precedente

semplici ogni elemento contiene un riferimento al successivo doppie ogni elemento contiene un riferimento al successivo e al precedente 1 of 23 22/11/2004 10.23 Liste: semplici ogni elemento contiene un riferimento al successivo doppie ogni elemento contiene un riferimento al successivo e al precedente Rappresentazione grafica Lista semplice:

Dettagli

Il Linguaggio Java. Le interfacce

Il Linguaggio Java. Le interfacce Il Linguaggio Java Le interfacce Ordinamento dei conti PROBLEMA: si vogliono ordinare i libretti di risparmio (SavingsAccount) in base al loro tasso di interesse REQUISITO: La classe dovrebbe essere ordinabile,

Dettagli

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2 Dispensa E14 F. Gasparetti, C. Limongelli Maggio 2012 1 Verifica presenza di elementi comuni V1 - Date due liste di stringhe scrivere

Dettagli

Fondamenti di informatica T-1 (A K) Esercitazione 9: array

Fondamenti di informatica T-1 (A K) Esercitazione 9: array Fondamenti di informatica T-1 (A K) Esercitazione 9: array AA 2018/2019 Tutor Lorenzo Rosa lorenzo.rosa@unibo.it 2 Esercitazione 9 Introduzione al calcolatore e Java Linguaggio Java, basi e controllo del

Dettagli

public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;

public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false; Metodi iterativi con array monodimensionali 1. Scrivere un metodo che, dato un array di interi a, restituisce il valore minimo in a. public static int minimo (int[] a) { int min = a[0]; for (int i=1; i

Dettagli

Liste concatenate. Collezione ordinata di nodi. Carlo Paolo Simona. Anna. ciascun nodo contiene due riferimenti:

Liste concatenate. Collezione ordinata di nodi. Carlo Paolo Simona. Anna. ciascun nodo contiene due riferimenti: Liste concatenate Collezione ordinata di nodi head tail next next next next element element element element Ø Anna Carlo Paolo Simona ciascun nodo contiene due riferimenti: - un riferimento "element" a

Dettagli

Altri Esercizi. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2. Dispensa E09. C. Limongelli Marzo 2008

Altri Esercizi. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2. Dispensa E09. C. Limongelli Marzo 2008 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2 Dispensa E09 Altri Esercizi C. Limongelli Marzo 2008 http://www.dia.uniroma3.it/~java/fondinf2/ Altri Esercizi 1 Contenuti!Definizione

Dettagli

Programmazione II canale AD -- Esonero del 21/04/2006

Programmazione II canale AD -- Esonero del 21/04/2006 Esercizio 1 (Sbarramento ) Si scriva una funzione ricorsiva che riceve in input una lista concatenata di interi L e restituisce una nuova lista concatenata di interi L1 in cui l elemento j-simo ( j 1)

Dettagli

Laboratorio di Programmazione Lezione 3. Cristian Del Fabbro

Laboratorio di Programmazione Lezione 3. Cristian Del Fabbro Laboratorio di Programmazione Lezione 3 Cristian Del Fabbro Prossima lezione GIOVEDÌ 12 NOVEMBRE ORE 14:00 Array a.k.a. vettore Un array è una collezione ordinata di dati omogenei (cioé sono tutti dello

Dettagli

In questa lezione Strutture dati elementari: Pila Coda

In questa lezione Strutture dati elementari: Pila Coda In questa lezione Strutture dati elementari: Pila Coda 1 strutture dati (astratte) Una struttura dati astratti consiste di uno o più insiemi con delle operazioni che li modificano (insiemi dinamici). Le

Dettagli

La classe java.lang.object

La classe java.lang.object La classe java.lang.object In Java: Gerarchia di ereditarietà semplice Ogni classe ha una sola super-classe Se non viene definita esplicitamente una super-classe, il compilatore usa la classe predefinita

Dettagli

Heap e Code di Priorità

Heap e Code di Priorità Heap e Code di Priorità heap heap = catasta condizione di heap 1. albero binario perfettamente bilanciato 2. ogni nodo contiene una chiave maggiore o eguale di quelle presenti negli eventuali figli non

Dettagli

Informatica 3. LEZIONE 13: Liste doppie, pile e code. Modulo 1: Free list Modulo 2: Lista doppia Modulo 3: Pila Modulo 4: Coda

Informatica 3. LEZIONE 13: Liste doppie, pile e code. Modulo 1: Free list Modulo 2: Lista doppia Modulo 3: Pila Modulo 4: Coda Informatica 3 LEZIONE 13: Liste doppie, pile e code Modulo 1: Free list Modulo 2: Lista doppia Modulo 3: Pila Modulo 4: Coda Informatica 3 Lezione 13 - Modulo 1 Free list Free list Le funzioni di sistema

Dettagli

public BankAccount() { balance = 0; } public BankAccount(double initialbalance) { balance = initialbalance; }

public BankAccount() { balance = 0; } public BankAccount(double initialbalance) { balance = initialbalance; } Il Linguaggio Java Le interfacce La classe BankAccount public class BankAccount { public BankAccount() { balance = 0; public BankAccount(double initialbalance) { balance = initialbalance; public void deposit(double

Dettagli

Esercitazioni di Fondamenti di Informatica - Lez. 8 27/11/2018

Esercitazioni di Fondamenti di Informatica - Lez. 8 27/11/2018 Esercitazioni di Fondamenti di Informatica - Lez. 8 27/11/2018 Esercizi sull allocazione dinamica della memoria in C Il codice di questi esercizi é contenuto nella cartella parte1 1. Implementare una lista

Dettagli

Esempi in Java di program.ne O-O

Esempi in Java di program.ne O-O Esempi in Java di program.ne O-O Ereditarietà Polimorfismo statico e dinamico Esercitazione laboratorio Interfaccia Comparable e Comparator 1 Gerarchia di ereditarietà Persona IS_A Docente Studente Tecnico

Dettagli

Pile e code. ADT e strutture dati per la rappresentazione di sequenze ad accesso LIFO e FIFO

Pile e code. ADT e strutture dati per la rappresentazione di sequenze ad accesso LIFO e FIFO Pile e code ADT e strutture dati per la rappresentazione di sequenze ad accesso LIFO e FIFO Le Pile Una pila è una struttura dati lineare, alla quale gli elementi possono essere aggiunti o sottratti da

Dettagli

Le liste. Le liste linkate

Le liste. Le liste linkate Le liste Le liste linkate Molto spesso bisogna gestire insiemi di oggetti dello stesso tipo. Un modo molto semplice per tenere in memoria tali insiemi consiste nel creare un array per contenerli. Nome

Dettagli

Algoritmi di Ricerca. Esempi di programmi Java

Algoritmi di Ricerca. Esempi di programmi Java Fondamenti di Informatica Algoritmi di Ricerca Esempi di programmi Java Fondamenti di Informatica - D. Talia - UNICAL 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare

Dettagli

Ereditarietà (ultima)

Ereditarietà (ultima) Ereditarietà (ultima) Classi astratte Un ibrido tra classi e interfacce Hanno alcuni metodi implementati normalmente, altri astratti Un metodo astratto non ha implementazione abstract class AccountTransaction...

Dettagli

Ereditarietà (ultima)

Ereditarietà (ultima) Ereditarietà (ultima) Classi astratte Un ibrido tra classi e interfacce Hanno alcuni metodi implementati normalmente, altri astratti Un metodo astratto non ha implementazione abstract class AccountTransaction

Dettagli

Algoritmi e Programmazione Avanzata. Pile e code. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

Algoritmi e Programmazione Avanzata. Pile e code. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino Sommario ADT Pile Code. A.A. 2001/2002 APA - 2 1 Sommario ADT Pile Code. A.A. 2001/2002 APA - 3 ADT Le regole che

Dettagli

Il TDA Map. Tabelle hash

Il TDA Map. Tabelle hash Il TDA Map Tabelle hash Definizione informale Il TDA Map memorizza coppie formate da una chiave k e da un valore v La coppia è chiamata entry Ogni chiave deve essere unica Questa è la differenza principale

Dettagli

Definizione informale. Il TDA Map memorizza coppie formate da una chiave k e da un valore v. La coppia è chiamata entry. Ogni chiave deve essere unica

Definizione informale. Il TDA Map memorizza coppie formate da una chiave k e da un valore v. La coppia è chiamata entry. Ogni chiave deve essere unica Il TDA Map Tabelle hash Definizione informale Il TDA Map memorizza coppie formate da una chiave k e da un valore v La coppia è chiamata entry Ogni chiave deve essere unica Questa è la differenza principale

Dettagli

Il TDA Map. Definizione informale. I metodi del TDA Map 2. I metodi del TDA Map 1. Interfaccia Map 1 NO_SUCH_KEY. Tabelle hash

Il TDA Map. Definizione informale. I metodi del TDA Map 2. I metodi del TDA Map 1. Interfaccia Map 1 NO_SUCH_KEY. Tabelle hash Il TDA Map Tabelle hash Definizione informale Il TDA Map memorizza coppie formate da una chiave k e da un valore v La coppia è chiamata entry Ogni chiave deve essere unica Questa è la differenza principale

Dettagli

4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste

4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste 4 Le liste collegate 4.0 Le liste collegate c Diego Calvanese Fondamenti di Informatica Corso di Laurea in Ingegneria Elettronica A.A. 2001/2002 4.0 0 4 Le liste collegate Rappresentazione di liste 4.1

Dettagli

Implementazione Java di un ADT

Implementazione Java di un ADT Implementazione Java di un ADT Primo passo definire l'interfaccia (API) dell' ADT (l'api descrive i nomi dei metodi che l'adt supporta e come essi sono dichiarati e usati) Secondo passo scrivere il codice

Dettagli

Fondamenti di Informatica T-1

Fondamenti di Informatica T-1 Fondamenti di Informatica T-1 Interfaccia Comparable e Collezioni Tutor: Allegra De Filippo allegra.defilippo@unibo.it a.a. 2015/2016 Fondamenti di Informatica T-1 Allegra De Filippo 1 / 22 Interfaccia

Dettagli

Pile e code. Sommario. Algoritmi e Programmazione Avanzata. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

Pile e code. Sommario. Algoritmi e Programmazione Avanzata. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino Pile e code Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino Sommario ADT Pile Code. A.A. 2002/2003 APA - Pile e code 2 Politecnico di Torino Pagina 1 di 23 Sommario

Dettagli

Corso sul linguaggio Java

Corso sul linguaggio Java Corso sul linguaggio Java Modulo JAVA7 B1 Gestione di liste 1 Prerequisiti Programmazione base in Java Utilizzo di classi e oggetti Tecnica di allocazione dinamica Gestione di liste Classificazione delle

Dettagli

5. Quinta esercitazione autoguidata: liste semplici

5. Quinta esercitazione autoguidata: liste semplici 22 5. Quinta esercitazione autoguidata: liste semplici 5.1. Liste rappresentate mediante strutture e puntatori (LISTE1.C, LISTE2.C) Scrivere un programma che - costruisce una lista di k interi (con k letto

Dettagli

Informatica 3. Informatica 3. LEZIONE 13: Liste doppie, pile e code. Lezione 13 - Modulo 1. Free list (2) Free list. Free list

Informatica 3. Informatica 3. LEZIONE 13: Liste doppie, pile e code. Lezione 13 - Modulo 1. Free list (2) Free list. Free list LEZIONE 13: Liste doppie, pile e code Modulo 1: Free list Modulo 2: Lista doppia Modulo 3: Pila Modulo 4: Coda Lezione 13 - Modulo 1 Free list Politecnico di Milano - Prof. Sara Comai 1 Politecnico di

Dettagli

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO CENTRO STUDI ULISSE Via Buccino, n. 22 - C.a.p. 84018 - Scafati (SA) Tel. Fax. 081.19970299-339.2365416-349.4152010 E-mail: info@centrostudiulisse.it - www.centrostudiulisse.it OCA JAVA 7 SE PROGRAMMER

Dettagli

Esercitazione 8. Corso di Tecniche di programmazione. Laurea in Ingegneria Informatica

Esercitazione 8. Corso di Tecniche di programmazione. Laurea in Ingegneria Informatica Dipartimento di Informatica e Sistemistica Antonio Ruberti Sapienza Università di Roma Esercitazione 8 Corso di Tecniche di programmazione Laurea in Ingegneria Informatica (Canale di Ingegneria delle Reti

Dettagli

Algoritmi e Strutture di Dati

Algoritmi e Strutture di Dati Algoritmi e Strutture di Dati Tipi astratti di dato (pile e code realizzate tramite array) m.patrignani Nota di copyright queste slides sono protette dalle leggi sul copyright il titolo ed il copyright

Dettagli

Oggetti e classi. La classe è un modello (un contenitore) che definisce la forma di un oggetto, specificando:

Oggetti e classi. La classe è un modello (un contenitore) che definisce la forma di un oggetto, specificando: Classi Oggetti e classi La classe è un modello (un contenitore) che definisce la forma di un oggetto, specificando: Come è fatto (i dati) Quali operazioni si possono fare con- e sull oggetto (le funzioni)

Dettagli