Algoritmi e Strutture Dati

Documenti analoghi
Algoritmi e Strutture di Dati

Algoritmi e Strutture di Dati

Liste. Costo operazioni Tutte le operazioni hanno costo O(1)

Strutture dati elementari

Alberto Montresor Università di Trento

Algoritmi e Strutture Dati Laboratorio 20/10/2008. Prof. Pier Luca Lanzi

Strutture dati elementari

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati. Alberi

Tipi di dato e Strutture dati elementari

Algoritmi e Strutture Dati. Alberi

Alberi Binari Alberi Binari

Laboratorio di Programmazione

Algoritmi e Strutture Dati. Strutture di dati

Algoritmi e Programmazione Avanzata. Pile e code. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

Pile e code. Sommario. Algoritmi e Programmazione Avanzata. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

Informatica 3. LEZIONE 13: Liste doppie, pile e code. Modulo 1: Free list Modulo 2: Lista doppia Modulo 3: Pila Modulo 4: Coda

Algoritmi e Strutture Dati. Strutture Dati Elementari

Liste concatenate. Collezione ordinata di nodi. Carlo Paolo Simona. Anna. ciascun nodo contiene due riferimenti:

Alberi. Definizione, realizzazione e algoritmi elementari. Ugo de' Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 7

SOMMARIO STACK. STACK: specifica STACK

Algoritmi e Strutture Dati. Capitolo 3 Strutture dati elementari

Informatica 3. Informatica 3. LEZIONE 13: Liste doppie, pile e code. Lezione 13 - Modulo 1. Free list (2) Free list. Free list

Heap e Code di Priorità

In questa lezione Strutture dati elementari: Pila Coda Loro uso nella costruzione di algoritmi.

Laboratorio di Programmazione

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione

Binari di Ricerca Binary. Alberi. Trees. Search. Damiano Macedonio Università Ca' Foscari di Venezia.

Fondamenti di Informatica II

Laboratorio di Programmazione

Alberi ed Alberi Binari

Algoritmi e Strutture Dati. Alberi

Orario delle lezioni LABORATORIO TEORIA. mercoledì. martedì aula P/4. lab Turing. Strutture Dati

Alberi Binari di Ricerca

heap heap heap? max- e min-heap concetti ed applicazioni heap = catasta condizione di heap non è una struttura ordinata

Code con priorità. Moreno Marzolla Dip. di Scienze dell'informazione Università di Bologna.

La struttura dati CODA

Questa soluzione va contemplata quando le lunghezze stimate dalle liste usate sono significativamente maggiori delle dimensioni di un elemento.

Strutture dati elementari. Vittorio Maniezzo - Università di Bologna

Algoritmi e Strutture Dati. Capitolo 3 Strutture dati elementari

tipi di dato astratti

Algoritmi e Strutture di Dati

Algoritmi e Strutture Dati. Strutture Dati Elementari

Fondamenti di Informatica e Laboratorio T-AB T-15 Strutture dati

Esercitazione 7. Grafi. Rappresentazione e algoritmi di visita

Pile e code. ADT e strutture dati per la rappresentazione di sequenze ad accesso LIFO e FIFO

Metodi di una Collection

Strutture dati elementari

Implementazione ADT: Alberi

PILE E CODE. Pile (stack):

10/10/2016. Caratteristiche degli array. Il tipo RECORD. Il record. LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica

Algoritmi e strutture dati

Tipi di dati astratti

Esercitazione: Implementazione in linguaggio C dell ADT. Stack con l utilizzo. di linked list

Esercitazione 8. Corso di Tecniche di programmazione. Laurea in Ingegneria Informatica

Informatica 3. Informatica 3. LEZIONE 14: Alberi binari: introduzione. Lezione 14 - Modulo 1. Definizioni. Introduzione. Definizioni e proprietà

Alberi ( GT. 7 ) In informatica, un albero è un modello astratto con cui viene rappresentata una struttura gerarchica

Algoritmi e Strutture di Dati

Ordinamento. Lorenzo Donatiello,Moreno Marzolla Dip. di Scienze dell'informazione Università di Bologna

Argomenti della lezione. Tipo di dato astratto. Array. Tipo di dato Lista. Liste Implementazione di liste in Java Stack Code

Alberi. Cosa sono gli alberi? Strutture gerarchiche di ogni tipo. Definizione, realizzazione e algoritmi elementari. Generale.

lezione 9 min-heap binario Heap e Alberi posizionali generali

tipi di dato astratti

Pile e Code. Definiamo una collezione come un gruppo di oggetti, detti gli elementi della collezione.

alberi tipo astratto, implementazione, algoritmi

algoritmi e strutture di dati

ADT: Abstract Data Type. Quasi ADT. ADT per collezioni di dati (code generalizzate) 04 I tipi di dati astratti (I parte)

Il linguaggio C Strutture

Programmazione Orientata agli Oggetti in Linguaggio Java

Insiemi Dinamici. Operazioni tipiche (S:struttura, x: riferimento(puntatore) alla chiave, k: chiave)

Strutture dati Alberi binari

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

argomenti alberi terminologia tipo di dato astratto albero tipo astratto, implementazione, algoritmi es.: radice R con n sottoalberi radice

Informatica 3. LEZIONE 12: Liste. Modulo 1: ADT lista e implementazione basata su array Modulo 2: Lista concatenata

Programmazione Orientata agli Oggetti in Linguaggio Java

Esercizi parte 3. La classe ArrayBinTree dovra implementare, tra le altre, l operazione seguente: padre: dato un nodo, restituire l indice del padre.

Organigramma Gerarchia. (Tree) Nessuna persona può avere più di un superiore Ogni persona può essere superiore di altre

ALBERI : introduzione SOMMARIO ALBERI ALBERI. ALBERI: introduzione ALBERI BINARI: introduzione VISITE RICORSIVE DI ALBERI

Alberi e alberi binari I Un albero è un caso particolare di grafo

Alberi n-ari: specifiche sintattiche e semantiche. Realizzazioni. Visita di alberi n-ari.

Programmazione Orientata agli Oggetti in Linguaggio Java

Lezione 15 programmazione in Java. Nicola Drago Dipartimento di Informatica Università di Verona

Programmazione Orientata agli Oggetti in Linguaggio Java

STRUTTURE DATI: OLTRE GLI ARRAY LISTE

Alberi binari e alberi binari di ricerca

Grafi non orientati. Grafi (non orientati) Rappresentazione di Grafi: matrice delle adiacenze. Tipiche applicazioni di modelli basati su grafi

Code a priorità Una coda a priorità è una struttura dati astratta che permette di rappresentare un insieme di elementi su cui è definita una

Francesco Sacchi. Embedded data structures. Firenze, 24 Settembre 2012

Alberi binari e alberi binari di ricerca

Sommario. Le strutture dati elementari per implementare sequenze: Vettori Liste

Alberi ed Alberi Binari di Ricerca

Programmazione Orientata agli Oggetti in Linguaggio Java

Alberi e alberi binari I Un albero è un caso particolare di grafo

Il vettore e la lista concatenate (o catena) sono due esempi di strutture interne.

Transcript:

Algoritmi e Strutture Dati Strutture 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. 1

Introduzione Dato In un linguaggio di programmazione, un dato è un valore che una variabile può assumere Tipo di dato astratto Un modello matematico, dato da una collezione di valori e un insieme di operazioni ammesse su questi valori Tipi di dato primitivi Forniti direttamente dal linguaggio Esempi: int (+,-,*,/, %), boolean (!, &&, ) 2

Tipi di dati Specifica e implementazione di un tipo di dato astratto Specifica: manuale d'uso, nasconde i dettagli implementativi all'utilizzatore Implementazione: realizzazione vera e propria Esempi Numeri reali vs IEEE754 Stack vs Stack basati su Array, Stack basati su puntatori java.util.map vs java.util.treemap 3

Strutture dati I dati sono spesso riuniti in insiemi detti strutture dati sono particolari tipi di dato, caratterizzati più dall'organizzazione dei dati più che dal tipo dei dati stessi il tipo dei dati contenuti può essere addirittura parametrico Una struttura dati è composta quindi da: un modo sistematico di organizzare i dati un insieme di operatori che permettono di 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) 4

Insiemi dinamici Struttura dati generale : insieme dinamico Può crescere, contrarsi, cambiare contenuto Operazioni base: inserimento, cancellazione, ricerca Il tipo di insieme (= struttura) dipende dalle operazioni Elementi Elemento: oggetto puntato da un riferimento/puntatore Composto da: campo chiave di identificazione dati satellite campi che fanno riferimento ad altri elementi dell'insieme 5

Insiemi dinamici Operazioni di interrogazione Item search(key k) Item successor(item x) Item predecessor(item x) Item minimum() Item maximum() Operazioni di modifica void insert(item x) void delete(item x) 6

Linked List Liste puntate (Linked List) Una sequenza di nodi, contenenti dati arbitrari e 1-2 reference (puntatori, link) all'elemento successivo e/o precedente. Struttura dati autoreferenziale contiene link a dati aventi la stessa struttura Tipo di accesso Liste Array Random O(n) O(1) Inserimento O(1) O(n) Cancellazione O(1) O(n) 7

Linked List Liste puntate semplici head data data data Liste puntate doppie head tail data data data Liste circolari (semplici, doppie) data data data Liste con sentinella data nil data data data data nil 8

Linked List (Java) class Node { ListItem next; ListItem prev; Key key; Object data; } ListItem(Key key, Object data) { next = prev = null; this.key = key; this.data = data; } 9

Linked List (Java) public class List { private ListItem head, tail; public List() { head = tail = null } public gethead() { return head; } public gettail() { return tail; } public successor(listitem where) { return where.next; } public predecessor(listitem where) { return where.prev; } 10

Linked List (Java) public void inserthead(listitem i) { if (head == null) { head = tail = i; } else { i.next = head; head.prev = i; head = i; } } public void inserttail(listitem i) { if (head == null) { head = tail = i; } else { i.prev = tail; tail.prev = i; tail = i; } } 11

Linked List (Java) public List search(key key) { ListItem i = head; while (i!= null && i.key!= key) i = i.next; return i; } public List delete(listitem i) { if (i.prev == null) head = i.next; else i.prev.next = next; if (i.next == null) tail = i.prev; else i.next.prev = prev; } 12

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 O(1)) void push(item) # inserisce un elemento Item pop() # rimuove l'ultimo elemento Item top() # non rimuove l'item; legge solamente boolean isempty() 13

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 top Tramite liste puntate doppie puntatore all'elemento top, per estrazione/inserimento Tramite array dimensione limitata, overhead più basso 14

Stack Reverse Polish Notation (PNG), o notazione postfissa Espressioni aritmetiche in cui gli operatori seguono gli operandi Definita dalla grammatica: <expr> ::= <numeral> <espr> <espr> <operator> Esempi: (7 + 3) x 5 si traduce in 7 3 + 5 x 7 + 3 x 5 si traduce in 7 3 5 x + Esempio di funzionamento push 7 7 push x 15 7 push 3 3 7 push + 22 push 5 5 3 7 15

Stack: implementazione tramite array (Java) public class Stack { private Object[] buffer = new int[max_size]; private int size; // Number of elements public Stack() { size = 0; } public boolean isempty() { return size=0; } public Object top() { if (size == 0) throw new Exception( Empty ); else return buffer[size-1]; } 16

Stack: implementazione tramite array (Java) } public void push(object o) { if (size < array.length) throw Exception( Full ); buffer[size++] = o; } public Object pop() { if (size == 0) throw new Exception( Empty ); return buffer[--size]; } 17

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 O(1)) void enqueue(item) # sinonimi: put, add, insert Item dequeue() # sinonimi: removefirst, extract Item head() # non rimuove l'item; sinonimi get boolean isempty() 18

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 head tail Tramite liste puntate semplici necessari puntatore head (inizio della coda), per estrazione puntatore tail (inizio della coda), per inserimento Tramite array circolari dimensione limitata, overhead più basso 19

Queue: Implementazione tramite array circolari tail 3 6 54 43 head tail enqueue(12) 3 6 54 43 12 head tail dequeue() -> 3 6 54 43 12 head tail enqueue (15, 17, 33) 33 6 54 43 12 15 17 head 20

Queue: Implementazione tramite array circolari 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) 3 6 54 43 54 head head 36 43 tail tail 21

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]; } 22

Queue: Implementazione tramite array circolari (Java) } public void enqueue(object o) { if (size == array.length) throw Exception( Full ); buffer[tail] = o; tail =(tail+1) % array.length; size++; } public Object dequeue() { if (size == 0) return null; Object res = buffer[head]; head =(head+1) % array.length; size--; return res; } 23

Alberi radicati Albero: definizione informale E un insieme dinamico i cui elementi hanno relazioni di tipo gerarchico Albero: definizione formale Insieme vuoto di nodi oppure costituito da una radice R e da 0 o più alberi (detti sottoalberi) La radice di ogni sottoalbero è collegata a R da un arco (orientato) R es.: radice R con n sottoalberi T 1 T 2 T n 24

Alberi? 25

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, a scandaglio): DFS Vengono visitati i rami, uno dopo l altro Tre varianti In ampiezza (breadth-first search, a ventaglio): BFS A livelli, partendo dalla radice 26

Visita alberi binari: in profondità pre-ordine visita-preordine(t) // Visita T if (T.left() nil) visita-preordine(t.left()) if (T.right() nil) visita-preordine(t.right()) Estendibile ad alberi di grado n!= 2 T a b e c d f g Sequenza: a b c d e f g 27

Visita alberi binari: in profondità in-ordine (simmetrica) visita-inordine(t) if (T.left() nil) visita-inordine(t.left()) // Visita T if (T.right() nil) visita-inordine(t.right()) T a b e c d f g Sequenza: c b d a f e g 28

Visita alberi binari: in profondità post-ordine visita-postordine(t) if (T.left() nil) visita-postordine(t.left()) if (T.right() nil) visita-postordine(t.right()) // Visita T Estendibile ad alberi di grado n!= 2 T a b e c d f g Sequenza: c d b f g e a 29

Visita alberi binari: in ampiezza visita-ampiezza(t) q = new Queue() q.insert(t) while not q.empty() do p := q.dequeue() visita p q.enqueue(p.left()) q.enqueue(p.right()) T Estendibile ad alberi di grado n!= 2 a b e c d f g Sequenza: a b e c d f g 30

Implementazione di alberi binari / / / / / / Padre / / / / Figlio Sinistro Figlio Destro Nodo 31

Implementazione di alberi generali: vettore dei padri L'albero è rappresentato da un vettore i cui elementi contengono l'indice del padre Esempio: 0 a 1 b 1 e 2 c 2 d 3 f 4 g a b e c d f g 32

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

Implementazione di alberi generali: nodo fratello / / / / / / / / / / / / / / / / Padre Soluzione: usare una lista di figli (fratelli). Nodo Primo Figlio Fratello 34