Argomenti della lezione

Slides:



Advertisements
Presentazioni simili
Argomenti della lezione
Advertisements

String c++.
Tipi di dato astratti Lista, Pila, Coda, Albero.
Algoritmi in C++ (1) da completare
1 Corso di Informatica (Programmazione) Lezione 13 (21 novembre 2008) Programmazione in Java: stringhe e array.
Type int_stack = struct { int top; int P[100]; } int_stack creapila() { int_stack s = new int_stack; s.top = 0; return s; } int_stack push(int_stack s,
Type int_stack = struct { int top; int P[100]; } int_stack creapila() { int_stack s = new int_stack; s.top = 0; return s; } int_stack push(int_stack s,
Java base III: Array e Stringhe
Algoritmi e strutture dati
Ricerca sequenziale in un array di interi
Metodologia Sperimentale Agronomica / Metodi Statistici per la Ricerca Ambientale Marco Acutis a.a CdS.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
AlgoLab - Pile e Code Pile e code Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro.
Università di Torino – Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a prof. Viviana Bono Blocco 7 – Array.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
XXXII CONVEGNO NAZIONALE Società Italiana di Chimica Agraria
Il problema dello zaino
ECONOMIA DELLE ISTITUZIONI FINANZIARIE
Stato di COMPASS Franco Bradamante CSN1 Roma, 16 luglio 2012.
La struttura dei materiali
ESSERE HOMELESS: PERCORSI DI VITA E FATTORI DETERMINANTI
Le verifiche empiriche del teorema di Heckscher-Ohlin: il paradosso di Leontief Wassily Leontief realizzò la prima verifica empirica del teorema di HO.
 π BUZZO GIACOMO D’AGOSTINO ALBERTO DE ANGELIS FEDERICA
La vitamina C è una molecola contenente C,H e O
Classificazione e Predizione
L’economia monetaria Corso di Economia delle Istituzioni Finanziarie
UN NUOVO MODO DI GUARDARE IL MONDO
LA PREVENZIONE INCENDI NELLE STRUTTURE RELIGIOSE APERTE AL PUBBLICO
Le unità territoriali per le analisi socio-economiche
ISTITUZIONI (regole scritte e nn scritte che governano l’interazione tra individui) → d.p. e contratti → norme sociali con appropriati Δ delle regole.
Convegno europeo sui minori
Ricerca e innovazione:
PROGETTO RELAZIONI PREPOTENTI
Vitamine Sono sostanze organiche a basso peso molecolare strutturalmente assai varie indispensabili per lo svolgimento delle funzioni vitali, di origine.
I PRINCIPI NUTRITIVI Quali sono, I test per individuarli &
Esame delle modifiche apportate al precedente ordinamento
Profilo biografico e opere
L’Imposta sul reddito delle società (IRES)
Assunzioni, Attività, Investimenti
Endometriosi profonda: quando la chirurgia
Nota AIFA 75 Determinazione 18 novembre 2010 (GU 29 novembre 2010, n. 279): modifiche, con riferimento alla nota AIFA 75,  alla determinazione del 4 gennaio.
PIANO DI RIORDINO PRESIDI DI FOLIGNO E SPOLETO
SINTOMI DEL BASSO APPARATO URINARIO 4 MARZO 2017
Associazione Sindrome X Fragile Puglia
Il fenomeno dei flussi migratori dal mondiale al locale
Corso di Laurea Magistrale in Produzioni agroalimentari e gestione degli agroecosistemi corso di Tecniche Irrigue Docente, PhD Giovanni Rallo telefono:
La politica dei dividendi
Pietro Cecchinato LA Politica Agricola Comunitaria
Corso di Astronomia avanzato 2014/15
di fronte alla materia in un nuovo stato
Biblioteca Interdipartimentale di Chimica
Il sistema della pena in Italia
Servizio Anestesia e terapia Intensiva Istituto Europeo di Oncologia
PROTOCOLLO AUTOVALUTAZIONE D’ISTITUTO
PART 1 – Copyright issues
Liceo delle Scienze Umane «BLAISE PASCAL» Voghera
Fasi della politica economica europea: dal dopoguerra all’Unione monetaria 1. Dopo la II guerra mondiale i principali paesi europei avviano un processo.
La fisica delle particelle elementari
Le Geometrie
SISTEMI COMPLESSI Equilibri dinamici Catena di eventi Butterfly effect.
LA VULNERABILITA’ DELLE FAMIGLIE INDEBITATE IN ITALIA
Rappresentazione dei campi di gravità
Testo di riferimento: materiale fornito dalla docente
Valutazione Antropologica Registrazione In Anagrafe Donazione Organi
La setta dei numeri Il teorema di Pitagora. La setta dei numeri Il teorema di Pitagora.
Gianni Betti | Università di Siena Alessandra Masi | Istat
Leonello Tronti (Istat) Università di Roma Tre, A.a
L’energia L’energia per definizione è la capacità di un corpo di compiere un lavoro. Il lavoro invece misura l’effetto utile di una forza con uno spostamento,
M. Piersanti (1,2), C. cesaroni(3), L. Spogli(3,5), T. Alberti(4), L
Dalle aspettative degli imprenditori un indicatore dell’incertezza economica Luciana Crosilla Solange Leproux 8 Maggio 2017.
Transcript della presentazione:

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

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: Rappresentazione con interfaccia Implementazione con classe

Array Memorizzazione di elementi omogenei in locazioni continue Array unidimensionali: int[] num; String[] str; Creazione: num = new int[5]; str = new String[6]; Lunghezza: num.length str.length Accesso al singolo elemento: a[0] = 100; str[1] = str[2]; Array bidimensionali: int[][] mat = new int[4][3]; for(int i = 0; i<4; i++){ mat[i][0] = i; mat[i][1] = i+1; mat[i][2] = i+2; }

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)

Implementazione delle liste Array Si usa un array in memoria Strutture collegate Ogni elemento contiene un riferimento al successivo

Implementazione con array Occorre conoscere la dimensione max della lista Può portare a spreco di memoria Costo delle principali operazioni: cons: O(n) (caso peggiore: elemento in prima posizione) cdr: O(n), (caso peggiore: primo elemento) car: O(1) A0 A1 A2 AN-3 AN-2 AN-1 Elemento non usato Inserimento in pos. 2

Implementazione con strutture collegate Efficienza cons, remove: O(i) (bisogna trovare la posizione dell’elemento da inserire/rimuovere). O(1) per inserimenti/cancellazioni in prima posizione get: O(i) (posizione dell’elemento cercato) A0 A1 Ai AN Inserimento in pos. 1

Altri tipi di lista Lista doppia: consente una scansione in entrambe le direzioni A0 A1 Ai AN Lista circolare: consente di rappresentare strutture in cui l’ordinamento è mod N A0 A1 Ai AN

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

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

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

Classe LinkedList LinkedList: realizza una lista come generica lista doppiamente concatenata. Costruttore LinkedList LinkedList(): 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

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

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

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

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

Classe Vector/2 Array: Classe Vector 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

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());

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()); ........

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

Implementazione del tipo Pila Realizzazione tramite Array Liste: realizzazione tramite lista concatenata A0 A1 Ai top = i A0 A1 Ai AN top Start

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);

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 (ci sono operazioni in più)

Implementazione tramite java.util.Stack Stack Stack(): Crea una pila vuota boolean empty(): restituisce true se la pila è vuota Object peek(): realizza l'operazione topEl() Object pop(): rimuove e restituisce l'elemento affiorante Object push(el): inserisce l'elemento specificato in cima alla pila int search(el):restituisce la posizione di el all'interno della pila

Tipo astratto coda Lista nella quale gli inserimenti avvengono in coda e le cancellazioni (estrazioni) in testa (disciplina FIFO) Operazioni sempre presenti 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 Altre operazioni clear(): elimina tutti gli elementi dalla coda

Implementazione di code con array AN-3 AN-2 AN-1 testa coda Elemento non usato 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)

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

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

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; }

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; // Restituisce null se coda vuota

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

Implementazione di una coda con lista concatenata public class QueueNode { protected Object info; protected QueueNode next = null; public QueueNode(Object el) { info = el; } public class Queue { private QueueNode head, tail; public Queue() { head = tail = null;

Implementazione di una coda con lista concatenata/2 public boolean isEmpty() { return head == null; } public void clear() { head = tail = null; public Object firstEl() { return head.info;

Implementazione di una coda con lista concatenata/3 public void enqueue(Object el) { QueueNode q = new QueueNode(el); if (!isEmpty()) { tail.next = q; tail = tail.next; } else head = tail = q;

Implementazione di una coda con lista concatenata/4 public Object dequeue() {// cancella il nodo in // testa e restituisce il campo info if (!isEmpty()) { Object el = head.info; if (head == tail) // un solo nodo? head = tail = null; else head = head.next; return el; } else return null; } // fine metodo dequeue } // fine classe Queue

Riconoscimento di stringhe parenteticamente corrette La stringa vuota è parenteticamente corretta Se P1, P2 e P3 sono corrette, allora lo è anche P1(P2)P3, P1[P2]P3 o P1{P2}P3 Es.: ab(ax)[(b)du{(mb)}] è corretta a(ax)[c e a){b(e} non sono corrette

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)) balanced = false; Provare a implementare il riconoscimento con parentesi di qualunque tipo. Es.: fg{([{ab(vc)g}kj])} è corretta gh{(df[ghj]}gh)hj non è corretta

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[]) ( [ ) ]