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

Documenti analoghi
Implementazione della coda con liste concatenate. x v. il front della coda è memorizzato nel primo nodo (head) della lista

STRUTTURE DATI: OLTRE GLI ARRAY LISTE

Il tipo astratto di dati Node List

Argomenti della lezione. Tipo di dato astratto. Array. Tipo di dato Lista. Liste Implementazione di liste in Java Stack Code

ADT Dizionario. Come nella Mappa: Diversamente dalla Mappa:

Implementazione Java di un ADT

Metodi di una Collection

La struttura dati CODA

ADT Mappa. Le chiavi (il mezzo per accedere agli elementi) hanno lo scopo di rendere efficiente la ricerca. Strutture Dati

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

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

Corso: Fondamenti di Informatica (Canale 5) a.a Corsi di laurea: Ing. Settore Informazione

Le collezioni di oggetti. Prof. Accarino IIS Altiero Spinelli via Leopardi 132 Sesto San Giovanni

Esempio su strutture dati dinamiche: ArrayList

Fondamenti di Informatica II

Capitolo 14 Introduzione alle strutture di dati. Cay S. Horstmann Concetti di informatica e fondamenti di Java quarta edizione

Fondamenti di informatica Oggetti e Java. Luca Cabibbo. Collezioni++ (Aggiunte di Marco Patella) Capitolo 26.bis. aprile 2006.

Strutture dati. Le liste

Laboratorio di Programmazione Lezione 3. Cristian Del Fabbro

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

Algoritmi e Strutture Dati

Le liste. ADT e strutture dati per la rappresentazione di sequenze. Ugo de' Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 5

Liste con sentinella. intlist *createlist(void){ intlist *q = malloc(sizeof(intlist)); if(!q) { exit(-1); } q->next = q->prev = q; return q; }

Esercizi Strutture dati di tipo astratto

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Algoritmi e Strutture Dati. Tipo di dato astratto e Strutture dati elementari

Liste doppie. Doubly Linked Lists. GT: 6.2 (e 3.3) Argomenti della lezione

Il TDA Dictionary. Definizione informale. I metodi del TDA Dictionary 1. Applicazioni. I metodi del TDA Dictionary 2. I metodi del TDA Dictionary 3

lezione 9 min-heap binario Heap e Alberi posizionali generali

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

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

heap heap heap? max- e min-heap concetti ed applicazioni heap = catasta condizione di heap non è una struttura ordinata

Tipi astratti pila e coda

Implementazione ADT: Alberi

Inserimento in una lista ordinata

Polimorfismo parametrico vs polimorfismo per inclusione

Questa soluzione va contemplata quando le lunghezze stimate dalle liste usate sono significativamente maggiori delle dimensioni di un elemento.

Linked Lists. Liste linkate (1) liste linkate ( stack, queues ), trees. Liste linkate come strutture

Sommario. Le strutture dati elementari per implementare sequenze: Vettori Liste

in più stringhe,... ADT un tipo è caratterizzato dalle operazioni consentite su di esso: un numero è qualcosa che si può moltiplicare, sommare,...

Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

Tipi di dato e Strutture dati elementari

Strutture dati elementari

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

PILE E CODE. Pile (stack):

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

Informatica 3. LEZIONE 12: Liste. Modulo 1: ADT lista e implementazione basata su array Modulo 2: Lista concatenata

Esercitazione: Implementazione in linguaggio C dell ADT. Stack con l utilizzo. di linked list

Laboratorio di Informatica

Algoritmi e Strutture Dati. Strutture di dati

Corso di Algoritmi e Strutture Dati con Laboratorio. Tipi di dato pila e coda

Liste, Pile e Code. 1. L ADT Lista. Liste Pile e Code Pag. 1/18

Esempio su strutture dati dinamiche: ArrayList

Bank. Bank. BankAccount. Bank. Bank. private BankAccount[] conti; // Posizione attuale private int posizioneattuale;...

In questa lezione Strutture dati elementari: Pila Coda

La struttura dati PILA

Alberi. In informatica, un albero è un modello astratto di una struttura dati gerarchica

Esempio su strutture dati dinamiche: ArrayList

Esercizio. Scrivere una classe ListMap<K, V> che implementa la mappa con una lista. Strutture Dati

L' ADT grafo è un contenitore di elementi memorizzati nelle posizioni del grafo (vertici e archi)

Notazione grafica UML

Lezione XXVII Lu 20-Nov File e Flussi in Java. Gestione di file in Java. Gestione di file in Java. Lettura di file di testo

La struttura dati LISTA

Contenitori: Pile e Code

Generics & Collections

Tipi di dati astratti e strutture dati (capitolo 14, e ancora capitolo 9)

Sommario. Collezioni. Collezioni: Liste: Pile (stack) Collezioni. Collezioni. Collezioni Struttura indicizzata (array) Nodi

ADT LISTA: altre operazioni non primitive ADT LISTA COSTRUZIONE ADT LISTA COSTRUZIONE ADT LISTA (2)

Capitolo 17. Introduzione alle strutture di dati. Capitolo 17 Introduzione alle strutture di dati

Alberi ( GT. 7 ) In informatica, un albero è un modello astratto con cui viene rappresentata una struttura gerarchica

Alberi. Definizioni principali

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

Progettazione By Contract

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

Astrazione Dati. Nicola Fanizzi. Linguaggi di Programmazione [010194] 10 mag, Dipartimento di Informatica Università degli Studi di Bari

Struttura dati astratta Coda

Coda su lista concatenata

22 - Strutture Dati (Java Collections Framework)

Algoritmi e Strutture di Dati I 1. Algoritmi e Strutture di Dati I Massimo Franceschet francesc

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Implementazione con alberi binari di ricerca

Implementazione del ADT Pila senza array dinamici

Albero Binario GT 7.3. interfacce di Positio<E>, Tree<E>, e BinaryTree<E>; il file TestLinkedBinaryTree.java

Programmazione II Compitino (Vers. B)

Il Java Collections Framework

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

ADT: Abstract Data Type. Quasi ADT. ADT per collezioni di dati (code generalizzate) 04 I tipi di dati astratti (I parte)

Introduzione al Java Collections Framework. Java Collections Framework (cont.) Interfacce del Collections Framework

CONCRETE (interne): è la effettiva implementazione della struttura nel linguaggio e relativa allocazione in memoria della struttura astratta

Specifica: la sintassi. Specifica: la semantica. Specifica: la semantica

Introduzione al Java Collections Framework

Tipi di dati astratti e strutture dati (capitolo 14, e ancora capitolo 9)

Corso: Strutture Dati Docente: Annalisa De Bonis

Tipi di Dati Astratti

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Programmazione ad Oggetti Modulo A (Esame del 11/9/2015)

Una breve introduzione all implementazione in C di algoritmi su grafo

COLLEZIONI. SOMMARIO Collezioni: Liste: ITERATORI ITERATORI

Grafi: visita generica

Java vs Ocaml. Una prima analisi

Transcript:

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 un elemento - un riferimento "next" ad un altro nodo

Liste concatenate Lista concatenata Ø array... 0 1 2 N-1 somiglianze: ordinamento lineare differenze: la lista concatenata non ha bisogno di una taglia fissata a priori come accade per l'array (può usare uno spazio propozionale al numero dei suoi elementi)

La classe Nodo Implementazione Java public class Node<E> { private E element; private Node<E> next; public Node(E e, Node<E> n){ element = e; next = n; } public Node(){ this(null,null); } public E getelement(){ return element; } public Node<E> getnext(){ return next; } public void setelement(e newelem) { element = newelem; } public void setnext(node<e> newnext){ next = newnext; } } next element

Liste concatenate Implementazione della pila con liste concatenate l elemento in cima alla pila è memorizzato nel primo nodo della lista head (cima della pila) Ø y a x v

Liste concatenate Implementazione della pila con liste concatenate l elemento in cima alla pila è memorizzato nel primo nodo della lista head (cima della pila) Ø y a x v inserimento di un nuovo elemento e nella pila (push(e))

Liste concatenate Implementazione della pila con liste concatenate l elemento in cima alla pila è memorizzato nel primo nodo della lista head (cima della pila) Ø y a x v inserimento di un nuovo elemento e nella pila (push(e)) - creiamo un nuovo nodo

Liste concatenate Implementazione della pila con liste concatenate l elemento in cima alla pila è memorizzato nel primo nodo della lista head (cima della pila) Ø e y a x v inserimento di un nuovo elemento e nella pila (push(e)) - creiamo un nuovo nodo - definiamo il riferimento all'elemento e

Liste concatenate Implementazione della pila con liste concatenate l elemento in cima alla pila è memorizzato nel primo nodo della lista head (cima della pila) Ø e y a x v inserimento di un nuovo elemento e nella pila (push(e)) - creiamo un nuovo nodo - definiamo il riferimento all'elemento e - definiamo il riferimento al nodo successivo

Liste concatenate Implementazione della pila con liste concatenate l elemento in cima alla pila è memorizzato nel primo nodo della lista head (cima della pila) Ø e y a x v inserimento di un nuovo elemento e nella pila (push(e)) - creiamo un nuovo nodo - definiamo il riferimento all'elemento e - definiamo il riferimento al nodo successivo - aggiorniamo il riferimento al nodo cima della pila

Liste concatenate Implementazione della pila con liste concatenate package stack; import linkedlist.node;//linkedlist e` il pacchetto dove abbiamo inserito la classe Node<E> public class NodeStack<E> implements Stack<E>{ protected Node<E> top; protected int size; public NodeStack(){ top = null; size = 0; } public int size() { return size; } public boolean isempty() { return (size == 0); }... }

Liste concatenate Implementazione della pila con liste concatenate public class NodeStack<E> implements Stack<E>{... public E top() throws EmptyStackException { if (isempty()) throw new EmptyStackException("Lo stack e` vuoto."); return top.getelement(); } public void push(e element) { Node<E> v = new Node<E>(element,top); top = v; size++; }... } public E pop() throws EmptyStackException { if (isempty()) throw new EmptyStackException("Lo stack e` vuoto."); E temp = top.getelement(); top = top.getnext(); size--; return temp; }

Liste concatenate Implementazione della coda con liste concatenate head (front della coda) tail (rear della coda) Ø e y a x v il front della coda è memorizzato nel primo nodo (head) della lista il rear della coda è memorizzato nell ultimo nodo (tail) della lista

Liste concatenate Implementazione della pila e della coda Vantaggi: - non si deve specificare a priori un limite superiore alla taglia della pila o della coda (una pila o una coda di n elementi richiederà sempre uno spazio di dimensione O(n)) - tutte le operazioni richiedono tempo O(1) Svantaggi: - l'implementazione è leggermente meno semplice di quella con array - lo spazio di memoria richiesto da ciascun elemento è un po' maggiore rispetto alla soluzione con array

La struttura dati Coda Doppia (Deque) E` un'estensione della struttura dati Coda - cancellazioni e inserimenti sono possibili da entrambe le estremità (front e rear) in in out out

Il tipo astratto di dati deque Tipo di dati e operazioni Dati: oggetti arbitrari Operazioni: - void addfirst(e e): inserisce un nuovo elemento e all'inizio di D - void addlast(e e): inserisce un nuovo elemento e alla fine di D - EremoveFirst(): restituisce e rimuove il primo elemento di D - E removelast(): restituisce e rimuove l'ultimo elemento di D - E getfirst(): restituisce il primo elemento di D - E getlast(): restituisce l'ultimo elemento di D - Integer size(): restituisce il numero di elementi di D - Boolean isempty(): è vero se D è vuota, falso altrimenti

Il tipo astratto di dati deque Le eccezioni Si verifica una EmptyDequeException quando si invoca uno dei seguenti metodi su una deque vuota. - E removefirst() - E removelast() - E getfirst() - E getlast()

Implementazione deque L'interfaccia public interface Deque<E> { public int size(); public boolean isempty(); public E getfirst() throws EmptyDequeException; public E getlast() throws EmptyDequeException; public void addfirst (E element); public void addlast (E element); public E removefirst() throws EmptyDequeException; } public E removelast() throws EmptyDequeException;

Implementazione deque Soluzione con liste concatenate head tail Ø

Implementazione deque Soluzione con liste concatenate head tail Ø come facciamo una removelast()?

Implementazione deque Soluzione con liste concatenate head tail Ø come facciamo una removelast()?

Implementazione deque Soluzione con liste concatenate head tail Ø come facciamo una removelast()?

Implementazione deque Soluzione con liste concatenate head tail Ø come facciamo una removelast()?

Implementazione deque Soluzione con liste concatenate head tail Ø come facciamo una removelast()?

Implementazione deque Soluzione con liste concatenate head tail Ø questa soluzione è inefficiente perché removelast() richiederebbe tempo O(n), dove n è il numero di elementi nella deque tempo necessario per aggiornare il riferimento next dell'ultimo nodo e il riferimento al nodo tail

Implementazione deque Soluzione con liste concatenate header trailer prev next Ciascun nodo contiene un riferimento (next) al nodo successivo e un riferimento (prev) al nodo precedente; Per semplificare la programmazione si usano due nodi speciali detti nodi sentinella: nodo header - next contiene un riferimento al primo nodo della deque - prev contiene null nodo trailer - prev contiene un riferimento all'ultimo nodo della deque - next contiene null

Implementazione deque Soluzione con liste concatenate Inserimento in testa di un nuovo elemento header trailer Sempronio Caio Tizio

Implementazione deque Soluzione con liste concatenate Inserimento in testa di un nuovo elemento header trailer Sempronio Caio Tizio

Implementazione deque Soluzione con liste concatenate Inserimento in testa di un nuovo elemento header trailer Sempronio Caio Tizio

Liste doppiamente concatenate La classe DLNode public class DLNode<E> { prev next private E element; private DLNode<E> next, prev; element public DLNode() { this(null, null, null); } public DLNode(E e, DLNode<E> p, DLNode<E> n) { element = e; next = n; prev = p; } } public void setelement(e newelem) { element = newelem; } public void setnext(dlnode<e> newnext) { next = newnext; } public void setprev(dlnode<e> newprev) { prev = newprev; } public E getelement() { return element; } public DLNode<E> getnext() { return next; } public DLNode<E> getprev() { return prev; }

La struttura dati array list E` un contenitore di elementi organizzati secondo un ordinamento lineare: primo elemento, secondo elemento,...

La struttura dati array list E` un contenitore di elementi organizzati secondo un ordinamento lineare: primo elemento, secondo elemento,... cancellazioni e inserimenti sono possibili in posti arbitrari

La struttura dati array list E` un contenitore di elementi organizzati secondo un ordinamento lineare: primo elemento, secondo elemento,... inserimento di un nuovo oggetto cancellazioni e inserimenti sono possibili in posti arbitrari

La struttura dati array list E` un contenitore di elementi organizzati secondo un ordinamento lineare: primo elemento, secondo elemento,... cancellazione di un oggetto cancellazioni e inserimenti sono possibili in posti arbitrari

La struttura dati array list E` un contenitore di elementi organizzati secondo un ordinamento lineare: primo elemento, secondo elemento,... cancellazione di un oggetto cancellazioni e inserimenti sono possibili in posti arbitrari

La struttura dati array list L'accesso agli elementi avviene per mezzo del loro indice Dato un array list S di n elementi, possiamo riferirci univocamente a ciascun elemento di S attraverso il suo indice: l'ndice di un elemento e in S è il numero di elementi che precedono e in S elemento di indice 0 L'indice di un elemento e rappresenta la posizione di e all'interno dell' ordinamento lineare della struttura: S l'elemento i-esimo ha indice i - 1 elemento di indice 3

La struttura dati array list Naturalmente: l'indice di un elemento e si può modificare in seguito a inserimenti e cancellazioni elemento di indice 0 Prima S elemento di indice 3

La struttura dati array list Naturalmente: l'indice di un elemento e si può modificare in seguito a inserimenti e cancellazioni Inserimento S

La struttura dati array list Naturalmente: l'indice di un elemento e si può modificare in seguito a inserimenti e cancellazioni elemento di indice 1 Dopo S elemento di indice 4

Il tipo astratto di dati array list Tipo di dati e operazioni Dati: oggetti arbitrari Operazioni: - get(i): restituisce l'elemento di indice i - set(i, e): restituisce e rimpiazza l'elemento di indice i con l elemento e - add(i, e): inserisce un nuovo elemento e di indice i - remove(i): restituisce e rimuove l'elemento di indice i - size() - isempty()

Il tipo astratto di dati array list Le eccezioni Dato un array list S di n elementi, si verifica una eccezione nei seguenti casi: get(i) con i < 0 oppure i > n - 1 set(i, e) con i < 0 oppure i > n - 1 remove(i) con i < 0 oppure i > n 1 add(i, e) con i < 0 oppure i > n S...... 0 1 2 i n - 1

Implementazione array list L'interfaccia public interface IndexList<E> { } public int size(); public boolean isempty(); public void add(int i, E e) throws IndexOutOfBoundsException; public E get(int i) throws IndexOutOfBoundsException; public E remove(int i) throws IndexOutOfBoundsException; public E set(int i, E e) throws IndexOutOfBoundsException;

Implementazione array list Una semplice soluzione basata su array L'array list viene implementato con un array A di N elementi e una variabile n < N che indica il numero di elementi nell'array list A[i] mantiene un riferimento all'elemento di indice i...... 0 1 2 i n - 1 N-1

Implementazione array list Una semplice soluzione basata su array L'array list viene implementato con un array A di N elementi e una variabile n < N che indica il numero di elementi nell'array list A[i] mantiene un riferimento all'elemento di indice i...... 0 1 2 i n - 1 N-1 Algorithm get(i): if i < 0 or i > n-1 then throw BoundaryViolationException return A[i]

Implementazione array list Una semplice soluzione basata su array L'array list viene implementato con un array A di N elementi e una variabile n < N che indica il numero di elementi nell'array list A[i] mantiene un riferimento all'elemento di indice i...... e 0 1 2 i n - 1 N-1 Algorithm remove(i): if i < 0 or i > n-1 then throw BoundaryViolationException e A[i] for j = i, i+1,..., n - 2 do A[j] A[j+1] n n - 1 return e

Implementazione array list Una semplice soluzione basata su array L'array list viene implementato con un array A di N elementi e una variabile n < N che indica il numero di elementi nell'array list A[i] mantiene un riferimento all'elemento di indice i...... 0 1 2 i n - 1 N-1 Algorithm remove(i): if i < 0 or i > n-1 then throw BoundaryViolationException e A[i] for j = i, i+1,..., n - 2 do A[j] A[j+1] n n - 1 return e tempo di esecuzione: Θ (n) nel caso pessimo (quando i=0)

Implementazione array list Una semplice soluzione basata su array L'array list viene implementato con un array A di N elementi e una variabile n < N che indica il numero di elementi nell'array list A[i] mantiene un riferimento all'elemento di indice i...... 0 1 2 i n - 1 N-1 Algorithm add(i, e): if i < 0 or i > n then throw BoundaryViolationException for j = n - 1, n - 2,..., i do A[i] e n n+1 A[j+1] A[j] // fa spazio al nuovo elemento

Implementazione array list Una semplice soluzione basata su array L'array list viene implementato con un array A di N elementi e una variabile n < N che indica il numero di elementi nell'array list A[i] mantiene un riferimento all'elemento di indice i...... e 0 1 2 i n - 1 N-1 Algorithm add(i, e): if i < 0 or i > n then throw BoundaryViolationException for j = n - 1, n - 2,..., i do A[i] e n n+1 A[j+1] A[j] // fa spazio al nuovo elemento tempo di esecuzione: Θ (n) nel caso pessimo (quando i=0)