Strutture dati elementari Moreno Marzolla Dip. di Scienze dell'Informazione Università di Bologna

Slides:



Advertisements
Presentazioni simili
Tipi di dato astratti Lista, Pila, Coda, Albero.
Advertisements

Estendere i linguaggi: i tipi di dato astratti
Strutture dati lineari
Strutture dati elementari
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
tipo astratto, implementazione, algoritmi
Algoritmi e Strutture Dati
1 © Alberto Montresor Algoritmi e Strutture Dati Capitolo 7 - Tabelle hash Alberto Montresor Università di Trento This work is licensed under the Creative.
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Nota (rif. alla lezione precedente): Vector vs ArrayList Le classi generiche Vector e ArrayList sono sostanzialmente equivalenti, ma: I metodi.
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.
Algoritmi e Strutture Dati Strutture Dati Elementari.
Prog21 Alberi binari (radicati e ordinati) Il figlio destro della radice La radice Il figlio sinistro della radice Il padre del nodo 5.
Tecniche Algoritmiche/1 Divide et Impera Moreno Marzolla
Statistiche d'ordine Moreno Marzolla Dip. di Scienze dell'Informazione Università di Bologna
Fondamenti di Informatica A - Massimo Bertozzi ALBERI E ALBERI BINARI DI RICERCA (BST)
Huffman Canonico: approfondimento. Come abbiamo visto, Huffman canonico ci permette di ottenere una decompressione più veloce e con un uso più efficiente.
Alberi Binari di Ricerca Moreno Marzolla Dip. di Scienze dell'Informazione Università di Bologna
Alberi Bilanciati di Ricerca Moreno Marzolla Dip. di Scienze dell'Informazione Università di Bologna
Code con priorità Moreno Marzolla Dip. di Scienze dell'Informazione Università di Bologna
Fondamenti di Informatica A - Massimo Bertozzi LE RAPPRESENTAZIONI CONCATENATE.
Union-Find Moreno Marzolla Dip. di Scienze dell'Informazione Università di Bologna
La codifica di Huffman Un'implementazione in C++ (parte del materiale è opera di Mark Nelson, Dr. Dobb’s Journal, Gennaio 1996)‏
Alberi. Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo Fosco Dora Drogo Dudo.
Gestione della memoria
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
Esercitazioni di Prog. II (esercizi su alberi ennari)
Progettare algoritmi veloci usando strutture dati efficienti
Progettare algoritmi veloci usando strutture dati efficienti
Il linguaggio C Strutture Moreno Marzolla
Dizionari alberi bilanciati.
Logica binaria Moreno Marzolla
Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi
Alberi binari Definizione Sottoalberi Padre, figli
B-alberi e alberi autoaggiustanti
Algoritmi Avanzati Prof.ssa Rossella Petreschi
K4 è planare? E K3,3 e K5 sono planari? Sì!
Algoritmi e Strutture Dati
per rappresentare grafi
Dizionari alberi bilanciati.
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Introduzione agli Algoritmi e alle Strutture Dati
Heapsort.
Schema generale, visita in ampiezza e profondità.
Alberi n-ary Lezioni di C.
APPUNTI SUL LINGUAGGIO C
Progettare algoritmi veloci usando strutture dati efficienti
APPUNTI SUL LINGUAGGIO C Implementazioni di Liste Concatenate
APPUNTI SUL LINGUAGGIO C Esercizi su File e Alberi Binari
Algoritmi e Strutture Dati
APPUNTI SUL LINGUAGGIO C
APPUNTI SUL LINGUAGGIO C Allocazione dinamica della memoria
Esercizio Dato un albero binario, definiamo altezza minimale di un nodo v la minima distanza di v da una delle foglie del suo sottoalbero, definiamo invece.
concetti ed applicazioni
Usando strutture dati nella piattaforma Java Collections Framework
Algoritmi e Strutture Dati
Ricerca 01/08/2019 package.
HeapSort Stesso approccio incrementale del selectionSort Tipo di dato
Ese 3 (del 3 Aprile 2003).
Transcript della presentazione:

Strutture dati elementari Moreno Marzolla Dip. di Scienze dell'Informazione Università di Bologna

Algoritmi e Strutture Dati2 Original work Copyright © Alberto Montresor, University of Trento ( Modifications Copyright © 2009, 2010, Moreno Marzolla, Università di Bologna This work is licensed under the Creative Commons Attribution-NonCommercial- ShareAlike License. To view a copy of this license, visit or send a letter to Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA.

Algoritmi e Strutture Dati3 Introduzione ● Tipo di dato astratto – Un modello matematico, dato da una collezione di valori e un insieme di operazioni ammesse su questi valori ● Tipo di dato primitivo – Forniti direttamente dal linguaggio – Esempi: int (+,-,*,/, %), boolean (!, &&, ||) ● Tipo di dato – “Specifica” e “implementazione” di un tipo di dato astratto – Specifica: “manuale d'uso”, nasconde i dettagli implementativi all'utilizzatore – Implementazione: realizzazione vera e propria

Algoritmi e Strutture Dati4 Strutture dati ● I dati sono spesso riuniti in insiemi detti strutture dati – sono caratterizzati più dall'organizzazione dei dati che dal tipo dei dati stessi – il tipo dei dati contenuti può essere parametrico (templates in C++, o generics in Java) ● Una struttura dati è composta da: – un modo sistematico di organizzare i dati – un insieme di operazioni per manipolare la struttura ● Alcune tipologie di strutture dati: – lineari / non lineari (presenza di una sequenza) – statiche / dinamiche (variazione di dimensione, contenuto) – omogenee / disomogenee (dati contenuti)

Algoritmi e Strutture Dati5 Esempio: Dizionario (Insieme dinamico) ● Struttura dati “generale”: insieme dinamico – Può crescere, contrarsi, cambiare contenuto – Operazioni base: inserimento, cancellazione, ricerca ● Esempio di specifica: public interface Dizionario { public void insert(Object e, Comparable k); public void delete(Comparable k); public Object search(Comparable k); }

Algoritmi e Strutture Dati6 Alcune possibili implementazioni Array ordinati ● search(Key k) – Cerca la chiave k mediante ricerca binaria – Costo: O(log n) ● insert(Key k, Item o) – Inserisci un nuovo elemento, spostando a destra di una posizione tutti gli elementi successivi – Costo: O(n) ● delete(Key k) – Cerca la chiave k mediante ricerca binaria – Elimina l'elemento contenente la chiave k, spostando a sinistra di una posizione tutti gli elementi successivi – Costo: O(n)

Algoritmi e Strutture Dati7 Alcune implementazioni possibili Liste concatenate (non ordinate) ● search(Key k) – Cerca la chiave k mediante ricerca sequenziale – Costo: O(n) ● insert(Key k, Item o) – Inserisci l'elemento all'inizio della lista – Costo complessivo: O(1) ● delete(Key k) – Cerca la chiave k mediante ricerca sequenziale (costo O(n)) – Elimina l'elemento (costo O(1)) – Costo complessivo: O(n)

Algoritmi e Strutture Dati8 Strutture dati elementari

Algoritmi e Strutture Dati9 Strutture collegate alcune implementazioni possibili ● Liste semplici ● Liste doppiamente concatenate ● Liste circolari con sentinella Dato List a Dato List a Dato List a Sentinella

Algoritmi e Strutture Dati10 Esempio asdlab.libreria.StruttureElem // Implementazione basata su lista circolare // SENZA sentinella public class StrutturaCollegata implements Dizionario { private Record list = null; private final class Record {... } public void insert(Object e, Comparable k) {... } public void delete(Comparable k) {... } public Object search(Comparable k) {... } }

Algoritmi e Strutture Dati11 Esempio asdlab.libreria.StruttureElem private final class Record { public Object elem; public Comparable chiave; public Record next; public Record prev; public Record(Object e, Comparable k) { elem = e; chiave = k; next = prev = null; }

Algoritmi e Strutture Dati12 Esempio asdlab.libreria.StruttureElem public void insert(Object e, Comparable k) { Record p = new Record(e, k); if (list == null) list = p.prev = p.next = p; else { p.next = list.next; list.next.prev = p; list.next = p; p.prev = list; } Costo: O(1) L'uso della sentinella eviterebbe la gestione di questo caso particolare Il nuovo elemento viene inserito immediatamente dopo la testa della lista

Algoritmi e Strutture Dati13 Esempio asdlab.libreria.StruttureElem public void delete(Comparable k) { Record p = null; if (list != null) for (p = list.next; ; p = p.next){ if (p.chiave.equals(k)) break; if (p == list) { p = null; break; } } if (p == null) throw new EccezioneChiaveNonValida(); if (p.next == p) list = null; else { if (list == p) list = p.next; p.next.prev = p.prev; p.prev.next = p.next; } Costo: O(n)

Algoritmi e Strutture Dati14 Esempio asdlab.libreria.StruttureElem public Object search(Comparable k) { if (list == null) return null; for (Record p = list.next; ; p = p.next){ if (p.chiave.equals(k)) return p.elem; if (p == list) return null; } Costo: O(n)

Algoritmi e Strutture Dati15 Stack ● Insieme dinamico in cui l’elemento rimosso dall’operazione di cancellazione è l'ultimo inserito – politica “Last In, First Out” (LIFO) ● Operazioni previste – void push(Item)# inserisce un elemento in cima – Item pop()# rimuove l'elemento in cima – Item top()# non rimuove; legge solamente – boolean isEmpty()

Algoritmi e Strutture Dati16 Stack ● Possibili utilizzi – Nei linguaggi con procedure: gestione dei record di attivazione – Nei linguaggi stack-oriented: ● Tutte le operazioni elementari lavorano prendendo uno-due operandi dallo stack e inserendo il risultato nello stack ● Es: Postscript, Java bytecode ● Possibili implementazioni – Tramite liste puntate doppie ● puntatore all'elemento top, per estrazione/inserimento – Tramite array ● dimensione limitata, overhead più basso

Algoritmi e Strutture Dati17 Esempio Stack Reverse Polish Notation (RPN) ● Espressioni aritmetiche in cui gli operatori seguono gli operandi; notazione usata ad es. nelle calcolatrici HP ● Esempio di funzionamento – push 77 – push 33 7 – push – push x15 7 – push +22 Contenuto dello stack (l'elemento in cima è quello di sinistra)

Algoritmi e Strutture Dati18 Interfaccia Pila asdlab.libreria.StruttureElem public interface Pila { /** * Verifica se la pila è vuota. */ public boolean isEmpty(); /** * Aggiunge l'elemento in cima */ public void push(Object e); /** * Restituisce l'elemento in cima */ public Object top(); /** * Cancella l'elemento in cima */ public Object pop(); }

Algoritmi e Strutture Dati19 Implementare una pila tramite array (metodo del raddoppiamento/dimenzzamento) public class PilaArray implements Pila { private Object[] S = new Object[1]; private int n = 0; public boolean isEmpty() { return n == 0; } public void push(Object e) {... } public Object top() {... } public Object pop() {... } }

Algoritmi e Strutture Dati20 PilaArray: metodo top() public Object top() { if (this.isEmpty()) throw new EccezioneStrutturaVuota("Pila vuota"); return S[n - 1]; } Costo: O(1)

Algoritmi e Strutture Dati21 PilaArray: metodo push() public void push(Object e) { if (n == S.length) { Object[] temp = new Object[2 * S.length]; for (int i = 0; i < n; i++) temp[i] = S[i]; S = temp; } S[n] = e; n = n + 1; } Costo:???

Algoritmi e Strutture Dati22 PilaArray: metodo pop() public Object pop() { if (this.isEmpty()) throw new EccezioneStrutturaVuota("Pila vuota"); n = n - 1; Object e = S[n]; if (n > 1 && n == S.length / 4) { Object[] temp = new Object[S.length / 2]; for (int i = 0; i < n; i++) temp[i] = S[i]; S = temp; } return e; } Costo: ???

Algoritmi e Strutture Dati23 Metodo del raddoppiamento/dimezzamento n 2n n n/4 n/2 Elemento aggiunto Elemento rimosso Quando il numero di elementi supera la capacità del vettore, il vettore viene raddoppiato Quando il numero di elementi diventa un quarto della dimensione del vettore, il vettore viene dimezzato

Algoritmi e Strutture Dati24 Analisi delle operazioni push() e pop() push()

Algoritmi e Strutture Dati25 Analisi delle operazioni push() e pop() pop()

Algoritmi e Strutture Dati26 Analisi delle operazioni push() e pop() ● Nel caso peggiore, entrambe sono O(n) ● Nel caso migliore, entrambe sono O(1) ● Partendo dallo stack vuoto, quanto costano n operazioni push() consecutive? – O(n) ● Partendo da uno stack con n elementi, quanto costano n operazioni pop() consecutive? – O(n) ● Partendo da uno stack con numero arbitrario di elementi, quanto costano k operazioni (arbitrarie) consecutive? – Analisi ammortizzata

Algoritmi e Strutture Dati27 Analisi ammortizzata: il metodo dei crediti ● Associamo a ciascun elemento della struttura dati un numero di crediti – Un credito può essere utilizzato per eseguire O(1) operazioni elementari ● Quando creo un elemento la prima volta, “pago” un certo numero di crediti ● Userò quei crediti per pagare ulteriori operazioni su quell'elemento, in futuro

Algoritmi e Strutture Dati28 Analisi ammortizzata delle operazioni push() e pop() ● L'inserimento di un elemento nello stack deposita 3 crediti sulla cella dell'array che viene usata ● Quando devo raddoppiare – Sottraggo 2 crediti dalle celle nella seconda metà dell'array (prima del raddoppio); – Uso questi crediti per “pagare” l'operazione di copia dei valori dall'array originale a quello “raddoppiato” ● Quando devo dimezzare – Sottraggo 1 credito dalle celle nel secondo quarto dell'array (prima del dimezzamento) – Uso questi crediti per “pagare” l'operazione di copia

Algoritmi e Strutture Dati29 Gli n/2 elementi pagano 2 crediti ciascuno Analisi ammortizzata n 2n Nuovo elemento aggiunto PRIMA DOPO

Algoritmi e Strutture Dati30 Gli n/4 elementi che erano presenti qui pagano 1 credito ciascuno Analisi ammortizzata n n/4 n/2 PRIMA DOPO

Algoritmi e Strutture Dati31 Esempio push( ) € € € € € € € € € €€ € € € € € €€€ € € € € € Raddoppiament o

Algoritmi e Strutture Dati32 Esempio (cont.) push( ) €€€ € € € € € € € € €€€€ € € € €€€€ € € € pop( ) €€€€ € € € Raddoppiament o

Algoritmi e Strutture Dati33 Esempio (cont.) €€€€ € € € pop( ) €€€€ Dimezzament o

Algoritmi e Strutture Dati34 Coda (Queue) ● Insieme dinamico in cui l’elemento rimosso dall’operazione di cancellazione è quello che da più tempo è presente – politica “first in, first out” (FIFO) ● Operazioni previste (tutte O(1)) – void enqueue(Item) – Item dequeue() – Item first() – boolean isEmpty()

Algoritmi e Strutture Dati35 Coda ● Possibili utilizzi – Nei sistemi operativi, i processi in attesa di utilizzare una risorsa vengono gestiti tramite una coda ● Possibili implementazioni – Tramite liste puntate semplici ● puntatore head (inizio della coda), per estrazione ● puntatore tail (fine della coda), per inserimento ● Esempio: classe CodaCollegata in asdlab.libreria.StruttureElem – Tramite array circolari ● dimensione limitata, overhead più basso tail head enqueue( ) dequeue( )

Algoritmi e Strutture Dati36 Queue: Implementazione tramite array circolari head tail tail enqueue(12) dequeue() -> tail head enqueue (15, 17, 33) head

Algoritmi e Strutture Dati37 Queue: Implementazione tramite array circolari (Java) public class Queue { private Object[] buffer = new int[MAX_SIZE]; private int head;// “Dequeuing” index private int tail;// “Enqueuing” index private int size;// Number of elements public Queue() { head = tail = size = 0; } public boolean isEmpty() { return size=0; } public Object head() { if (size == 0) throw new Exception(“Empty”); else return buffer[head]; } Costo: O(1)

Algoritmi e Strutture Dati38 Queue: Implementazione tramite array circolari (Java) public void enqueue(Object o) { if (size == buffer.length) throw new Exception(“Full”); buffer[tail] = o; tail =(tail+1) % buffer.length; size++; } public Object dequeue() { if (size == 0) throw new Exception(“Empty”); Object res = buffer[head]; head =(head+1) % buffer.length; size--; return res; } Costo: O(1)

Algoritmi e Strutture Dati39 Alberi radicati ● Albero: definizione informale – È un insieme dinamico i cui elementi hanno relazioni di tipo gerarchico ● Albero: definizione ricorsiva – Insieme vuoto di nodi, oppure – Una radice R e zero o più alberi disgiunti (detti sottoalberi), con la radice R collegata alla radice di ogni sottoalbero da un arco orientato T1T1 T2T2 TnTn R

Algoritmi e Strutture Dati40 Alberi binari radicati Radic e Parent(j) Padre di j (e di k) Figlio di R Figli del nodo a Left(a)Right(a) R a jk Sottoalber o destro Sottoalber o sinistro Fogli e

Algoritmi e Strutture Dati41 Alberi: definizioni ● La profondità di un nodo è la lunghezza del percorso dalla radice al nodo (numero archi attraversati) ● Livello: l'insieme dei nodi alla stessa profondità ● Altezza dell'albero: massima profondità ● Grado di un nodo: # figli p=0 Altezza albero: 3 p= 1 p=2 p=3 Livello 3

Algoritmi e Strutture Dati42 Alberi?

Algoritmi e Strutture Dati43 Operazioni sugli alberi ● numNodi() → intero ● grado(nodo v) → intero (numero di figli) ● padre(nodo v) → nodo ● figli(nodo v) → ● aggiungiNodo(nodo u) → nodo – Aggiunge un nuovo nodo v come figlio di u; restituisce v ● aggiungiSottoalbero(Albero a, nodo u) – Aggiunge il sottoalbero a in modo che la radice di a diventi figlia di u ● rimuoviSottoalbero(nodo v) → albero – stacca e restituisce il sottoalbero radicato in v

Algoritmi e Strutture Dati44 Algoritmi di visita degli alberi ● Visita (o attraversamento) di un albero: – Algoritmo per “visitare” tutti i nodi di un albero ● In profondità (depth-first search, DFS) – Vengono visitati i rami, uno dopo l’altro – Esistono tre varianti (pre-ordine, in-ordine, post-ordine) ● In ampiezza (breadth-first search, BFS) – A livelli, partendo dalla radice

Algoritmi e Strutture Dati45 Visita alberi binari in profondità pre-ordine Algoritmo visita-preordine(T) if ( T ≠ nil ) { Visita T visita-preordine(T.left()) visita-preordine(T.right()) } ● Nota: gli algoritmi di visita si possono facilmente generalizzare al caso di albero non binario a bc defg abdecfg

Algoritmi e Strutture Dati46 Visita alberi binari in profondità in-ordine (simmetrica) Algoritmo visita-inordine(T) if ( T ≠ null ) { visita-inordine(T.left()) Visita T visita-inordine(T.right()) } a bc defg dbeafcg

Algoritmi e Strutture Dati47 Visita alberi binari in profondità post-ordine Algoritmo visita-postordine(T) if ( T ≠ null ) { visita-postordine(T.left()) visita-postordine(T.right()) Visita T } a bc defg debfgca

Algoritmi e Strutture Dati48 Visita alberi binari: in ampiezza Algoritmo visita-ampiezza(T) q = new Queue() q.insert(T) while ( !q.empty() ) { p := q.dequeue() visita p if ( p.legt() != null ) then q.enqueue(p.left()); endif if ( p.right() != null) then q.enqueue(p.right()) endif } a bc defg abcdefg

Algoritmi e Strutture Dati49 Visita alberi binari: in ampiezza a bc dce defg a bc defg

Algoritmi e Strutture Dati50 Implementazione di alberi binari (strutture con puntatori) / / / / / / / / / / Nodo Padre Figlio Sinistro Figlio Destro

Algoritmi e Strutture Dati51 Alcune operazioni sugli alberi binari conteggio dei nodi Algoritmo numNodi(T) if (T == null) then return 0; else return 1 + numNodi(T.left()) + numNodi(T.right()); endif ● Quale è il costo computazionale di numNodi() ? ● È possibile modificare le strutture dati affinché numNodi() richieda tempo O(1)? – Quale è l'impatto di tale modifica sulla complessità computazionale delle altre operazioni che è possibile effettuare su un albero binario (es, aggiungere una foglia, fondere o separare alberi, ecc.)?

Algoritmi e Strutture Dati52 Implementazione di alberi generali: vettore padri P[ ] ● I nodi sono numerati da 0 a n-1 ● L'albero è rappresentato da un vettore P[], ove P[i] indica il padre del nodo i ● Per convenzione, si indica come padre della radice la radice stessa

Algoritmi e Strutture Dati53 Implementazione di alberi generali: array di figli // / / / / / / Nodo Padre Array di Figli / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / Rischio di sprecare memoria se molti nodi hanno grado minore del grado massimo k. / /

Algoritmi e Strutture Dati54 Implementazione di alberi generali: nodo fratello / / / / / / / / / / / / / / / / Primo Figlio Padre Fratello