Algoritmi e Strutture Dati

Slides:



Advertisements
Presentazioni simili
Algoritmi e Strutture Dati
Advertisements

Strutture dati per insiemi disgiunti
1 La Standard Template Library vettori, liste, mappe, …. find, replace, reverse, sort, …. puntatori intelligenti La libreria standard STL e una libreria.
Algoritmi e Strutture Dati
Tipi di dato astratti Lista, Pila, Coda, Albero.
Strutture dati lineari
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
1 Semantica Operazionale di un frammento di Java: lo stato.
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
Le gerarchie di tipi.
LIP: 19 Aprile Contenuto Soluzione Compitino Tipo di dato MultiSet, estensione con sottoclasse.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Grafi Algoritmi e Strutture Dati. Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati 2/ed 2 Copyright © The McGraw.
UD 3: “Le Liste” UD 4: “Pile e Code” UD 5: “Alberi e grafi”
Lez. 91 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Alberi di ricerca.
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.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti ottimi.
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 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
Tail recursion: esempio
Capitolo 7 Tavole hash Algoritmi e Strutture Dati.
Astrazioni sul controllo Iteratori. 2 Nuove iterazioni Definendo un nuovo tipo come collezione di oggetti (p. es., set) si vorrebbe disporre anche di.
eliana minicozzi linguaggi1a.a lezione2
Algoritmi e Strutture Dati IV. Heap e Code di Priorità
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
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
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
memoria gestita staticamente:
Fondamenti di Informatica1 Realizzazione software Due fasi: 1. Specifica dell'algoritmo 1.a Definizione dei dati 1.b Definizione della modalità della loro.
Intelligenza Artificiale
Java Collections.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Tavole dinamiche Spesso non si sa a priori quanta memoria serve per memorizzare dei dati in un array, in una tavola hash, in un heap, ecc. Può capitare.
Scheda Ente Ente Privato Ente Pubblico. 2ROL - Richieste On Line.
Esercizio 10.* Un cassiere vuole dare un resto di n centesimi di euro usando il minimo numero di monete. a) Descrivere un algoritmo goloso per fare ciò.
15 maggio 2002 Avvisi: Ultima lezione: mercoledì 29 maggio II Esonero: mercoledì 5 giugno, ora da stabilire.
Algoritmi e strutture dati
Corso di informatica Athena – Periti Informatici
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti dispense prof. G. Levi.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Riconfigurare il diritto dautore. Lipertesto, una necessità di riconfigurazione. Secondo G. P. Landow, lavvento dellipertesto implica la necessità di.
14 marzo 2002 Avvisi:.
Nota (rif. alla lezione precedente): Vector vs ArrayList Le classi generiche Vector e ArrayList sono sostanzialmente equivalenti, ma: I metodi.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 5 Le strutture informative Corso di Informatica 2 a.a. 2003/04 Lezione 5.
1 Il Buffer Cache Unix (Bach: the Design of the Unix Operating System (cap: 3)
Algoritmi e Strutture Dati
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Pile e Code.
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.
Liste Concatenate 11 Aprile E’ una delle strutture dati fondamentali in tutti i linguaggi di programmazione di alto livello Una Lista Concatenata.
Ese 3 (del 3 Aprile 2003). Testo Progettare la specifica e l’implementazione del tipo di dato astratto modificabile Stack, supponendo che gli elementi.
Ese 3 (del 3 Aprile 2003). Testo Progettare la specifica e l’implementazione del tipo di dato astratto modificabile Stack, supponendo che gli elementi.
1 Strutture dati. 2 Astrazione Non vogliamo sapere l’organizzazione fisica dei dati  indirizzi e celle di memoria Ci interessa solo la loro organizzazione.
Corso di Algoritmi e Strutture Dati con Laboratorio Java Collections Framework (II parte)
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo Strutture dati di tipo astratto 19 Strutture dati,
1 MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche classe 4° INDUSTRIALE INFORMATICA Focus on.
Transcript della presentazione:

Algoritmi e Strutture Dati Capitolo 4 - Strutture di dati elementari Alberto Montresor Università di Trento This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/2.5/ or send a letter to Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA. © Alberto Montresor

Liste (List, Linked List) Una sequenza di nodi, contenenti dati arbitrari e 1-2 puntatori all'elemento successivo e/o precedente Contiguità nella lista ⇒ contiguità nella memoria Costo operazioni Tutte le operazioni hanno costo O(1) Realizzazione possibili Bidirezionale / monodirezionale Con sentinella / senza sentinella Circolare / non circolare © Alberto Montresor

Linked List - Altri esempi © Alberto Montresor

List - circolare, bidirezionale, con sentinella Nota: List e Pos sono tipi equivalenti © Alberto Montresor

List (Java) - bidirezionale senza sentinella class Pos { Pos succ; Pos pred; Object v; Pos(Object v) { succ = pred = null; this.v = v; } © Alberto Montresor

List (List (Java) - bidirezionale senza sentinella ) - senza sentinella public class List { /** First element of the list */ private Pos head; /** Last element of the list */ private Pos tail; public List() { head = tail = null; } public Pos head() { return head; } public Pos tail() { return tail; } public Pos next(Pos pos) { return (pos != null ? pos.succ : null); } public Pos prev(Pos pos) { return (pos != null ? pos.pred : null); } public boolean finished(Pos pos) { return pos == null; } public boolean isEmpty() { return head == null; } public Object read(Pos p) { return p.v; } public void write(Pos p, Object v) { p.v = v; } © Alberto Montresor

List (Java) - bidirezionale senza sentinella sentinella public Pos insert(Pos pos, Object v) { Pos t = new Pos(v); if (head == null) { // Insert in a emtpy list head = tail = t; } else if (pos == null) { // Insert at the end t.pred = tail; tail.succ = t; tail = t; } else { // Insert in front of an existing position t.pred = pos.pred; if (t.pred != null) t.pred.succ = t; else head = t; t.succ = pos; pos.pred = t; } return t; © Alberto Montresor

List (Java) - bidirezionale senza sentinella - senza sentinella public void remove(Pos pos) { if (pos.pred == null) head = pos.succ; else pos.pred.succ = pos.succ; if (pos.succ == null) tail = pos.pred; pos.succ.pred = pos.pred; } © Alberto Montresor

Liste - Realizzazione con vettori E’ possibile realizzare una lista con vettori Posizione ≡ indice nel vettore Le operazioni insert() e remove() hanno costo O(n) Tutte le altre operazioni hanno costo O(1) Problema Spesso non si conosce a priori quanta memoria serve per memorizzare la lista Se ne alloca una certa quantità, per poi accorgersi che non è sufficiente. Soluzione Si alloca un vettore di dimensione maggiore, si ricopia il contenuto del vecchio vettore nel nuovo e si rilascia il vecchio vettore Esempi: java.util.Vector (1.0), java.util.ArrayList (1.2) © Alberto Montresor

Vettori dinamici: espansione private Object[] buffer = new Object[INITSIZE]; // Utilizzato in ArrayList() private void doubleStorage() { Object[] newb = new Object[2*buffer.length]; System.arraycopy(buffer,0, newb,0, buffer.length); buffer = newb; } // Utilizzabile in Vector() private void incrementStorage() { Object[] newb = new Object[buffer.length+INCREMENT]; © Alberto Montresor

Vettori dinamici: espansione Domanda: Qual è il migliore fra i due? Dalla documentazione Java: “As elements are added to an ArrayList, its capacity grows automatically. The details of the growth policy are not specified beyond the fact that adding an element has constant amortized time cost.” Cosa significa? © Alberto Montresor

Vettori dinamici: contrazione Domande: Quanto costa rimuovere un elemento da una lista? Quanto costa rimuovere un elemento da un vettore non ordinato, evitando di lasciare “buchi”? Contrazione Per ridurre lo spreco di memoria di memoria è opportuno contrarre il vettore quando il fattore di carico α = size / capacity diventa troppo piccolo size: numero di elementi attualmente presenti capacity: dimensione del vettore Contrazione → allocazione, copia, deallocazione Domanda: Come scegliere il fattore di carico? © Alberto Montresor

Vettori dinamici: contrazione Prima strategia: Una strategia che sembra ovvia è dimezzare la memoria quando il fattore di carico α diventa ½ Questo ci assicura un fattore di carico α > ½ anche in presenza di cancellazioni Domanda: Dimostrare che questa strategia può portare ad un costo ammortizzato lineare © Alberto Montresor

Vettori dinamici: contrazione Qual è il problema? Che non abbiamo un numero di inserimenti/rimozioni sufficienti per ripagare le espansioni/contrazioni. Dobbiamo lasciar decrescere il sistema ad un fattore inferiore a α = ¼ Dopo un'espansione, il fattore di carico diventa ½ Dopo una contrazione, il fattore di carico diventa ½ Analisi ammortizzata: usiamo una funzione di potenziale che vale 0 all’inizio e subito dopo una espansione o contrazione cresce fino a raggiungere il numero di elementi presenti nella tavola quando α aumenta fino ad 1 o diminuisce fino ad ¼ © Alberto Montresor

Vettori dinamici: contrazione La funzione di potenziale: Alcuni casi esplicativi: α = ½ (subito dopo espansione/contrazione), Φ = 0 α = 1 (immediatamente prima di espansione), size=capacity quindi Φ = size α = ¼ (immediatamente prima di contrazione), capacity=4⋅size quindi Φ = size In altre parole: immediatamente prima di espansioni e contrazioni il potenziale è sufficiente per “pagare” il loro costo © Alberto Montresor

4 2 1 8 16 32 i size capacity 48 © Alberto Montresor

Vettori dinamici: contrazione Se α ≥ 1/2 il costo ammortizzato di un inserimento senza espansione è: mentre con espansione è: Altri casi per α e contrazione per esercizio © Alberto Montresor

politica “last in, first out” (LIFO) Stack Una pila (stack) è un insieme dinamico in cui l’elemento rimosso dall’operazione di cancellazione è predeterminato: “quello che per meno tempo è rimasto nell’insieme” politica “last in, first out” (LIFO) Operazioni previste (tutte realizzabili in O(1)) © Alberto Montresor

Nei linguaggi con procedure: gestione dei record di attivazione Stack Possibili utilizzi Nei linguaggi con procedure: gestione dei record di attivazione Nei linguaggi stack-oriented: Le operazioni elementari prendono uno-due operandi dallo stack e inseriscono il risultato nello stack Es: Postscript, Java bytecode Possibili implementazioni Tramite liste bidirezionali puntatore all'elemento top Tramite vettore dimensione limitata, overhead più basso top © Alberto Montresor

Reverse Polish Notation (PNG), o notazione postfissa Stack Reverse Polish Notation (PNG), o notazione postfissa Espressioni aritmetiche in cui gli operatori seguono gli operandi Definita dalla grammatica: <expr> ::= <numeral> | <expr> <expr> <operator> Esempi: (7 + 3) × 5 si traduce in 7 3 + 5 × 7 + (3 × 5) si traduce in 7 3 5 × + Valutazione PNG, stack based (esempio: Java bytecode) push 7 7 push 3 3 7 push 5 5 3 7 op. ×: pop, pop, push 15 7 op. +: pop, pop, push 22 © Alberto Montresor

Stack - pseudocodice © Alberto Montresor

Stack: implementazione tramite vettori (Java) public class VectorStack implements Stack { /** Vector containing the elements */ private Object[] A; /** Number of elements in the stack */ private int n; public VectorStack(int dim) { n = 0; A = new Object[dim]; } public boolean isEmpty() { return n==0; © Alberto Montresor

Stack: implementazione tramite vettori (Java) public Object top() { if (n == 0) throw new IllegalStateException("Stack is empty"); return A[n-1]; } public Object pop() { return A[--n]; public void push(Object o) { if (n == A.length) throw new IllegalStateException("Stack is full"); A[n++] = o; © Alberto Montresor

politica “first in, first out” (FIFO) Queue Una coda (queue) è un insieme dinamico in cui l’elemento rimosso dall’operazione di cancellazione è predeterminato: “quello che per più tempo è rimasto nell’insieme” politica “first in, first out” (FIFO) Operazioni previste (tutte realizzabili in O(1)) © Alberto Montresor

Possibili implementazioni Tramite liste monodirezionali Queue Possibili utilizzi Nei sistemi operativi, i processi in attesa di utilizzare una risorsa vengono gestiti tramite una coda La politica FIFO è fair Possibili implementazioni Tramite liste monodirezionali puntatore head (inizio della coda), per estrazione puntatore tail (fine della coda), per inserimento Tramite array circolari dimensione limitata, overhead più basso head tail © Alberto Montresor

Coda: Realizzazione tramite vettore circolare La “finestra” dell’array occupata dalla coda si sposta lungo l’array! Dettagli implementativi L'array circolare può essere implementato con un'operazione di modulo Bisogna prestare attenzione ai problemi di overflow (buffer pieno) head+n 3 6 54 43 head 54 6 head 3 43 head+n © Alberto Montresor

Coda: Realizzazione tramite vettore circolare head+n 3 6 54 43 head+n head enqueue(12) 3 6 54 43 12 head head+n dequeue() → 3 6 54 43 12 head head+n enqueue (15, 17, 33) 33 6 54 43 12 15 17 head © Alberto Montresor

Coda - pseudocodice © Alberto Montresor

Queue: Implementazione tramite array circolari (Java) public class VectorQueue implements Queue { /** Vector containing the elements */ private Object[] A; /** Number of elements in the queue */ private int n; /** Top element of the queue */ private int head; public VectorQueue(int dim) { n = 0; head = 0; A = new Object[dim]; } public boolean isEmpty() return n==0; © Alberto Montresor

Queue: Implementazione tramite array circolari (Java) public Object top() { if (n == 0) throw new IllegalStateException("Queue is empty"); return A[head]; } public Object dequeue() { Object t = A[head]; head = (head+1) % A.length; n = n-1; return t; public void enqueue(Object v) if (n == A.length) throw new IllegalStateException("Queue is full"); A[(head+n) % A.length] = v; n = n+1; © Alberto Montresor