Algoritmi e strutture dati Argomenti q Strutture dati

  • Slides: 34
Download presentation
Algoritmi e strutture dati Argomenti q Strutture dati elementari e loro implementazioni in Java:

Algoritmi e strutture dati Argomenti q Strutture dati elementari e loro implementazioni in Java: §Vettori §Liste §Stack (Pile) §Queue (Code) q Esempi di applicazione 30/04/2002 Algoritmi e strutture dati

Tipo di dato astratto q Tipo di dato astratto o ADT (Abstract Data Type):

Tipo di dato astratto q Tipo di dato astratto o ADT (Abstract Data Type): insieme di oggetti e insieme di operazioni definite su di esso q Es. : lista ordinata di elementi con le seguenti operazioni: § inserimento di un nuovo elemento § cancellazione dell’i-esimo elemento § test di lista vuota q Attenzione: l’ADT specifica cosa fa ogni operazione, non come q Un tipo di dato astratto è solitamente rappresentato in Java con un’interfaccia ed è implementato con una classe 30/04/2002 Algoritmi e strutture dati 2

Vettori q Memorizzazione di elementi omogenei in locazioni continue Array unidimensionali: Array bidimensionali: int[]

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

array e Vector array Classe Vector q Può contenere tipi di q Contiene Object.

array e Vector array Classe Vector q Può contenere tipi di q Contiene Object. I tipi di dati primitivi q Dimensione fissa q Pochi metodi ma maggiore efficienza 30/04/2002 dati primitivi devono essere convertiti mediante gli opportuni wrapper q Gestione flessibile dello spazio di memoria q Gran numero di metodi a scapito dell'efficienza Algoritmi e strutture dati 4

Esempi di utilizzo della classe Vector e dell’interfaccia Iterator Vector v = new Vector();

Esempi di utilizzo della classe Vector e dell’interfaccia Iterator Vector v = new Vector(); String st = br. read. Line(); // br Buffered. Reader while (st != null) { v. add. Element(st); st = br. read. Line(); } System. out. println(); Iterator it = v. iterator(); while (it. has. Next()) System. out. println(it. next()); 30/04/2002 Algoritmi e strutture dati 5

Vector di tipi di dato primitivi Vector v = new Vector(); String st =

Vector di tipi di dato primitivi Vector v = new Vector(); String st = br. read. Line(); // br Buffered. Reader while (st != null) { int num = Integer. parse. Int(st); v. add. Element(new Integer(num)); st = br. read. Line(); } System. out. println(); Iterator it = v. iterator(); while (it. has. Next()) System. out. println(it. next()); 30/04/2002 Algoritmi e strutture dati 6

Liste, stack e code in Java q Questi ADT sono rappresentati e implementati da

Liste, stack e code in Java q Questi ADT sono rappresentati e implementati da interfacce e classi del package java. util q L’interfaccia più generale è Collection § § Rappresenta un insieme di elementi, eventualmente replicati (multi-insieme) Ammette operazioni di inserimento e cancellazione Algoritmi e strutture dati 7

Tipo di dato Lista q Insieme di elementi tra i quali è definito un

Tipo di dato Lista q Insieme di elementi tra i quali è definito un ordinamento totale q Numerose varianti q Esempi di operazioni § § § 30/04/2002 insert(elem, i): inserisce elem in posizione i-esima remove(i): elimina l’i-esimo elemento della lista findkth(i): restituisce l’i-esimo elemento is. Empty: restituisce vero se la lista è vuota … Algoritmi e strutture dati 8

Implementazione delle liste q Tramite array q Tramite strutture collegate § ogni elemento contiene

Implementazione delle liste q Tramite array q Tramite strutture collegate § ogni elemento contiene un riferimento al successivo 30/04/2002 Algoritmi e strutture dati 9

Implementazione con array q Occorre conoscere la dimensione max della lista q Può portare

Implementazione con array q Occorre conoscere la dimensione max della lista q Può portare a spreco di memoria q Costo delle principali operazioni: § § § A 0 A 1 A 2 AN-3 AN-2 AN-1 insert: O(n) (caso peggiore: elemento in prima posizione) remove: O(n), (caso peggiore: primo elemento) findkth: O(1) Elemento non usato Inserimento in pos. 2 30/04/2002 Algoritmi e strutture dati 10

Implementazione con strutture collegate q Efficienza § insert, remove: O(i) (bisogna trovare la posizione

Implementazione con strutture collegate q Efficienza § insert, remove: O(i) (bisogna trovare la posizione dell’elemento da inserire/rimuovere). O(1) per inserimenti/cancellazioni in prima posizione § findkth: O(i) (posizione dell’elemento) A 0 Ai A 1 AN Inserimento in pos. 1 30/04/2002 Algoritmi e strutture dati 11

Liste in Java q Interfaccia List q Rappresenta una collezione ordinata di elementi q

Liste in Java q Interfaccia List q Rappresenta una collezione ordinata di elementi q Ammette duplicati q Implementazioni: classi Linked. List, Array. List e Vector 30/04/2002 Algoritmi e strutture dati 13

Liste in Java classe Linked. List classe Array. List q lista doppiamente q realizza

Liste in Java classe Linked. List classe Array. List q lista doppiamente q realizza lista concatenata; q riferimenti ai nodi di inizio e di fine 30/04/2002 mediante array q la dimensione può essere variata dinamicamente Algoritmi e strutture dati 14

Classe Linked. List q Linked. List: realizza una lista come generica lista doppiamente concatenata

Classe Linked. List q Linked. List: realizza una lista come generica lista doppiamente concatenata q Metodi principali: § § § Linked. List(): metodo costruttore void add( Object o): inserisce alla fine della lista void add. Last(Object o): inserisce alla fine della lista void add. First(Object o): inserisce in testa alla lista Object remove. First(): elimina all’inizio della lista Object remove. Last(): elimina alla fine della lista boolean remove(Object obj): rimuove l’oggetto obj se esiste Object remove(int pos): rimuove l’oggetto in posizione pos Object get. First(): ritorna il primo oggetto Object get. Last(): ritorna l’ultimo oggetto Object get(int pos): ritorna l’oggetto in posizione pos … Algoritmi e strutture dati 15

Classe Array. List q Corrisponde all’implementazione con array. Fornisce anche metodi per la modifica

Classe Array. List q Corrisponde all’implementazione con array. Fornisce anche metodi per la modifica delle dimensioni dell’array. q Metodi principali: § § § § § Array. List(): costruisce lista vuota Array. List(Collection col): costruisce lista da col void add(int pos, Object o): aggiunge in posizione pos void add. Last (Object o): aggiunge alla fine della lista boolean add. All(Collection col): aggiunge gli elementi di col alla fine della lista Object get(int pos): ritorno oggetto in posizione pos Object get. Last(): ritorna ultimo oggetto della lista Object remove(int pos): rimuove oggetto in posizione pos void ensure. Capacity(int min): aumenta la capacità dell’array fino a min int size(): ritorna la dimensione della lista … § 30/04/2002 Algoritmi e strutture dati 16

Classe Vector q Simile ad Array. List q Consigliabile usarla quando più thread accedono

Classe Vector q Simile ad Array. List q Consigliabile usarla quando più thread accedono alla stessa struttura dati § Vector è sincronizzato (argomento avanzato trattato in corsi futuri) q Metodi simili a quelli di Array. List 30/04/2002 Algoritmi e strutture dati 17

Tipo stack (o pila) q Lista nella quale inserimenti e cancellazioni avvengono solo in

Tipo stack (o pila) q Lista nella quale inserimenti e cancellazioni avvengono solo in coda (disciplina LIFO) q Operazioni § § § clear(): elimina tutti gli elementi dalla pila is. Empty(): verifica se la pila è vuota is. Full(): verifica se la pila è piena push(el): inserisce l'elemento specificato da el in cima alla pila pop(): elimina l'elemento in cima alla pila top. El(): restituisce l'elemento in cima alla pila senza eliminarlo dalla pila 30/04/2002 Algoritmi e strutture dati 18

Implementazione di stack q Array: realizzazione tramite Vector Ai top = i A 1

Implementazione di stack q Array: realizzazione tramite Vector Ai top = i A 1 A 0 q Liste: realizzazione tramite lista concatenata top Start AN 30/04/2002 AN-1 Ai A 0 Algoritmi e strutture dati 19

Implementazione tramite Vector public class Stack { private Vector pool = new Vector(); public

Implementazione tramite Vector public class Stack { private Vector pool = new Vector(); public Stack(){ } public Stack(int n){ pool. ensure. Capacity(n) ; } public void clear(){ pool. clear(); } public boolean is. Empty(){ 30/04/2002 return public Object top. El(){ return pool. last. Element(); } public Object pop(){ return pool. remove(pool. size()-1); } public void push (Object el){ pool. add. Element(el); } public String to. String(){ return pool. to. String(); } } Algoritmi e strutture dati 20

java. util. Stack (estende Vector) q Stack(): Crea una pila vuota q boolean empty():

java. util. Stack (estende Vector) q Stack(): Crea una pila vuota q boolean empty(): restituisce true se la pila è vuota q Object peek(): realizza l'operazione top. El() q Object pop(): rimuove e restituisce l'elemento affiorante q Object push(el): inserisce l'elemento specificato in cima alla pila q int search(el): restituisce la posizione di el all'interno della pila 30/04/2002 Algoritmi e strutture dati 21

Implementazione tramite Linked. List public class LLStack { private Linked. List list = new

Implementazione tramite Linked. List public class LLStack { private Linked. List list = new Linked. List(); public LLStack(){ } public void clear(){ list. clear(); } public boolean is. Empty(){ return list. is. Empty(); } 30/04/2002 public Object top. El(){ public Object pop(){ return list. remove. Last(); } public void push(Object el){ list. add(el); } public String to. String(){ return list. to. String(); } } NB: le Linked. List sono doppiamente collegate Algoritmi e strutture dati 22

Riconoscimento di stringhe parenteticamente corrette q La stringa vuota è parenteticamente corretta q Se

Riconoscimento di stringhe parenteticamente corrette q La stringa vuota è parenteticamente corretta q Se P 1, P 2 e P 3 sono corrette, allora lo è anche P 1(P 2)P 3 q Es. : § § ab(ax)((b)du(mb)) è corretta a(ax)(c e a)b(e non sono corrette 30/04/2002 Algoritmi e strutture dati 23

Algoritmo (usa uno stack) Algorithm string. Analyzer balanced = true; S = <Leggi la

Algoritmo (usa uno stack) Algorithm string. Analyzer balanced = true; S = <Leggi la stringa> c = <primo carattere di S> while ((! <fine di S>) && (balanced)) { if (c == ‘)’) { if (<stack vuoto>) balanced = false else pop() } if (c == ‘(’) push() c = <prossimo carattere di S> } if ((<fine di S) && (! <stack vuoto)) balanced = false return balanced ( ) ( ( Provare a implementare il riconoscimento con parentesi di qualunque tipo. Es. : - fg{([{ab(vc)g}kj])} è corretta - gh{(df[ghj]}gh)hj non è corretta Algoritmi e strutture dati 24

Tipo astratto coda (queue) q Lista nella quale gli inserimenti avvengono in coda e

Tipo astratto coda (queue) q Lista nella quale gli inserimenti avvengono in coda e le cancellazioni (estrazioni) in testa (disciplina FIFO) q Operazioni: § § § clear() is. Empty() is. Full() enqueue(el) dequeue() first. El() 30/04/2002 elimina tutti gli elementi dalla coda verifica se la coda è vuota verifica se la coda è piena inserisce l'elemento specificato da el alla fine della coda elimina il primo elemento della coda restituisce il primo elemento della coda senza eliminarlo dalla struttura Algoritmi e strutture dati 25

Implementazione di code con array A 0 A 1 A 2 AN-3 AN-2 AN-1

Implementazione di code con array A 0 A 1 A 2 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) 30/04/2002 Algoritmi e strutture dati 26

Implementazione di coda con Array circolare q first: q last: q size: indice del

Implementazione di coda con Array circolare q first: q last: q size: indice del primo elemento indice dell'ultimo numero di elementi dell'array public class Array. Queue { private int first, last, size; private Object[] storage; private static final int DEFAULTSIZE = 100; // metodi nella prossima slide 30/04/2002 Algoritmi e strutture dati 27

Implementazione di coda con Array circolare/2 public Array. Queue(){ this(DEFAULTSIZE); } public Array. Queue(int

Implementazione di coda con Array circolare/2 public Array. Queue(){ this(DEFAULTSIZE); } public Array. Queue(int n){ size = n; storage = new Object[size]; first = last = -1; } public boolean is. Full(){ return ((first == 0) && (last == size - 1)) || (first == last + 1); } public boolean is. Empty(){ Algoritmi e strutture dati 28

Implementazione di coda con Array circolare/3 public void enqueue(Object el){ if(!is. Full()) if ((last

Implementazione di coda con Array circolare/3 public void enqueue(Object el){ if(!is. Full()) if ((last == size - 1) || (last == -1)) { storage[0] = el; last = 0; if (first == -1) //caso coda vuota first=0; } else storage[++last] = el; } 30/04/2002 Algoritmi e strutture dati 29

Implementazione di coda con Array circolare/4 public Object dequeue(){ Object tmp = null; if(!is.

Implementazione di coda con Array circolare/4 public Object dequeue(){ Object tmp = null; if(!is. Empty()) { tmp = storage[first]; if (first == last) //caso unico elemento last = first = -1; else if (first == size - 1) first = 0; else first++; } return tmp; } 30/04/2002 Algoritmi e strutture dati 30

Implementazione di coda con Array circolare/5 public void print. All(){ if(is. Emtpy()) System. out.

Implementazione di coda con Array circolare/5 public void print. All(){ if(is. Emtpy()) 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(); } } 30/04/2002 Algoritmi e strutture dati } // fine classe Array. Queue 31

Implementazione di una coda con lista concatenata public class Queue. Node { protected Object

Implementazione di una coda con lista concatenata public class Queue. Node { protected Object info; protected Queue. Node next = null; public Queue. Node(Object el) { info = el; } } public class Queue { private Queue. Node head, tail; public Queue() { head = tail = null; } 30/04/2002 Algoritmi e strutture dati 32

Implementazione di una coda con lista concatenata/2 public boolean is. Empty() { return head

Implementazione di una coda con lista concatenata/2 public boolean is. Empty() { return head == null; } public void clear() { head = tail = null; } public Object first. El() { return head. info; } 30/04/2002 Algoritmi e strutture dati 33

Implementazione di una coda con lista concatenata/3 public void enqueue(Object el) { Queue. Node

Implementazione di una coda con lista concatenata/3 public void enqueue(Object el) { Queue. Node q = new Queue. Node(el); if (!is. Empty()) { tail. next = q; tail = tail. next; } else head = tail = q; } 30/04/2002 Algoritmi e strutture dati 34

Implementazione di una coda con lista concatenata/4 public Object dequeue() {// cancella il nodo

Implementazione di una coda con lista concatenata/4 public Object dequeue() {// cancella il nodo in // testa e restituisce il campo info if (!is. Empty()) { 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 30/04/2002 Algoritmi e strutture dati 35