1 / 34

Strutture dati avanzate

Strutture dati avanzate. Vedremo alcune strutture dati che permettono di eseguire in modo efficiente un determinato repertorio di operazioni: B -alberi . strutture dati per insiemi disgiunti. B -alberi.

ulani
Télécharger la présentation

Strutture dati avanzate

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Strutture dati avanzate • Vedremo alcune strutture dati che permettono di eseguire in modo efficiente un determinato repertorio di operazioni: • B-alberi . • strutture dati per insiemi disgiunti.

  2. B-alberi I B-alberi sono alberi bilanciati adatti per memorizzare grandi masse di dati in memoria secondaria. Sono simili agli alberi rosso-neri ma sono progettati per minimizzare gli accessi alla memoria secondaria. Le operazioni sui B-alberi sono Insert, Delete eSearch alle quali si aggiungono Split e Join.

  3. T.root M D H Q T X B C F G J K L N P R S V W Y Z A differenza dei nodi degli alberi rosso-neri che hanno una sola chiave e due figli, i nodi dei B-alberi possono avere un numero di chiavi n ≥1 ed n+1figli. Ecco un esempio di B-albero:

  4. Meccanismo di spostamento della testina Testina di lettura-scrittura Il funzionamento di una memoria esterna su disco può essere schematizzato nel seguente modo: Disco Traccia Settore Pagina

  5. Le operazioni di lettura/scrittura hanno come unità elementare una paginache normalmente contiene da 2 a 10 kbyte. L’accesso alle informazioni registrate su disco richiede alcune operazioni meccaniche: - spostamento della testina; - rotazione del disco.

  6. Il tempo di accessoal disco comprende il tempo per posizionare la testina di lettura scrittura e poi aspettare che la pagina passi sotto la testina. Esso è dell’ordine dei millisecondi. Tipicamente 10-20 msec. Il tempo di accesso alla memoria RAM, non richiedendo operazioni meccaniche è invece dell’ordine dei nanosecondi. Tipicamente 10-100 nsec.

  7. Spesso occorre più tempo per leggere i dati da disco in memoria e per scrivere i risultati su disco di quanto serva per la loro elaborazione. Per questo, nel valutare la complessità delle operazioni, terremo separate le due componenti: • tempo di lettura-scrittura su disco (che assumiamo proporzionale al numero di pagine lette o scritte). • tempo di CPU (tempo di calcolo in memoria RAM).

  8. L’operazione di lettura da disco è: DiskRead(x) dato il riferimento x ad un oggetto ricopia l’oggetto da disco in memoria. Assumiamo che sia possibile accedere al valore di un oggetto soltanto dopo che esso sia stato letto in memoria.

  9. L’operazione di scrittura su disco è : DiskWrite(x) che, dato il riferimento x ad un oggetto presente in memoria, copia tale oggetto su disco. Tipicamente l’elaborazione di un oggetto residente su disco segue lo schema: DiskRead(x) ..... // elaborazioni che accedono-modificanox DiskWrite(x) // non necessaria se xinvariato .....// elaborazioni che non modificano x

  10. Le operazioni di lettura-scrittura devono leggere e scrivere almeno una pagina e questo anche se l’oggetto x è molto più piccolo. Siccome, con i B-alberi, la maggior parte del tempo è utilizzata per le operazione di lettura-scrittura da disco è opportuno sfruttare al massimo ciascuna operazione.

  11. Per questa ragione si usano nodi la cui dimensione sia circa quella di una pagina. Il numero massimo di figli di un nodo è limitato dalla dimensione di una pagina. Un numero massimo di figli compreso tra 50 e 2000 è la norma.

  12. T.root 999 1000 ..... 999 999 999 1000 1000 1000 ..... 999 999 999 Un elevato grado di diramazione riduce di molto sia l’altezza dell’albero che il numero di letture da disco necessarie per cercare una chiave. La figura seguente mostra che un B-albero di altezza 2 con un grado di diramazione 1000 può contenere 109-1 chiavi (un miliardo) 1 nodo 999 chiavi 1.000 nodi 999.000 chiavi 1.000.000 nodi 999.000.000 chiavi

  13. Poiché la radice può essere tenuta stabilmente in memoria, due accessi a disco sono sufficienti per cercare una qualsiasi chiave. Per semplicità di esposizione assumeremo che le informazioni associate a ciascuna chiave (o i puntatori a tali informazioni) siano memorizzate assieme alle chiavi in tutti i nodi dell’albero. Un’altra possibilità è mettere tali informazioni nelle foglie e mettere nei nodi interni soltanto chiavi e puntatori ai figli, massimizzando quindi il grado di diramazione dei nodi interni.

  14. J N Q * * * W M O T K * * * * * L P X * * * D Y E R B * * * * * H C Z S F * * * * * Esempio di B-albero con grado massimo 4 e che usa la prima tecnica: T.root Ogni nodo deve poter contenere 3 chiavi, 4 puntatori ai figli e 3 puntatori alle informazioni associate 10 campi in totale

  15. M B * C * D * N E X Q * * * * O F Y R * * * * Z H S P * * * * D P H S K W J * K * T L * * W M * * Esempio di B-albero con grado massimo 4 e che usa la seconda tecnica T.root Ogni nodo interno deve poter contenere 3 chiavi e 4 puntatori ai figli. Una foglia deve poter contenere 3 chiavi e 3 puntatori alle informazioni associate. al più 7 campi in totale

  16. Definizione di B-albero Un B-alberoT è un albero di radice T.root tale che: 1. Ogni nodo x contiene i seguenti campi: x.n: il numero di chiavi presenti nel nodo. a) b) x.key1 ≤ x.key2 ≤ .... ≤ x.keyx.n: le x.n chiavi in ordine non decrescente. c) x.leaf: valore booleano che è true se il nodo x è foglia, falsealtrimenti.

  17. se il nodo non è una foglia contiene anche 2. d) x.c1,x.c2,....,x.cx.n+1: gli x.n+1 puntatori ai figli. 3. le chiavi x.key1, x.key2,....,x.keyx.n di un nodo interno separano le chiavi dei sottoalberi. In altre parole, se ki è una chiave qualsiasi del sottoalbero di radice x.ci allora k1 ≤ x.key1 ≤ k2 ≤ ... ≤ kx.n ≤ x.keyx.n ≤ kx.n+1 4. Le foglie sono tutte alla stessa profondità h detta altezza dell’albero.

  18. 5. Vi sono limiti inferiori e superiori al numero di chiavi in un nodo e tali limiti dipendono da una costante tdetta grado minimodel B-albero. a) ogni nodo, eccetto la radice, ha almeno t -1 chiavi e, se non è una foglia, ha almeno tfigli. b) se l’albero non è vuoto, la radice contiene almeno una chiave. c) ogni nodo ha al più 2t -1 chiavi e, se non è foglia, ha al più 2tfigli.

  19. Ad ogni chiave sono generalmente associate delle informazioni ausiliarie. Assumeremo implicitamente che quando viene copiata una chiave vengano copiate anche tali informazioni. I B-alberi più semplici sono quelli con grado minimo t = 2. Ogni nodo interno ha 2,3 o 4figli. In questo caso si dicono anche 2-3-4-alberi. Storicamente i 2-3-4-alberi sono predecessori sia dei B-alberi che degli alberi rosso-neri.

  20. Esercizio 20. Perché non possiamo avere grado minimo t = 1? Esercizio 21. Calcolare il numero massimo di chiavi che può contenere un B-albero in funzione del suo grado minimo t e della sua altezza h Esercizio 22. Dire quale struttura dati si ottiene se in ogni nodo nero di un albero rosso-nero conglobiamo i suoi eventuali figli rossi.

  21. Altezza di un B-albero Proprietà. Ogni B-albero non vuoto di grado minimo t con N chiavi ha altezza Dimostrazione. Invece della diseguaglianza dimostriamo quella equivalente

  22. Sia T.root la radice ed h ≥ 0l’altezza. Indichiamo con mi il numero di nodi a livello i. Allora m0=1 m1 = T.root.n+1 ≥ 2 mi≥ t mi -1≥ t i -1 m1 per i > 1 e dunque mi≥ 2t i -1 per ogni i ≥ 1

  23. Quindi L’altezza di un B-albero è O(logt n) dello stesso ordine O(log2n) degli alberi rosso-neri. Ma la costante nascosta nella O è inferiore di un fattore log2tche, per 50 ≤t ≤ 2000, è compreso tra 5 e 11.

  24. La radice del B-albero è sempre in memoria. 1. I nodi passati come parametri alle procedure sono stati preventivamente caricati in memoria. 2. Operazioni elementari Adottiamo le seguenti convenzioni per le operazioni sui B-alberi:

  25. Defineremo le seguenti operazioni: - Createcostruttore di un B-alberovuoto - Search che cerca una chiave nell’albero - Insert che aggiunge una chiave - Delete che toglie una chiave • Ci serviranno anche alcune procedure ausiliarie: • - SplitChild • InsertNonfull • AugmentChild • DeleteNonmin • DeleteMax

  26. Un B-albero vuoto si costruisce con la procedura: Create(T) x = AllocateNode() x.leaf= true x.n = 0 DiskWrite(x) T.root = x la cui complessità è O(1).

  27. Search(x, k) i = 1, j = x.n+1 //x.key1 .. i-1< k ≤ x.keyj.. x.n whilei < j//Ricerca binaria m = (i+j)/2 ifk ≤x.keym j= m elsei= m+1 //x.key1.. i-1< k≤x.keyi.. x.n ifi ≤ x.nandk == x.keyi return (x, i) elseifx.leaf returnnil elseDiskRead(x.ci) returnSearch(x.ci, k)

  28. Il numero di DiskReadè al più uguale all’altezza h dell’albero e quindi O(logtN) Il tempo di CPU di Search è:

  29. Vediamo ora la Insertche aggiunge una chiave. Non possiamo aggiungere la chiave ad un nodo interno perché dovremmo aggiungere anche un sottoalbero. L’aggiunta di una chiave ad un B-albero può avvenire soltanto in una foglia e soltanto se la foglia non è piena, cioè non ha il numero massimo 2t-1 di chiavi.

  30. Possiamo garantirci che la foglia a cui arriveremo non sia piena se ad ogni passo nella discesa dalla radice ci assicuriamo che il figlio su cui scendiamo non sia pieno. Nel caso in cui tale figlio sia pieno chiamiamo prima una particolare funzione SplitChildche lo divide in due. La stessa cosa dobbiamo fare all’inizio se la radice è piena.

  31. root root.c1 y P Q R S T U V T1 T2 T3 T4 T5 T6 T7 T8 Ecco come funziona Insert se la radice è piena in un B-albero di grado minimo t = 4 root P Q R S T U V T1 T2 T3 T4 T5 T6 T7 T8 dopo di che richiama SplitChild

  32. x ... N S W ... x.ci x.ci+1 y P Q R T U V z T1 T2 T3 T4 T5 T6 T7 T8 Ecco come funziona SplitChildsu un figlio pieno in un B-albero di grado minimo t = 4 x ... N W ... x.ci y P Q R S T U V T1 T2 T3 T4 T5 T6 T7 T8

  33. SplitChild(x, i, y) //xnon pieno con y figlioi-esimopieno z = Allocate-Node() z.leaf =y.leaf z.n = t-1 //Sposta le ultime t -1 chiavi di yinz forj = 1 tot -1 z.keyj = y.keyj+t //Seynon è foglia sposta inz gli ultimi tpuntatori di y ifnoty.leaf forj = 1 tot z.cj = y.cj+t y.n = t-1

  34. // Mette la t-esimachiave di yinx forj = x.ndowntoi x.keyj+1 = x.keyj x.keyi = y.keyt // Aggiungezcomei+1-esimo figlio dix forj = x.n+1 downtoi+1 x.cj+1 = x.cj x.ci+1 = z x.n = x.n+1 // Scrive su disco i nodi modificati DiskWrite(x), DiskWrite(y), DiskWrite(z)

More Related