Argomenti della lezione

Slides:



Advertisements
Presentazioni simili
Stringhe Operare con le stringhe con laiuto degli array.
Advertisements

String c++.
Tipi di dato astratti Lista, Pila, Coda, Albero.
Introduzione ad Array e Funzioni 2IC/2ID – a. s.2012/13.
Universita di Camerino
MultiSet, Liste Ordinate
Liste Ordinate 3 Maggio Ultima Lezione Abbiamo visto i tipi di dato astratti IntList e StringList Realizzano liste di interi e di stringhe Realizzati.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Algoritmi in C++ (1) da completare
STRUTTURE DATI e LABORATORIO II ESERCITAZIONE N°13 Heap massimo.
Allocazione dinamica della memoria
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Array Anno Accademico 2009/2010.
1 Corso di Informatica (Programmazione) Lezione 13 (21 novembre 2008) Programmazione in Java: stringhe e array.
Argomenti della lezione
Array Struttura numerate di dati. Memorizzare molti dati In informatica cè spesso bisogno di memorizzare ed elaborare un insieme costituito da molti dati.
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
Corso di informatica Athena – Periti Informatici
IL MASSIMO DI UN ARRAY ESERCIZIO
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
Corso JAVA Lezione n° 11 Istituto Statale di Istruzione Superiore “F. Enriques”
Ricerca sequenziale in un array di interi
s STRINGHE DI CARATTERI a p e \0
Metodologia Sperimentale Agronomica / Metodi Statistici per la Ricerca Ambientale Marco Acutis a.a CdS.
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.
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.
30/10/01Array 1  Un array e’ una struttura dati che contiene piu’ valori del medesimo tipo.  La lunghezza di un array e’ stabilita quando l’array viene.
I circuiti elettrici.
IL GOLD STANDARD: INTRODUZIONE
XXXII CONVEGNO NAZIONALE Società Italiana di Chimica Agraria
Campi di gravità e topografia: analisi con QGIS
Ciclo di Seminari e Corso
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
L’economia monetaria Corso di Economia delle Istituzioni Finanziarie
UN NUOVO MODO DI GUARDARE IL MONDO
ISTITUZIONI (regole scritte e nn scritte che governano l’interazione tra individui) → d.p. e contratti → norme sociali con appropriati Δ delle regole.
ATIPICITA’ DEL FATTORE UMANO NEL PILOTAGGIO DEI DRONI
RAEE è l’acronimo di Rifiuti da Apparecchiature Elettriche ed Elettroniche; ogni elettrodomestico ha un ciclo di vita terminato il quale, sia per malfunzionamento.
Appunti per ostetriche e non solo
Ricerca e innovazione:
IL CONFLITTO NELLA CHIESA PRIMITIVA
È possibile rendere comprensibile oggi questo termine filosofico, al di fuori della esigua cerchia degli specialisti? Io una volta ci ho provato in una.
PROGETTO RELAZIONI PREPOTENTI
Un reddito per tutti? Sette tesi su lavoro e welfare
ASSOCIAZIONE ITALIANA GIURISTI DI IMPRESA
L’evoluzione del Diritto delle Assicurazioni Continuità o rottura con il passato? Avv. Giuseppe Ranieri Studio Legale Tributario Ranieri Comitato Esecutivo.
ADOZIONE INTERNAZIONALE
e l’associazione in partecipazione
Profilo biografico e opere
Asl Vco – Direzione Generale
Assunzioni, Attività, Investimenti
PIANO DI RIORDINO PRESIDI DI FOLIGNO E SPOLETO
Associazione Sindrome X Fragile Puglia
Programmazione prevista Classi Prime, Seconde, Terza e Quarta
Pietro Cecchinato LA Politica Agricola Comunitaria
Analisi di Raggruppamento
Biblioteca Interdipartimentale di Chimica
Imposta personale e imposta societaria
Servizio Anestesia e terapia Intensiva Istituto Europeo di Oncologia
Transcript della presentazione:

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

Argomenti della lezione Tipi di dato astratto 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

Vettori 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(): 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

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(); .... 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 accedono alla stessa struttura dati

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

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

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.

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.

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.

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

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

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 asd_library asd_library.stack.Stack

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

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

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

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;

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 asd_library asd_library.queue.Queue

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