La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Algoritmi e strutture dati Argomenti Strutture dati elementari e loro implementazioni in Java: Vettori Liste Stack (Pile) Queue (Code) Esempi di applicazione.

Presentazioni simili


Presentazione sul tema: "Algoritmi e strutture dati Argomenti Strutture dati elementari e loro implementazioni in Java: Vettori Liste Stack (Pile) Queue (Code) Esempi di applicazione."— Transcript della presentazione:

1 Algoritmi e strutture dati Argomenti Strutture dati elementari e loro implementazioni in Java: Vettori Liste Stack (Pile) Queue (Code) Esempi di applicazione

2 30/04/2002 Algoritmi e strutture dati2 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 ordinata di elementi con le seguenti operazioni: inserimento di un nuovo elemento cancellazione delli-esimo elemento test di lista vuota Attenzione: lADT specifica cosa fa ogni operazione, non come Un tipo di dato astratto è solitamente rappresentato in Java con uninterfaccia ed è implementato con una classe

3 30/04/2002 Algoritmi e strutture dati3 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; }

4 30/04/2002 Algoritmi e strutture dati4 array e Vector array Può 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

5 30/04/2002 Algoritmi e strutture dati5 Esempi di utilizzo della classe Vector e dellinterfaccia 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());

6 30/04/2002 Algoritmi e strutture dati6 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());

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

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

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

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

11 30/04/2002 Algoritmi e strutture dati11 Implementazione con strutture collegate Efficienza insert, remove: O(i) (bisogna trovare la posizione dellelemento da inserire/rimuovere). O(1) per inserimenti/cancellazioni in prima posizione findkth: O(i) (posizione dellelemento) A 0 A 1 A i A N Inserimento in pos. 1

12 30/04/2002 Algoritmi e strutture dati12 Altri tipi di lista Lista doppia: consente una scansione in entrambe le direzioni Lista circolare: consente di rappresentare strutture in cui lordinamento è mod N A 0 A 1 A i A N A 0 A 1 A i A N

13 30/04/2002 Algoritmi e strutture dati13 Liste in Java Interfaccia List Rappresenta una collezione ordinata di elementi Ammette duplicati Implementazioni: classi LinkedList, ArrayList e Vector

14 30/04/2002 Algoritmi e strutture dati14 Liste in Java classe LinkedList lista doppiamente concatenata; riferimenti ai nodi di inizio e di fine classe ArrayList realizza lista mediante array la dimensione può essere variata dinamicamente

15 Algoritmi e strutture dati15 Classe LinkedList LinkedList: realizza una lista come generica lista doppiamente concatenata Metodi principali: LinkedList LinkedList(): metodo costruttore void add( Object o): inserisce alla fine della lista void addLast(Object o): inserisce alla fine della lista void addFirst(Object o): inserisce in testa alla lista Object removeFirst(): elimina allinizio della lista Object removeLast(): elimina alla fine della lista boolean remove(Object obj): rimuove loggetto obj se esiste Object remove(int pos): rimuove loggetto in posizione pos Object getFirst(): ritorna il primo oggetto Object getLast():ritorna lultimo oggetto Object get(int pos): ritorna loggetto in posizione pos …

16 30/04/2002 Algoritmi e strutture dati16 Classe ArrayList Corrisponde allimplementazione con array. Fornisce anche metodi per la modifica delle dimensioni dellarray. Metodi principali: ArrayList ArrayList(): costruisce lista vuota ArrayList ArrayList(Collection col): costruisce lista da col void add(int pos, Object o): aggiunge in posizione pos void addLast (Object o): aggiunge alla fine della lista boolean addAll(Collection col): aggiunge gli elementi di col alla fine della lista Object get(int pos): ritorno oggetto in posizione pos Object getLast(): ritorna ultimo oggetto della lista Object remove(int pos): rimuove oggetto in posizione pos void ensureCapacity(int min): aumenta la capacità dellarray fino a min int size(): ritorna la dimensione della lista …

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

18 30/04/2002 Algoritmi e strutture dati18 Tipo stack (o pila) Lista nella quale inserimenti e cancellazioni avvengono solo in coda (disciplina LIFO) Operazioni clear(): elimina tutti gli elementi dalla pila isEmpty(): verifica se la pila è vuota isFull(): 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 topEl(): restituisce l'elemento in cima alla pila senza eliminarlo dalla pila

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

20 30/04/2002 Algoritmi e strutture dati20 Implementazione tramite Vector public class Stack { private Vector pool = new 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); } public String toString(){ return pool.toString(); }

21 30/04/2002 Algoritmi e strutture dati21 java.util.Stack (estende Vector) 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

22 30/04/2002 Algoritmi e strutture dati22 Implementazione tramite LinkedList public class LLStack { private LinkedList list = new 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(); } NB: le LinkedList sono doppiamente collegate

23 30/04/2002 Algoritmi e strutture dati23 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 Es.: ab(ax)((b)du(mb)) è corretta a(ax)(c e a)b(e non sono corrette

24 Algoritmi e strutture dati24 Algorithm stringAnalyzer balanced = true; S = c = while ((! ) && (balanced)) { if (c == )) { if ( ) balanced = false else pop() } if (c == () push() c = } if ((

25 30/04/2002 Algoritmi e strutture dati25 Tipo astratto coda (queue) Lista nella quale gli inserimenti avvengono in coda e le cancellazioni (estrazioni) in testa (disciplina FIFO) Operazioni: clear()elimina tutti gli elementi dalla coda isEmpty()verifica se la coda è vuota isFull() verifica se la coda è piena 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 dalla struttura

26 30/04/2002 Algoritmi e strutture dati26 Implementazione di code con array A0A0 A1A1 A2A2 A N-3 A N-2 A N-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)

27 30/04/2002 Algoritmi e strutture dati27 Implementazione di coda con Array circolare first:indice del primo elemento last:indice dell'ultimo 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

28 Algoritmi e strutture dati28 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; }

29 30/04/2002 Algoritmi e strutture dati29 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; }

30 30/04/2002 Algoritmi e strutture dati30 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; }

31 30/04/2002 Algoritmi e strutture dati31 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

32 30/04/2002 Algoritmi e strutture dati32 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; }

33 30/04/2002 Algoritmi e strutture dati33 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; }

34 30/04/2002 Algoritmi e strutture dati34 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; }

35 30/04/2002 Algoritmi e strutture dati35 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


Scaricare ppt "Algoritmi e strutture dati Argomenti Strutture dati elementari e loro implementazioni in Java: Vettori Liste Stack (Pile) Queue (Code) Esempi di applicazione."

Presentazioni simili


Annunci Google