La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

1 © Alberto Montresor Algoritmi e Strutture Dati Capitolo 10 - Code con priorità e insiemi disgiunti Alberto Montresor Università di Trento This work is.

Presentazioni simili


Presentazione sul tema: "1 © Alberto Montresor Algoritmi e Strutture Dati Capitolo 10 - Code con priorità e insiemi disgiunti Alberto Montresor Università di Trento This work is."— Transcript della presentazione:

1 1 © Alberto Montresor Algoritmi e Strutture Dati Capitolo 10 - Code con priorità e insiemi disgiunti 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 or send a letter to Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA.

2 2 © Alberto Montresor Introduzione Strutture dati viste finora Sequenze, insiemi e dizionari Strutture speciali Le operazioni base (inserimento, cancellazione, lettura, etc.) possono non essere sufficienti: a volte è necessario inventarsene di nuove Se non tutte le operazioni sono necessarie, è possibile realizzare strutture dati più efficienti, specializzate per particolare compiti

3 3 © Alberto Montresor Code con priorità L'idea Una struttura dati – detta heap – che mantiene dati in modo parzialmente ordinato Utilizzazioni Code con priorità Gli oggetti vengono estratti dalla coda in base alla loro priorità Heapsort Algoritmo di ordinamento Costo computazionale: O ( n log n ) Ordinamento sul posto

4 4 © Alberto Montresor Alberi binari Albero binario perfetto Tutte le foglie hanno la stessa profondità h Nodi interni hanno grado 2 Un albero perfetto Ha altezza log N Altezza h #nodi= 2 h+1 -1 Albero binario completo Tutte le foglie hanno profondità h o h-1 Tutti i nodi a livello h sono accatastati a sinistra Tutti i nodi interni hanno grado 2, eccetto al più uno

5 5 © Alberto Montresor Alberi binari heap Un albero binario completo è un albero max-heap sse Ad ogni nodo i viene associato un valore A[ i ] A [ p ( i )] A [ i ] Un albero binario completo è un albero min-heap sse Ad ogni nodo i viene associato un valore A [ i ] A [ p ( i )] A [ i ] Le definizioni e gli algoritmi di max-heap sono simmetrici rispetto a min-heap Max heap

6 6 © Alberto Montresor Alcune informazioni sugli alberi heap Un albero heap non impone alcuna relazione di ordinamento fra i figli di un nodo Un albero heap è un ordinamento parziale Riflessivo: Ogni nodo è di se stesso Antisimmetrico: se n m e m n, allora m = n Transitivo: se n m e m r, allora n r Ordinamenti parziali Utili per modellare gerarchie complesse o mantenere informazioni parziali Nozione più debole di un ordinamento totale... Ma più semplice da costruire {a,b} {a}{b}161410

7 7 © Alberto Montresor Array heap E' possibile rappresentare un albero binario heap tramite un array heap (oltre che tramite puntatori) Come è fatto? Array A [1.. n ] Come è organizzato? A [1] contiene la radice p ( i ) = i /2 l ( i ) = 2 i r ( i ) = 2 i A[1] A[2]A[3] A[4] A[5]A[6]A[7] A[8] A[9] A[10] n = 10

8 8 © Alberto Montresor Array heap Ricapitolando: Array max-heap: A [ i ] A [2 i ], A [ i ] A [2 i +1] Procedure per gestire heap maxHeapRestore - O (log n ) Un algoritmo che mantiene la proprietà di max-heap heapBuild - O ( n ) Un algoritmo che costruisce un max-heap da zero heapsort - O ( n log n ) Ordina sul posto un array

9 9 © Alberto Montresor maxHeapRestore() Input Un array A e un indice i Gli alberi binari con radici l ( i ) e r ( i ) sono max-heap E' possibile che A [ i ] sia minore di A [ l ( i )] o A [ r ( i )] In altre parole: il sottoalbero con radice i può non essere un max-heap Scopo Ripristinare la proprietà di max-heap sul sottoalbero con radice i Facendo scendere l'elemento A [ i ] nell'array

10 10 © Alberto Montresor maxHeapRestore()

11 11 © Alberto Montresor maxHeapRestore() Domanda: Esempio di funzionamento 5, 15, 12, 9, 10, 7, 4, 3, 6, 8, 2 E' un array max-heap? E' possibile applicare maxHeapRestore () alla radice? Domanda: Qual è la complessità in tempo di maxHeapRestore ()? Domanda Dimostrare la correttezza di maxHeapRestore ()

12 12 © Alberto Montresor heapBuild() Principio generale Sia A[1.. n ] un array da ordinare Tutti i nodi A [ n / n ] sono foglie dell'albero e quindi heap di un elemento da cui iniziare La procedura heapBuild () attraversa i restanti nodi dell'albero ed esegue maxHeapRestore ()

13 13 © Alberto Montresor heapBuild() Domanda: Esempio di funzionamento 14, 45, 28, 34, 15, 20, 12, 30, 21, 25, 16, 22 Domanda: Correttezza Esprimere un'invariante di ciclo Dimostrare la sua correttezza Domanda – Complessità Qual è la complessità di heapBuild ()?

14 14 © Alberto Montresor Complessità Le operazioni maxHeapRestore () vengono eseguite su heap di altezza variabile Viene eseguito n /2 volte su heap di altezza 0 Viene eseguito n /4 volte su heap di altezza 1 Viene eseguito n /8 volte su heap di altezza 2...Viene eseguito n /2 h+1 volte su heap di altezza h Da cui si deduce Ricordate: Per x < 1

15 15 © Alberto Montresor Ordinamento tramite heap Intuizione Il primo elemento dello heap è sempre il massimo Andrebbe collocato nell'ultima posizione L'elemento in ultima posizione? In testa! Chiama maxHeapRestore () per ripristinare la situazione

16 16 © Alberto Montresor heapsort() Domanda: Esempio di funzionamento 14, 45, 28, 34, 15, 20, 12, 30, 21, 25, 16, 22 Domanda: Correttezza Esprimere un'invariante di ciclo Dimostrare la sua correttezza Domanda: Complessità Qual è la complessità di heapsort ()?

17 17 © Alberto Montresor Esercizi Esercizio Dimostrare che uno heap con n nodi ha altezza θ (log n ) Esercizio Scrivere un'implementazione iterativa di maxHeapRestore () (in pseudo-codice) Esercizio Dimostrare che il tempo di esecuzione nel caso peggiore di maxHeapRestore () è Ω (log n ) Esercizio Implementare heapsort () nel vostro linguaggio preferito

18 18 © Alberto Montresor Code con priorità Coda con priorità Una struttura dati che serve a mantenere un insieme S di elementi x, ciascuno con un valore associato di priorità

19 19 © Alberto Montresor Specifica

20 20 © Alberto Montresor Code con priorità Esempio di utilizzo Simulatore event-driven Ad ogni evento è associato un timestamp di esecuzione Ogni evento può generare nuovi eventi, con timestamp arbitrari Una coda con min-priorità può essere utilizzata per eseguire gli eventi in ordine di timestamp Esempi di organizzazione 3 p ev 7 p 5 p evento 3 p ev 4 p 5 p 6 p 8 p 7 p

21 21 © Alberto Montresor Code con priorità

22 22 © Alberto Montresor Inserimento

23 23 © Alberto Montresor Code con priorità - minHeapRestore()

24 24 © Alberto Montresor Rimozione del minimo e riduzione priorità

25 25 © Alberto Montresor Code con priorità Esercizio Qual è la complessità delle operazioni sulle code con priorità? Esercizio Scrivere lo pseudocodice di una versione heapBuild () basata sulla insert () Le due procedure creano lo stesso heap? Dimostrare o produrre un esempio contrario Qual è la complessità di questa versione di heapBuild ()? Esercizio L'azione di delete (PriorityItem x ) cancella l'elemento x dallo heap. Scrivete una versione di delete () che operi in tempo O (log n ).

26 26 © Alberto Montresor Struttura dati per insiemi disgiunti Motivazioni In alcune applicazioni siamo interessati a gestire insiemi disgiunti di oggetti Esempio: componenti di un grafo Operazioni fondamentali: unire più insiemi identificare l'insieme a cui appartiene un oggetto Struttura dati Una collezione S = { S 1, S 2,..., S n } di insiemi dinamici disgiunti Ogni insieme è identificato da un rappresentante univoco

27 27 © Alberto Montresor Scelta del rappresentante Il rappresentante può essere un qualsiasi membro dellinsieme S i Operazioni di ricerca del rappresentante su uno stesso insieme devono restituire sempre lo stesso oggetto Solo in caso di unione con altro insieme il rappresentante può cambiare Il rappresentante può essere un elemento specifico dellinsieme Si devono definire le caratteristiche degli insiemi e una regola per caratterizzare il rappresentante Esempio: lelemento più piccolo/grande di un insieme

28 28 © Alberto Montresor Primitive degli insiemi disgiunti (Merge-Find)

29 29 © Alberto Montresor Esempio , , , 23,45, , 2, 3, 45, , 2, 3, 4, 5, 6 mfset (6) merge (1,2) merge (3,4) merge (5,6) merge (1,3) merge (1,5)

30 30 © Alberto Montresor Esempio: come utilizzare Merge-Find Determinare le componenti connesse di un grafo non orientato dinamico Algoritmo Si inizia con componenti connesse costituite da un unico vertice L'operazione merge ( find ( u ), find ( v )) viene eseguita per ogni arco ( u, v ) Alla fine, avremo l'insieme delle componenti connesse Complessità Costo: O ( n ) + m operazioni merge () Questo algoritmo è interessante per la capacità di gestire grafi dinamici (in cui gli archi vengono aggiunti)

31 31 © Alberto Montresor Implementazione di Union-Find Algoritmi elementari: Realizzazione basata su liste find (): O (1); merge (): O ( n ) Realizzazione basata su alberi merge (): O (1); find (): O ( n ) Algoritmi basati su euristiche di bilanciamento Realizzazione basata su liste + Euristica sul peso Realizzazione basata su alberi + Euristica sul rango Algoritmi finale Alberi + rango + compressione dei percorsi

32 32 © Alberto Montresor Realizzazione basata su liste Ogni insieme viene rappresentato con una lista concatenata Il primo oggetto di una lista è il rappresentante dellinsieme Ogni elemento nella lista contiene: un oggetto un puntatore allelemento successivo un puntatore al rappresentante cheb Può essere visto come un albero di altezza 1 # head tail

33 33 © Alberto Montresor Realizzazione basata su liste Loperazione find (x) richiede tempo O(1) Si restituisce il rappresentante di x Loperazione merge (x,y) è più complessa: Si appende la lista che contiene y alla lista che contiene x I puntatori ai rappresentanti della lista appesa devono essere modificati Costo nel caso pessimo per n operazioni: O ( n 2 ) Costo ammortizzato: O ( n ) merge (2,1), merge (3,1), merge (4,1), etc.

34 34 © Alberto Montresor QuickFind: Esempio - merge ( h, g ) cheb fgdz chebfgdz

35 35 © Alberto Montresor Realizzazione basata su alberi (foreste) Implementazione basata su foresta Si rappresenta ogni insieme tramite un albero radicato Ogni nodo dell'albero contiene l'oggetto un puntatore al padre Il rappresentante è la radice dell'albero La radice ha come padre un puntatore a se stessa Nota: generalmente migliore, non più veloce delle liste nel caso pessimo c e h b f d g

36 36 © Alberto Montresor Realizzazione basata su alberi Operazioni e costo find ( x ) Risale la lista dei padri di x fino a trovare la radice e restituisce la radice come oggetto rappresentante Costo: O ( n ) nel caso pessimo merge ( x, y ) Appende l'albero radicato in y ad x Costo: O (1)

37 37 © Alberto Montresor Realizzazione basata su alberi: Esempio – merge ( c, f ) c e h b f d g c e h b f d g

38 38 © Alberto Montresor Realizzazione basata su alberi: Esempio – merge ( c, f ) c e f d g c e f d g

39 39 © Alberto Montresor Considerazioni Quando usare.... Realizzazione basata su liste? Quando le merge () sono rare e le find () frequenti Realizzazione basate su alberi? Quando le find () sono rare e le merge () frequenti E' importante sapere che esistono tecniche euristiche che permettono di migliorare questi risultati: Fino a operazioni in tempo ammortizzato O(1) per tutte le utilizzazioni pratiche

40 40 © Alberto Montresor Realizzazione basata su liste: Euristica peso Una strategia per diminuire il costo delloperazione merge () : Memorizzare linformazione sulla lunghezza della lista Appendere la lista più corta a quella più lunga La lunghezza della lista può essere mantenuta in tempo O(1) chebfg 24

41 41 © Alberto Montresor Realizzazione basata su liste: Euristica peso Una strategia per diminuire il costo delloperazione merge () : Memorizzare linformazione sulla lunghezza della lista Appendere la lista più corta a quella più lunga La lunghezza della lista può essere mantenuta in tempo O(1) 6 fgcheb

42 42 © Alberto Montresor Realizzazione basata su alberi: Euristica sul rango Ogni nodo mantiene informazioni sul proprio rango il rango rango [ x ] di un nodo x è il numero di archi del cammino più lungo fra x e una foglia sua discendente rango altezza del sottoalbero associato al nodo Unione di due alberi con rango diverso c e h b f d + c e h b f d = Unione di due alberi con rango uguale c e h b f d + c e h b f d = g g

43 43 © Alberto Montresor Compressione dei cammini Compressione dei cammini: idea Utilizzata durante le operazioni find ( x ) L'albero viene modificato in modo che ricerche successive di x possano completare in O(1) Esempio: operazione find ( f ) b e d f b edf

44 44 © Alberto Montresor Compressione dei cammini + rango Quando si utilizzano entrambe le euristiche: Il rango non è più l'altezza del nodo......ma il limite superiore all'altezza del nodo In altre parole: Le operazioni di compressione dei cammini NON riducono il rango Sarebbe troppo complesso mantenere le informazioni di altezza corrette In ogni caso, non è necessario

45 45 © Alberto Montresor Realizzazione basata su alberi + rango + compressione dei cammini

46 46 © Alberto Montresor Complessità Valutiamo ora la complessità di: Liste + Euristica sul peso Alberi + Euristica sul rango Alberi + Euristica sul rango + Compressione dei cammini Alla lavagna! Ne segue che tutte queste implementazioni (e in particolare l'ultima) sono ampiamente utilizzabili in pratica


Scaricare ppt "1 © Alberto Montresor Algoritmi e Strutture Dati Capitolo 10 - Code con priorità e insiemi disgiunti Alberto Montresor Università di Trento This work is."

Presentazioni simili


Annunci Google