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



Похожие документы
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Il tipo di dato astratto Pila

SOMMARIO Coda (queue): QUEUE. QUEUE : specifica QUEUE

QUEUE : considerazioni. QUEUE : considerazioni. QUEUE : esempio. QUEUE : esempio

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

GESTIONE INFORMATICA DEI DATI AZIENDALI

Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

dall argomento argomento della malloc()

La struttura dati ad albero binario

/** * VETTORE DINAMICO elementi */ private Vector elementi; /** * METODO COSTRUTTORE */ public coda() { elementi=new Vector(); }

ARRAY E STRINGHE. G. Frosini Slide 1

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Questi, invece, sono esempi di enunciati in cui esistono mancate corrispondenze:

I tipi di dato astratti

L ambizione dei design pattern (letteralmente schemi di programmazione) è quella di offrire soluzioni a problemi ricorrenti che facilitano lo

Oggetti Lezione 3. aspetti generali e definizione di classi I

Algoritmi di Ricerca. Esempi di programmi Java

SAPIENZA Università di Roma, Facoltà di Ingegneria

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Java Virtual Machine

ARRAY BIDIMENSIONALI float [][] mx = new float[3][4]; (float []) [] mx = new float[3][4];

Esercitazione 6. Tutor: Ing. Diego Rughetti. Anno Accademico 2007/2008

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Tipi di Dato Ricorsivi

Programmazione a Oggetti Lezione 10. Ereditarieta

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

GESTIONE DEI PROCESSI

Prossime lezioni. Dai TDA agli oggetti. Riassunto. Riassunto TDA. Oggi. Stefano Mizzaro 1

obiettivi di questa seconda metà del corso fare un passo avanti rispetto a :... meccanismi di composizione dei dati

PROGRAMMAZIONE AVANZATA JAVA E C. Massimiliano Redolfi. Lezione 7: Code, Stack, Liste PAJC. Ricerca. prof. Massimiliano Redolfi PAJC

Esempio su strutture dati dinamiche: ArrayList

Programmazione Orientata agli Oggetti in Linguaggio Java

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

I file di dati. Unità didattica D1 1

Esercizi sulla definizione di classi (Fondamenti di Informatica 1 Walter Didimo) Soluzioni

10 - Programmare con gli Array

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

Laboratorio di Algoritmi e Strutture Dati

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Synchronized (ancora)

Programmazione ad oggetti

Abstract Data Type (ADT)

Controllo degli accessi

esercizi Esercizi / problemi

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A Esercitazione. Programmazione Object Oriented in Java

Una funzione è detta ricorsiva se chiama, direttamente o indirettamente, se stessa. In C tutte le funzioni possono essere usate ricorsivamente.

Inizializzazione, Assegnamento e Distruzione di Classi

Esempio su strutture dati dinamiche: ArrayList

Corso di Laurea in Ingegneria Gestionale Esame di Informatica - a.a luglio 2013

costruttori e distruttori

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

Corso sul linguaggio Java

Archivio CD. Fondamenti di Programmazione

ARRAYLIST. Programmazione con Java ArrayList e Generics 2 08/06/2014. Daniela Micucci daniela.micucci@unimib.it

20 - Input/Output su File

Esercitazioni di Progettazione del Software. Esercitazione (Prova al calcolatore del 17 settembre 2010)

Programmazione Orientata agli Oggetti in Linguaggio Java

[MANUALE VISUAL BASIC SCUOLA24ORE PROF.SSA PATRIZIA TARANTINO] 14 dicembre 2008

Java threads (2) Programmazione Concorrente

Esempi di esercizi d esame

Esercizi della lezione 5 di Java

Esempio su strutture dati dinamiche: ArrayList

Pile (stacks) e code (queues)

Scope e visibilità per classi

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Corso Linguaggi di programmazione II - Unina Esercitazione (prova intercorso)

Programmazione Orientata agli Oggetti in Linguaggio Java

Calcolare il massimo di una lista

Le Liste. Elisa Marengo. Università degli Studi di Torino Dipartimento di Informatica. Elisa Marengo (UNITO) Le Liste 1 / 31

Le operazioni di allocazione e deallocazione sono a carico del sistema.

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 18 31/03/2014

Sottoprogrammi: astrazione procedurale

Ottava Esercitazione. introduzione ai thread java mutua esclusione

Gestione dinamica di una pila

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Allocazione dinamica della memoria - riepilogo

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a giugno 2013

Realizzazione di una classe con un associazione

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

3. La sintassi di Java

Транскрипт:

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

Argomenti della lezione Tipi di dato astratto Strutture dati elementari Liste o Implementazione di liste in Java Stack Code Esempi di applicazione 2

Tipo di dato astratto Tipo di dato astratto o ADT (Abstract Data Type): insieme di oggetti e insieme di operazioni definite su di esso Es.: lista con operazioni di inserimento e cancellazione Attenzione: l ADT specifica cosa fa ogni operazione, non come In Java: o Rappresentazione con interfaccia o Implementazione con classe 3

Tipo di dato Lista Insieme di elementi tra i quali è definito un ordinamento totale. Numerose varianti Ammette (almeno) le operazioni seguenti: cons(elem): inserisce elem in testa alla lista cdr(): elimina l elemento in testa alla lista car(): restituisce l elemento in testa alla lista senza eliminarlo Nelle implementazioni (es. Java) sono spesso presenti altre operazioni cons(elem, i), remove(i), get(i) 5

Liste in Java Questi ADT sono rappresentati e implementati da interfacce e classi del package java.util (in realtà strutture dati più ricche) L interfaccia più generale è Collection Rappresenta un insieme di elementi, eventualmente replicati (multinsieme) Ammette operazioni di inserimento e cancellazione 10

Liste in Java/2 Interfaccia List Rappresenta una collezione ordinata di elementi Ammette duplicati Implementazioni: classi LinkedList, ArrayList e Vector 11

Classe LinkedList Liste in Java/3 Classe ArrayList Realizza una lista doppiamente concatenata Puntatori a inizio e fine della lista Realizza lista mediante array Dimensione puo essere variata dinamicamente. 12

Classe LinkedList LinkedList: realizza una lista come generica lista doppiamente concatenata. Costruttore LinkedList LinkedList(): metodo costruttore Metodi principali: void add(object o): inserisce alla fine della lista void addfirst(object o): inserisce in testa alla lista Object removefirst(): elimina all inizio della lista Object removelast(): elimina alla fine della lista Object remove(int pos): rimuove l oggetto in posizione pos Object getfirst(): restituisce il primo oggetto Object getlast(): restituisce l ultimo oggetto Object get(int pos): restituisce l oggetto in posizione pos Iterator iterator(): restituisce un Iterator sulla lista 13

Classe ArrayList Corrisponde all implementazione con array Costruttore ArrayList ArrayList(): costruisce lista vuota Metodi principali: Simili a quelli di LinkedList Fornisce anche metodi per la modifica delle dimensioni dell array 14

Iteratori Sono oggetti che implementano l interfaccia Iterator Servono a scorrere sequenzialmente oggetti di tipo Collection (quindi anche liste) Esempio:... LinkedList mylist = new LinkedList();... myiterator = mylist.iterator(); 15

Iteratori/2 myiterator permette di scorrere gli elementi di mylist Metodi: Object next(): restituisce l elemento successivo della lista boolean hasnext(): vero se la lista contiene altri elementi void remove(): elimina dalla lista l elemento corrente E solamente un oggetto di ausilio per scorrere la lista Si può ovviamente scorrere la lista direttamente usando gli indici 16

Classe Vector E simile ad ArrayList I metodi sono simili a quelli di ArrayList E una classe sincronizzata E consigliabile usarla quando più thread accedono alla stessa struttura dati 17

Classe Vector/2 Array: Possono contenere tipi di dati primitivi Dimensione fissa Pochi metodi ma maggiore efficienza Classe Vector Contiene Object. I tipi di dati primitivi devono essere convertiti mediante gli opportuni wrapper. Gestione flessibile dello spazio di memoria. Gran numero di metodi a scapito dell'efficienza 18

Esempi di uso della classe Vector e dell interfaccia Iterator... Vector v = new Vector(); String st = br.readline(); // br BufferedReader while (st!= null) { v.addelement(st); st = br.readline(); System.out.println(); Iterator it = v.iterator(); while (it.hasnext()) System.out.println(it.next());... 19

Vector di tipi... di dato primitivi Vector v = new Vector(); String st = br.readline(); // br BufferedReader while (st!= null) { int num = Integer.parseInt(st); v.addelement(new Integer(num)); st = br.readline(); System.out.println(); Iterator it = v.iterator(); while (it.hasnext()) System.out.println(it.next());... 20

La classe java.lang.object Java definisce una classe speciale Object. Tutte le altre classi sono sottoclassi di Object. Ed è quindi la radice della gerarchia di classi Java E una classe abstract. 21

Metodi della classe Object /1 La classe Object definisce alcuni metodi di utilità, fra cui: public boolean equals(object obj) confronta il contenuto di this ed obj, restituendo true se sono equivalenti false in caso contrario. Viene ridefinito per implementare un concetto di uguaglianza relativo alla classe in cui è ridefinito. 22

Metodi della classe Object /2 public String tostring() restituisce una rappresentazione standard dell oggetto come stringa. Viene chiamato automaticamente quando si ottiene l output di un oggetto con println(). Molte classi ridefiniscono questo metodo in modo da ottenere una descrizione opportuna dei tipi di oggetto creati. 23

Metodi della classe Object /3 public Object clone() ritorna una copia dell oggetto. Deep cloning: copia in profondità i dati riferiti dai campi dell oggetto. Difficile da realizzare se si desidera mantenera la generalità sui dati memorizzati Shallow cloning: copia solo i riferimenti ai dati memorizzati nei campi, non gli oggetti stessi 24

Wrapper di tipi di dato primitivi Trasformano un tipo di dato primitivo in un oggetto. Object o = new Integer(5) Object p = new Character(c) Object q = new Double(5.0) Metodo parse per ottenere il tipo di dato primitivo dall oggetto int a = Integer.parseInt(o) double f = Double.parseDouble(q) Le stringhe sono considerate oggetti 25

Tipo astratto Pila Lista nella quale inserimenti e cancellazioni avvengono solo in testa (disciplina LIFO). Operazioni sempre presenti push(el): inserisce l'elemento specificato da el in cima alla pila pop(): elimina l'elemento in cima alla pila top(): restituisce l'elemento in cima alla pila senza cancellarlo dalla lista isempty(): verifica se la pila è vuota Altre operazioni clear(): elimina tutti gli elementi dalla pila 26

Implementazione del tipo Pila Realizzazione tramite Array A i top = i A 1 A 0 Liste: realizzazione tramite lista concatenata top Start A 0 A 1 A i A N 27

Implementazione asd_library asd_library.stack.stack 28

Implementazione tramite LinkedList public class LLStack { private list= new java.util.linkedlist(); public LLStack(){ public void clear(){ list.clear(); public boolean isempty(){ return list.isempty(); public Object topel(){ return list.getlast(); public Object pop(){ return list.removelast(); public void push(object el){ list.add(el); public String tostring(){ return list.tostring(); Attenzione: java.util.stack non realizza una vera pila (cisono operazioni in più) 29

Implementazione Java con Vector public class Stack { private java.util.vector pool= new java.util.vector(); public Stack(){ public Stack(int n){ pool.ensurecapacity(n) public void clear(){ pool.clear(); public boolean isempty(){ return pool.isempty(); public Object topel(){ return pool.lastelement(); public Object pop(){ return pool.remove(pool.size()-1); public void push(object el){ pool.addelement(el); 31

Tipo astratto coda Lista nella quale gli inserimenti avvengono in coda e le cancellazioni (estrazioni) in testa (disciplina FIFO) Operazioni sempre presenti clear(): elimina tutti gli elementi dalla coda isempty(): verifica se la coda è vuota enqueue(el): inserisce l'elemento specificato da el alla fine della coda dequeue(): elimina il primo elemento della coda firstel(): restituisce il primo elemento della coda senza eliminarlo 32

Implementazione di code con array A 0 A 1 A 2 A N-3 A N-2 A N-1 Elemento non usato testa coda enqueue -> coda = coda + 1 (mod N) dequeue -> testa = testa + 1 (mod N) Se (coda == testa 1 mod N) coda piena Se (coda == testa) coda vuota (un solo elemento presente) 33

Implementazione di coda con Array circolare first: indice del primo elemento - testa last: indice dell'ultimo - coda size: numero di elementi dell'array public class ArrayQueue { private int first, last, size; private Object[] storage; private static final int DEFAULTSIZE = 100; // metodi nella prossima slide 34

Implementazione di coda con Array circolare/2 public ArrayQueue(){ this(defaultsize); public ArrayQueue(int n){ size = n; storage = new Object[size]; first = last = -1; public boolean isfull(){ return ((first == 0) && (last == size - 1)) (first == last + 1); public boolean isempty(){ return first == -1; Algoritmi e strutture dati 35

Implementazione di coda con Array circolare/3 public void enqueue(object el){ if(!isfull()) if ((last == size - 1) (last == -1)) { storage[0] = el; last = 0; if (first == -1) //caso coda vuota first=0; else storage[++last] = el; 36

Implementazione di coda con Array circolare/4 public Object dequeue(){ Object tmp = null; if(!isempty()) { tmp = storage[first]; if (first == last) //caso unico elemento last = first = -1; else if (first == size - 1) first = 0; else first++; return tmp; 37

Implementazione di coda con Array circolare/5 public void printall(){ if(isemtpy()) System.out.println("Coda vuota."); else { int i = first; do { System.out.print(storage[i] + " "); i = (i + 1) % size; while(i!= ((last + 1) % size)); System.out.println(); // fine classe ArrayQueue 38

Implementazione asd_library asd_library.queue.queue 39

Riconoscimento di stringhe parenteticamente corrette La stringa vuota è parenteticamente corretta Se P 1, P 2 e P 3 sono corrette, allora lo è anche P 1 (P 2 )P 3, P 1 [P 2 ]P 3 o P 1 {P 2 P 3 Es.: ab(ax)[(b)du{(mb)] è corretta a(ax)[c e a){b(e non sono corrette 44

Algoritmo (solo un tipo di parentesi) Algorithm stringanalyzer balanced = true; S = <Leggi la stringa> c = <primo carattere di S> count = 0; while ((! <fine di S>) && (count >= 0)) { if (c == ( ) count++; else if (c == ) ) count--; c = <prossimo carattere di S> if ((fine di S) && (count!= 0)) Provare a implementare il riconoscimento con parentesi di qualunque tipo. Es.: - fg{([{ab(vc)gkj]) è corretta - gh{(df[ghj]gh)hj non è corretta balanced = false; 45

Algoritmo (caso generale) Usa uno stack Se arriva (, [ o { inseriscila nello stack Se arriva ), ] o confrontala con l elemento affiorante Se non corrispondono allora la stringa non è bilanciata Se si esamina la stringa fino alla fine e lo stack non è vuoto la stringa non è bilanciata. Es.: (((er[]) ( [ ( ) ] 46