Strutture dati per insiemi disgiunti

Documenti analoghi
Union-find. Insiemi disgiunti. F. Damiani - Alg. & Lab. 04/05 (da C. Demetrescu et al - McGraw-Hill)

Strutture dati per insiemi disgiunti (union-find)


Minimo albero di copertura

Algoritmi e strutture dati

Alberi binari di ricerca

Algoritmi Greedy. Tecniche Algoritmiche: tecnica greedy (o golosa) Un esempio

Progettazione di algoritmi

Algoritmi e Strutture Dati. HeapSort

Heap e code di priorità

Algoritmi e Strutture Dati

Grafi (non orientati e connessi): minimo albero ricoprente

Problema Union-Find. 1. Il problema Union-Find. Problema Union-Find Pag. 1/18

Struttura di dati che può essere usata sia come dizionario, sia come coda con priorità

Alberi ed Alberi Binari

Problemi, istanze, soluzioni

Dati e Algoritmi I (Pietracaprina) Esercizi su Alberi Binari di Ricerca e (2,4)-Tree

ADT Dizionario. Ordered search table. Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D:

Dizionari Liste invertite e Trie

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Problemi di ordinamento

VISITA IL SITO PER ALTRO MATERIALE E GUIDE

Algoritmi e Strutture Dati

Problema del cammino minimo

Alberi Binari di Ricerca

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Algoritmi e Strutture di Dati I 1. Algoritmi e Strutture di Dati I Massimo Franceschet francesc

Progettazione di Algoritmi

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

Alberi. Se x è il genitore di y, allora y è un figlio di x. Un albero binario è un albero in cui ogni nodo ha al massimo due figli.

Algoritmi (9 CFU) (A.A ) Heap e Algoritmo HeapSort. Prof. V. Cutello Algoritmi 1

2.2 Alberi di supporto di costo ottimo

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

2.2 Alberi di supporto di costo ottimo

TRIE (albero digitale di ricerca)

Esempi. non. orientato. orientato

Note per la Lezione 4 Ugo Vaccaro

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

Alberi Binari di Ricerca e Alberi Rosso-Neri

Esempio: rappresentare gli insiemi

Tempo e spazio di calcolo (continua)

Progettazione di algoritmi

Esercizio 1. E vero che in un AVL il minimo si trova in una foglia o nel penultimo livello? FB = -1. livello 0 FB = -1. livello 1 FB = -1.

Alberi di copertura. Mauro Passacantando. Dipartimento di Informatica Largo B. Pontecorvo 3, Pisa

Tempo e spazio di calcolo (continua)

Grafi pesati Minimo albero ricoprente

Esercizi di Algoritmi e Strutture Dati

Alberi binari e alberi binari di ricerca

Alberi binari di ricerca

In questa lezione. Heapsort. ordinamento con complessità, nel caso peggiore, O(nlogn) [CLRS01] cap. 6 da pag. 106 a pag. 114

Indici con gli alberi

Cammini minimi fra tutte le coppie

GLI ALBERI BINARI DI RICERCA. Cosimo Laneve

Informatica 3. Informatica 3. LEZIONE 17: Alberi generici. Lezione 17 - Modulo 1. Introduzione. ADT dell albero generico.

Esercizi su alberi binari

Algoritmi e Strutture Dati

Università degli Studi di L Aquila Facoltà di Scienze M.F.N. Corso di Laurea in Informatica. Modulo di Laboratorio di Algoritmi e Strutture Dati

Esercizi vari. Alberto Montresor. 19 Agosto, 2014

Alberi e arborescenze di costo minimo

Esercizi Capitolo 11 - Strutture di dati e progettazione di algoritmi

Efficienza: esempi. Nella lezione precedente. Fondamenti di Informatica. Ferdinando Cicalese. ! Qualche problema computazionale

Espressioni aritmetiche

Algoritmi e Strutture Dati

Cammini Minimi. Algoritmo di Dijkstra

Algoritmi e Strutture di Dati I 1. Algoritmi e Strutture di Dati I Massimo Franceschet francesc

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Memorizzazione di una relazione

ADT Coda con priorità

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Algoritmi e Strutture Dati

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

Algoritmi e Strutture Dati Laboratorio 15/12/2008. Daniele Loiacono

Introduzione agli algoritmi Prova di esame del 30/6/2016 Prof.sse E. Fachini - R. Petreschi

Algoritmi e Strutture Dati Esercizi Svolti. Giuseppe Persiano Dipartimento di Informatica ed Appl. Renato M. Capocelli Università di Salerno

Un esempio: l ADT Dizionario (mutabile) Definizione. Alberi binari di ricerca (BST = binary search tree) search(chiave k) -> elem

Alberi di ricerca binari

Grafi e reti di flusso

Alberi di ricerca. Alberi binari di ricerca. F. Damiani - Alg. & Lab. 04/05 (da C. Demetrescu et al - McGraw-Hill)

Dati e Algoritmi I (Pietracaprina) Esercizi sugli Alberi

Introduzione. Heap-binomiali: un heap binomiale è un insieme di alberi binomiali.

Argomenti della lezione. Introduzione agli Algoritmi e alle Strutture Dati. Lista Lineare. Lista Lineare come Tipo di Dato Astratto

TABELLE AD INDIRIZZAMENTO DIRETTO

liste ogni nodo ha un successore, tranne l ultimo della lista che ne ha zero; alberi binari ogni nodo ha zero, uno oppure due figli

FILE E INDICI Architettura DBMS

Grafi: visite. Una breve presentazione. F. Damiani - Alg. & Lab. 04/05 (da C. Demetrescu et al - McGraw-Hill)

Algoritmi e Strutture Dati

L' ADT grafo è un contenitore di elementi memorizzati nelle posizioni del grafo (vertici e archi)

B-Tree. Struttura dati usata in applicazioni che necessitano di gestire insiemi di chiavi ordinate Una variante (B+-Tree) è diffusa in:

Strutture dati per rappresentare grafi

Algoritmi e Strutture Dati

Alberi Binari di Ricerca

Esercitazione 11. Liste semplici

INDICI PER FILE. Accesso secondario. Strutture ausiliarie di accesso

11.4 Chiusura transitiva

Alberi. Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo. Fosco.

Tipi di dato e Strutture dati elementari

Dati e Algoritmi 1: A. Pietracaprina. Grafi (II parte)

Algoritmi e strutture dati

Transcript:

Strutture dati per insiemi disgiunti Servono a mantenere una collezione S = {S 1, S 2,..., S k } di insiemi disgiunti. Ogni insieme S i è individuato da un rappresentante che è un particolare elemento dell insieme. Insiemi disgiunti 1

Operazioni sugli insiemi disgiunti: MakeSet(x) : aggiunge alla struttura dati un nuovo insieme singoletto { x }. Si richiede che x non compaia in nessun altro insieme della struttura. FindSet(x) : ritorna il rappresentante dell insieme che contiene x. Union(x,y) : unisce i due insiemi contenenti x ed y in un unico insieme. 2

Esercizio 29. Descrivere un algoritmo che utilizza una struttura dati per insiemi disgiunti per determinare se un grafo non orientato G = (V,E) è connesso. 3

Rappresentazione con liste Si usa una lista circolare per ciascun insieme. c h e b Ogni nodo ha - un puntatore al nodo successivo - un puntatore al nodo rappresentante. Rappresentazione con liste 4

I nodi hanno i seguenti campi: info : l informazione contenuta nel nodo rappr : il puntatore al rappresentante succ : il puntatore al nodo successivo Le operazioni sono: MakeSet(x) rappr[x] x succ[x] x FindSet(x) x return rappr[x] c h e f x 5

x c h e b f g d y x c h e b f g d y 6

Union(x, y) > cambia i puntatori al rappresentante nella lista di y rappr[y] rappr[x], z succ[y] while z y do rappr[z] rappr[x], z succ[z] > concatena le due liste z succ[x], succ[x] succ[y], succ[y] z 7

La complessità di Union dipende dal numero di iterazioni richieste dal ciclo che cambia i puntatori al rappresentante dei nodi della lista contenente y. Quindi Union ha complessità O(n y ) dove n y èla lunghezza della seconda lista. 8

Consideriamo la seguente sequenza di 2n-1 operazioni: MakeSet(x 1 ) > costo 1 MakeSet(x 2 ) > costo 1... MakeSet(x n ) > costo 1 Union(x 2, x 1 ) > costo 1 Union(x 3, x 1 ) > costo 2 Union(x 4, x 1 ) > costo 3... Union(x n, x 1 ) > costo n-1 Il costo totale è proporzionale ad n + n(n-1)/2 ed è quindi Θ(n 2 ). Di conseguenza Union ha costo ammortizzato O(n). 9

Euristica dell unione pesata La complessità Θ(n 2 ) dell esempio è dovuta al fatto che in ogni Union la seconda lista (percorsa per aggiornare i puntatori al rappresentante) è la più lunga delle due. L euristica dell unione pesata consiste nello scegliere sempre la lista più corta per aggiornare i puntatori al rappresentante. Euristica dell unione pesata 10

Si memorizza la lunghezza di della lista in un nuovo campo l del rappresentante. 11

Le nuove funzioni: MakeSet(x) l[x] 1 succ[x] x rappr[x] x FindSet(x) return rappr[x] 12

Union(x, y) x rappr[x] y rappr[y] > se la lista di x è più corta scambia x con y if l[x] < l[y] then z x, x y, y z > somma le lunghezze l[x] l[x] + l[y] > cambia rappresentante alla lista di y rappr[y] x, z succ[y] while z y do rappr[z] x, z succ[z] > concatena le due liste z succ[x], succ[x] succ[y], succ[y] z 13

Complessità con l euristica dell unione pesata. Una sequenza di m operazioni MakeSet, Union e FindSet delle quali n sono MakeSet, richiede tempo O(m + n log n). La complessità ammortizzata delle operazioni è: m + n log n n log n O ( ) = O(1 + ) = O(log n) m m Se il numero di MakeSet è molto minore del numero di Union e FindSet per cui n log n = O(m) n log n O ( 1 + ) = O(1) m 14

Dimostriamo quindi che una sequenza di m operazioni MakeSet, Union e FindSet delle quali n sono MakeSet, richiede tempo O(m + n log n). Dimostrazione. Tutte le operazioni richiedono un tempo costante eccetto Union che richiede un tempo costante più un tempo proporzionale al numero di puntatori al rappresentante che vengono modificati. 15

Il tempo richiesto dalla sequenza di m operazioni è quindi O(m + N) dove N è il numero totale di aggiornamenti dei puntatori al rappresentante eseguiti durante tutta la sequenza di operazioni. Il numero massimo di oggetti contenuti nella struttura è n, pari al numero di MakeSet. Quando un oggetto x viene creato esso appartiene ad un insieme di cardinalità 1. 16

Il rappresentante di x viene aggiornato quando l insieme contenente x viene unito ad un insieme di cardinalità maggiore o uguale. Ogni volta che viene aggiornato il puntatore al rappresentante di x la cardinalità dell insieme a cui appartiene x viene almeno raddoppiata. Siccome n è la massima cardinalità di un insieme il puntatore al rappresentante di x può essere aggiornato al più log 2 n volte. Quindi N n log 2 n. 17

Rappresentazione con foreste Una rappresentazione più efficiente si ottiene usando foreste di insiemi disgiunti. Con questa rappresentazione ogni insieme è rappresentato con un albero i cui nodi, oltre al campo info che contiene l informazione, hanno soltanto un campo p che punta al padre. Rappresentazione con foreste 18

c f h e d b g 19

Implementazione semplice: MakeSet(x) p[x] x FindSet(x) while p[x] x do x p[x] return x Union(x,y) x FindSet(x) y FindSet(y) p[x] y > serve controllare se x y? 20

c f f y b h x e d g y h x c e d g b 21

Osservazione. Sia nella rappresentazione con liste circolari che nella rappresentazione mediante alberi non abbiamo indicato nessun puntatore esterno alla lista o all albero. In realtà una struttura dati per insiemi disgiunti non è pensata per memorizzare dei dati ma soltanto per raggruppare in insiemi disgiunti dei dati che sono già memorizzati in qualche altra struttura (array, pila, albero, tavola hash, ecc.). 22

Complessità dell implementazione semplice. - FindSet(x) : proporzionale alla lunghezza del cammino che congiunge il nodo x alla radice dell albero. - Union : essenzialmente quella delle due chiamate FindSet(x) e FindSet(y). Un esempio analogo a quello usato con le liste mostra che una sequenza di n operazioni può richiedere tempo O(n 2 ). 23

Possiamo migliorare notevolmente l efficienza usando due euristiche: Unione per rango Simile all unione pesata per le liste. Per ogni nodo x manteniamo un campo rank che è un limite superiore all altezza del sottoalbero di radice x (e un limite inferiore del logaritmo del numero di nodi del sottoalbero). L operazione Union inserisce la radice con rango minore come figlia di quella di rango maggiore. 24

Compressione dei cammini Quando effettuiamo una FindSet(x) dobbiamo attraversare tutto il cammino da x alla radice. Possiamo approfittarne per far puntare alla radice dell albero i puntatori al padre di tutti i nodi incontrati lungo il cammino. In questo modo le eventuali operazioni FindSet successive sui nodi di tale cammino risulteranno molto meno onerose. 25

L implementazione con le due euristiche è la seguente: MakeSet(x) p[x] x rank[x] 0 26

FindSet(x) if p[x] x then p[x] FindSet(p[x]) return p[x] f f c d x b h c d h e g e g x b 27

Union(x,y) x FindSet(x) y FindSet(y) Link(x, y) Link(x, y) if rank[x] > rank[y] then p[y] x else p[x] y if rank[x] = rank[y] then rank[y] rank[y] + 1 28