Corso di Algoritmi e Strutture Dati con Laboratorio Java Collections Framework (II parte)

Slides:



Advertisements
Presentazioni simili
1 La Standard Template Library vettori, liste, mappe, …. find, replace, reverse, sort, …. puntatori intelligenti La libreria standard STL e una libreria.
Advertisements

Costruttori e Distruttori
Tipi di dato astratti Lista, Pila, Coda, Albero.
Estendere i linguaggi: i tipi di dato astratti
Strutture dati lineari
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
MultiSet, Liste Ordinate
Le gerarchie di tipi.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
UD 3: “Le Liste” UD 4: “Pile e Code” UD 5: “Alberi e grafi”
Lez. 121 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Progettazione.
Hash Tables Indirizzamento diretto Tabelle Hash Risoluzioni di collisioni Indirizzamento aperto.
Strutture dati elementari
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Liste.
1 Programmazione ad oggetti in Java E.Mumolo, DEEI
Allocazione dinamica della memoria
Astrazioni sul controllo Iteratori. 2 Nuove iterazioni Definendo un nuovo tipo come collezione di oggetti (p. es., set) si vorrebbe disporre anche di.
Array Struttura numerate di dati. Memorizzare molti dati In informatica cè spesso bisogno di memorizzare ed elaborare un insieme costituito da molti dati.
Algoritmi e Strutture Dati
memoria gestita staticamente:
Java Collections.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Tavole dinamiche Spesso non si sa a priori quanta memoria serve per memorizzare dei dati in un array, in una tavola hash, in un heap, ecc. Può capitare.
Corso di informatica Athena – Periti Informatici
RB-insert(T, z) // z.left = z.right = T.nil Insert(T, z) z.color = RED // z è rosso. Lunica violazione // possibile delle proprietà degli alberi // rosso-neri.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
© M. Badella, G. Malnati, L. Tessitore Programmazione ad Oggetti A.A Collezioni di dati in Java.
I nomi in Java F. Bombi 18 novembre novembre 2003.
Nota (rif. alla lezione precedente): Vector vs ArrayList Le classi generiche Vector e ArrayList sono sostanzialmente equivalenti, ma: I metodi.
Università degli Studi dell’Aquila
CORSO DI PROGRAMMAZIONE II Lezione 22
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
Implementazione di dizionari Problema del dizionario dinamico Scegliere una struttura dati in cui memorizzare dei record con un campo key e alcuni altri.
Heap concetti ed applicazioni. maggio 2002ASD - Heap2 heap heap = catasta condizione di heap 1.albero binario perfettamente bilanciato 2.tutte le foglie.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Università di Torino – Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a prof. Viviana Bono Blocco 7 – Array.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
Algoritmi e Strutture Dati Strutture Dati Elementari.
Liste di Interi Esercitazione. Una variante Liste concatenate di Integers Non modificabile Costruttori per creare la lista vuota o un nodo Metodi d’istanza.
ALLOCAZIONE STATICA: LIMITI Per quanto sappiamo finora, in C le variabili sono sempre dichiarate staticamente –la loro esistenza deve essere prevista e.
Liste Concatenate 11 Aprile E’ una delle strutture dati fondamentali in tutti i linguaggi di programmazione di alto livello Una Lista Concatenata.
Liste di Interi Esercitazione. IntList Lista di interi Una lista è una disposizione ordinata di elementi ( non in modo crescente-descrescente, ma per.
1 Strutture dati. 2 Astrazione Non vogliamo sapere l’organizzazione fisica dei dati  indirizzi e celle di memoria Ci interessa solo la loro organizzazione.
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
LIP: 11 Maggio 2007 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Esercitazione 14 Marzo Esercizio dell’altra volta Definire un tipo di dato Abbonato i cui oggetti descrivono le informazioni relative ad un abbonato.
1 Un esempio con iteratore: le liste ordinate di interi.
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
ADT 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 24 Introduzione ai.
Corso di Algoritmi e Strutture Dati con Laboratorio Richiami di Java – parte II.
Corso di Algoritmi e Strutture Dati con Laboratorio Java Collections Framework (I parte)
Corso di Algoritmi e Strutture Dati con Laboratorio Tipi di dato pila e coda.
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo Strutture dati di tipo astratto 19 Strutture dati,
Introduzione alle Classi e agli Oggetti in Java 1.
13. Strutture dati dinamiche Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
1 MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche classe 4° INDUSTRIALE INFORMATICA Focus on.
Transcript della presentazione:

Corso di Algoritmi e Strutture Dati con Laboratorio Java Collections Framework (II parte)

 Dove eravamo rimasti… A.A. 2015/ Draft2

 L’interfaccia List e le classi che la implementano: A.A. 2015/ Draft3

4  L’interfaccia List estende l’interfaccia Collection aggiungendo alcuni metodi relativi all’uso di indici  In ogni esemplare di una classe che implementa l’interfaccia List gli elementi sono memorizzati in sequenza, in base ad un indice  Vista come entità indipendente dal linguaggio di programmazione, una lista è un tipo di dato astratto

 Come sappiamo per uno stesso tipo di dato sono possibili diverse realizzazioni alternative basate su strutture dati diverse  In generale, la scelta di una particolare struttura dati consente un’implementazione delle operazioni richieste più o meno efficiente  L’efficienza dipende anche dal modo in cui i dati sono organizzati all’interno della struttura.  Un modo naturale per implementare una struttura dati che realizza un certo tipo di dato è scrivere una classe che ne implementa la corrispondente interfaccia A.A. 2015/ Draft5

 Tecniche fondamentali usate per rappresentare collezioni di elementi: ◦ Tecnica basata su strutture indicizzate (array) ◦ Tecnica basata su strutture collegate (record e puntatori) ◦ La scelta di una tecnica piuttosto che di un’altra può avere un impatto cruciale sulle operazioni fondamentali (ricerca, inserimento, cancellazione,...) A.A. 2015/ Draft6

 Proprietà di base degli array: 1. (Forte) Gli indici delle celle di un array sono numeri interi consecutivi ◦ Il tempo di accesso ad una qualsiasi cella è costante ed indipendente dalla dimensione dell’array 2. (Debole) Non è possibile aggiungere nuove celle ad un array ◦ Il ridimensionamento è possibile solo mediante la riallocazione dell’array, ossia la creazione di un nuovo array e la copia del contenuto dal vecchio al nuovo array Corso di Laboratorio di Algoritmi e Strutture Dati A.A. 2014/20157

 L’idea è quella di non effettuare riallocazioni ad ogni inserimento/cancellazione, ma solo ogni Ω(n) operazioni  Se h è la dimensione dell’array e le prime n>0 celle dell’array contengono gli elementi della collezione, la tecnica consiste nel mantenere una dimensione h che soddisfa, per ogni n>0, la seguente invariante: n ≤ h < 4n Corso di Laboratorio di Algoritmi e Strutture Dati A.A. 2014/20158

 L’invariante n ≤ h < 4n sulla dimensione dell’array viene mantenuta mediante riallocazioni così effettuate: ◦ Inizialmente, per n=0, si pone h=1 ◦ Quando n>h, l’array viene riallocato raddoppiandone la dimensione (h ← 2h) ◦ Quando n scende a h/4 l’array viene riallocato dimezzandone la dimensione (h ← h/2) Corso di Laboratorio di Algoritmi e Strutture Dati A.A. 2014/20159

 Nota teorica: Se v è un array di dimensione h≥n contenente una collezione non ordinata di n elementi, usando la tecnica del raddoppiamento- dimezzamento ogni operazione di inserimento o cancellazione di un elemento richiede tempo ammortizzato costante ◦ Previo eventuale raddoppiamento dell’array, l’inserimento si effettua in posizione n, e poi si incrementa n di 1 ◦ Per la cancellazione dell’elemento in posizione i, lo si sovrascrive con l’elemento in posizione n-1, decrementando n di 1 ed eventualmente dimezzando l’array Corso di Laboratorio di Algoritmi e Strutture Dati A.A. 2014/201510

 In Java un record può essere rappresentato in modo naturale mediante un oggetto  I numeri associati ai record sono i loro indirizzi in memoria  I record sono creati e distrutti individualmente ed in maniera dinamica, per cui gli indirizzi non sono necessariamente consecutivi  Un record viene creato esplicitamente dal programma tramite l’istruzione new, mentre la sua distruzione avviene in modo automatico quando non è più in uso (garbage collection)  Per mantenere i record di una collezione in relazione tra loro ognuno di essi deve contenere almeno un indirizzo di un altro record della collezione Corso di Laboratorio di Algoritmi e Strutture Dati A.A. 2014/201511

Proprietà:  (Forte) è possibile aggiungere o eliminare record ad una struttura collegata  (Debole) Gli indirizzi dei record di una struttura collegata non sono necessariamente consecutivi Corso di Laboratorio di Algoritmi e Strutture Dati A.A. 2014/201512

 La classe ArrayList realizza l’interfaccia List mediante un array  La classe LinkedList realizza l’interfaccia List mediante liste (doppiamente) collegate  Esempio: la classe RandomList crea e manipola un oggetto List contenente numeri interi casuali (RandomList.java) A.A. 2015/ Draft13

RandomList.java:  Avremmo potuto usare un enunciato for-each avanzato per scandire randList ? No, perché oltre a ispezionare la lista, eliminiamo alcuni elementi contenuti in essa.  La variabile randList è stata dichiarata come riferimento polimorfico e inizializzata con un riferimento ad un oggetto di tipo ArrayList.  Per eseguire nuovamente il programma usando un oggetto di tipo LinkedList l’unica modifica necessaria è l’invocazione del costruttore: List randList=new LinkedList (); A.A. 2015/ Draft14

 ArrayList è un'implementazione di List, realizzata internamente con un array dinamico  La rallocazione dell’array avviene in modo trasparente per l'utente  Il metodo size restituisce il numero di elementi effettivamente presenti nella lista, non la dimensione dell'array sottostante  Il ridimensionamento avviene in modo che l'operazione di inserimento ( add ) abbia complessità ammortizzata costante (per ulteriori informazioni sulla complessità ammortizzata, si consulti un testo di algoritmi e strutture dati) A.A. 2015/ Draft15

A.A. 2015/ Draft16

 I metodi permettono di utilizzare una LinkedList sia come stack sia come coda  Per ottenere il comportamento di uno stack (detto LIFO: last in first out), inseriremo ed estrarremo gli elementi dalla stessa estremità della lista ◦ ad esempio, inserendo con con addLast (o con add) ed estraendo con removeLast  Per ottenere, invece, il comportamento di una coda (FIFO: first in first out), inseriremo ed  estrarremo gli elementi da due estremità opposte A.A. 2015/ Draft17

 L'accesso posizionale (metodi get e set ) si comporta in maniera molto diversa in LinkedList rispetto ad ArrayList  In LinkedList, ciascuna operazione di accesso posizionale può richiedere un tempo proporzionale alla lunghezza della lista (complessità lineare)  In ArrayList, ogni operazione di accesso posizionale richiede tempo costante  Pertanto, è fortemente sconsigliato utilizzare l'accesso posizionale su LinkedList  Se l'applicazione richiede l'accesso posizionale, è opportuno utilizzare un semplice array, oppure la classe ArrayList A.A. 2015/ Draft18

 Una linked list è una struttura dati dinamica lineare in cui ogni elemento (detto nodo) è un oggetto separato  Ogni nodo è composto da due items: il dato ed un riferimento al nodo successivo  L’ultimo nodo ha un riferimento a null.  Il (riferimento al) primo nodo è detto “ head ” della lista. Se la lista è vuota head è un riferimento null. A.A. 2015/ Draft19

 In Java è possibile definire una classe (B) dentro un’altra classe (A)  La classe A è detta “outer class”, mentre la B è detta “nested class”  Ci sono due tipi di classi nested: ◦ static ◦ non-static (inner class)  NB: Le classi (non-static) “Inner” sono sottoinsiemi delle classi “nested” (anche dette static inner) A.A. 2015/ Draft20

 Una inner class B è un membro di A ed ha accesso agli altri membri (anche privati) di A. Viceversa la classe esterna A può accedere a tutti i membri della classe (not-static) inner.  Una nested class (static inner) non può fare riferimento direttamente alle variabili o metodi d’istanza definiti nella sua classe esterna: essa può usarli solo attraverso un object reference.  Una nested class può accedere solo ai membri statici di A. A.A. 2015/ Draft21

 In seguito definiamo una classe (my)LinkedList con due nested classes: static Node class and non-static LinkedListIterator class private static class Node { private AnyType data; private Node next; public Node(AnyType data, Node next){ this.data = data; this.next = next; } A.A. 2015/ Draft22

head = head.next; head.next = head.next.next; head.next.next.next.next = head; A.A. 2015/ Draft23

 addFirst crea un nodo e lo aggiunge all’inizio della lista: public void addFirst(AnyType item) { head = new Node (item, head); } A.A. 2015/ Draft24

 Traversing Iniziando da head (senza cambiare il riferimento) si accede ad ogni nodo fino a quando non si raggiunge null. Node tmp = head; while(tmp != null) tmp = tmp.next; A.A. 2015/ Draft25

A.A. 2015/ Draft26  addLast appende il nodo alla fine della lista. public void addLast(AnyType item) { if(head == null) addFirst(item); else { Node tmp = head; while(tmp.next != null) tmp = tmp.next; tmp.next = new Node (item, null); }

 Inserting "after“ (E) : Cerca un nodo contenente “key” ed inserisce un nuovo nodo dopo di esso. A.A. 2015/ Draft27

public void insertAfter(AnyType key, AnyType toInsert){ Node tmp = head; while(tmp!=null && !tmp.data.equals(key)) tmp = tmp.next; if(tmp!=null) tmp.next = new Node (toInsert,tmp.next); } A.A. 2015/ Draft28

 Inserting "before“ (A) cerca un nodo contenente “key” e inserisce un nuovo nodo prima di esso A.A. 2015/ Draft29

public void insertBefore(AnyType key, AnyType toInsert) { if(head == null) return null; if(head.data.equals(key)) { addFirst(toInsert); return; } Node prev = null; Node cur = head; while(cur != null && !cur.data.equals(key)) { prev = cur; cur = cur.next; } if(cur != null) prev.next = new Node (toInsert, cur); } A.A. 2015/ Draft30

 Deletion (A) Cerca un nodo contenente “key” e lo cancella. Ci sono tre casi particolari da gestire: 1. La lista è vuota 2. Bisogna cancellare il primo nodo 3. Il nodo non è in lista A.A. 2015/ Draft31

public void remove(AnyType key) { if(head == null) throw new RuntimeException("cannot delete"); if( head.data.equals(key) ) { head = head.next; return; } Node cur = head; Node prev = null; while(cur != null && !cur.data.equals(key) ) { prev = cur; cur = cur.next; } if(cur == null) throw new RuntimeException("cannot delete"); prev.next = cur.next; } A.A. 2015/ Draft32

 Iterator public Iterator iterator() { return new LinkedListIterator(); }  LinkedListIterator è una classe privata interna alla classe LinkedList A.A. 2015/ Draft33