SEMINARIO MAGGIO 2009 DANIELA SCARCELLA E MATTEO BUFFA 1 La rappresentazione dei dati nello spazio, ha diverse applicazioni. Questo trova riscontro nei seguenti applicativi: DBMS commerciali G.I.S. (sistemi informatici geografici) Gestione di progetti nel settore architettonico, industriale; Etc. 2 STRUTTURE DATI MULTIDIMENSIONALI L’aumento del numero di dimensioni nello spazio porta ad una complessità maggiore, ed è per questo che si cerca di ottimizzare la rappresentazione di informazioni multidimensionali studiando nuove strutture dati. La rappresentazione di oggetti n-dimensioni è strettamente legata al concetto di indicizzazione di relazioni di database. 3 STRUTTURE DATI MULTIDIMENSIONALI Esistono molte strutture dati che rappresentano metodi di decomposizione dello spazio, tali per cui la rappresentazione dei punti comporta , un risparmio di spazio di memorizzazione, e tempo di esecuzione delle operazioni (aggiornamento, creazione, modifica, ecc). 4 Rappresentazioni di dati nello spazio K-d tree Quadtree Point Quadtree-MX R-tree 5 Sistemi Informatici geografici Consideriamo un sistema di informazioni geografiche il quale immagazzina i dati di una determinata zona. Prendiamo in esame una mappa come un’immagine Bi-dimensionale. 6 7 K-d tree Un albero a due dimensioni (es. k=2) immagazzina informazioni bi-dimensionali,. Un albero a tre dimensioni (es.k=3) immagazzina informazioni tri-dimensionali Etc. 8 Struttura di un albero 2-d In un albero, il nodo ha una certa struttura di record. nodetype = record INFO : infotype XVAL : real YVAL : real LLINK : nodetype RLINK : nodetype 9 Condizioni da soddisfare Se N è un nodo di livello pari: Nel ramo di sinistra i nodi M hanno la proprietà M.XVAL < N.XVAL. Nel ramo di destra i nodi P hanno la proprietà P.XVAL >= N.XVAL. Il nodo N divide la regione in due parti, disegnando una linea verticale. 10 Condizioni da soddisfare Se N è un nodo di livello dispari: Nel ramo di sinistra i nodi M (figlio di N) ha la proprietà M.YVAL <N.YVAL Nel ramo di destra i nodi P(figlio di N) ha la proprietà P.YVAL>=N.YVAL Il nodo N divide la regione in due parti, disegnando una linea orizzontale. 11 CITTA’ X Y TORINO 66 83 BIELLA 74 115 ALESSANDRIA 98 65 CUNEO 42 15 12 INSERIMENTO ALBERO 2-D Supponiamo di voler inserire questi elementi così come messi nella tabella. Inserimento primo elemento: se la tabella è vuota, questo record sarà la radice dell’albero di dati. LIV 0 13 INSERIMENTO ALBERO 2-D Inserimento secondo elemento: siccome siamo in un livello pari dell’albero dobbiamo confrontare i campi XVAL; ovvero BIELLA.XVAL >= TORINO.XVAL; quindi collegheremo il figlio al campo Rlink(destro). 14 LIV 0 LIV 1 15 INSERIMENTO ALBERO 2-D Inserimento terzo elemento: inizio con il confrontare Torino.XVAL con Alessandria.XVAL, dal confronto mi accorgo che Alessandria.XVAL > TORINO.XVAL però il campo destro è già occupato, quindi confronto (mi trovo al LIV 1) Alessandria.YVAL con Biella.YVAL , e quindi Alessandria.YVAL < Biella.YVAL; allora collego questo nuovo elemento al campo sinistro. 16 66 83 LIV 0 74 98 115 LIV 1 65 LIV 2 17 Inserimento quarto elemento: l’ultimo elemento da inserire è la città di Cuneo. CUNEO.XVAL con TORINO.XVAL confronto i campi XVAL perché ci troviamo al livello pari. Questo nuovo e ultimo elemento lo colleghiamo al figlio sinistro della radice, poiché CUNEO.XVAL < TORINO.XVAL 18 Quindi il nostro schema finale sarà: 66 83 LIV 0 74 98 65 115 LIV 1 LIV 2 19 CANCELLAZIONE ALBERI 2-D La parte più complessa nella gestione degli alberi K-D è la cancellazione di un nodo. Il primo passo consiste nell’ individuare il nodo da cancellare. Supponiamo di voler cancellare un elemento nella posizione (x,y). Se il nodo da cancellare è una foglia (questo è il caso piu semplice) si elimina il nodo selezionato, ponendo a NULL il puntatore al nodo padre che ne memorizza il riferimento. 20 CANCELLAZIONE ALBERI 2-D NULL 21 CANCELLAZIONE ALBERI 2-D Se invece il nodo da cancellare è interno, la cancellazione sarà più complessa. Supponiamo infatti di voler cancellare un nodo N, non vuoto cioè che ha almeno un figlio. Il primo passo da fare è trovare un candidato(nodo R) che può sostituire il nodo che vogliamo cancellare (N). 22 Passi da fare per cancellare un nodo interno Passo 1: trovare un sostituto R per rimpiazzare il nodo figlio di Ti(Tr o Tl). Passo 2: sostituire i campi Info, XVAL e YVAL di N con quelli di R (ovvero il sostituto). Passo 3: Cancellare ricorsivamente R da Ti. 23 Il nodo candidato deve soddisfare le seguenti proprietà: 1: Ogni nodo M in Tl deve verificare M.XVAL < R.XVAL se il livello è pari, mentre deve verificare che M.YVAL < R.YVAL se il livello è dispari . 2: Ogni nodo M in Tr deve verificare che M.XVAL >= R.XVAL se il livello è pari, mentre deve verificare che M.YVAL >= R.YVAL se il livello è dispari. 24 Tl Tr LIV 0 LIV 1 LIV 2 LIV 3 25 CONSIDERAZIONI (sotto-albero destro) In generale,se il livello di N è pari, ogni nodo Tr che ha il campo XVAL più piccolo possibile in Tr è il nodo candidato per la sostituzione. In modo analogo se il livello di N è dispari, ogni nodo in Tr che ha il campo YVAL più piccolo possibile in Tr è il nodo candidato per la sostituzione. Nel nostro caso, se volessi cancellare TORINO, il nodo che dovrebbe rimpiazzare è associato ad ALESSANDRIA, poiché questo nodo ha coordinata Y più piccola di tutte le altre città nel sottoalbero destro di TORINO. 26 Nodo N LIV 0 M (di livello dispari) LIV 1 R(candidato) LIV 2 M verifica la condizione 2 (ovvero M.YVAL >= R.YVAL) ALESSANDRIA è la città con campo YVAL più piccola 27 Nodo N LIV 0 LIV 1 LIV 2 ALESSANDRIA è la città con campo YVAL più piccola 28 Nodo N LIV 0 LIV 1 LIV 2 ALESSANDRIA è la città con campo YVAL più piccola 29 CONSIDERAZIONI (sotto-albero sinistro) Se il livello N è pari, un nodo di rimpiazzo in Tl sarà il nodo in cui il campo XVAL ha valore più grande. In modo analogo, se il livello N è dispari, consideriamo il nodo di rimpiazzo Tl che ha campo YVAL maggiore. 30 RANGE QUERY IN ALBERI 2-D Una query su un intervallo in un albero a 2-d è una ricerca che permette di recuperare tutti i punti situati all’interno di una circonferenza con centro nel punto (xc, yc) e raggio r. La risposta alla query recupera tutti i punti inseriti nell’albero che hanno una distanza dal centro minore del raggio. In altre parole si presuppone di trovare tutti quei punti dell’albero 2-d che stanno nell’intorno. Nell’elaborazione di una query su un intervallo è necessario ricordare che ogni nodo N inserito all’interno dell’albero definisce una regione Rn. 31 RANGE QUERY IN ALBERI 2-D Se il cerchio in una query non ha intersezione Rn, allora non esistono punti da cercare nel sottoalbero con radice N. Se consideriamo la mappa precedente: 1) Il nodo con etichetta TORINO rappresenta tutti i punti del dominio applicato 2) Il nodo etichettato BIELLArappresenta la regione di tutti i punti (x,y) tali che x>66 3)Il nodo etichettato ALESSANDRIA rappresenta tutti i punti(x,y) tali che x>=19 e y<65 4)Il nodo etichettato CUNEO rappresenta tutti i punti (x,y) tali che x<66. 32 33 INOLTRE… Ad ogni nodo vengono associate altre 4 coordinate che unite costituiscono la regione rappresentata da quel nodo. 1) XLB e XUB: rappresentano l’angolo inferiore e superiore per le ascisse(di X) 2) YLB e YUB : rappresentano l’angolo inferiore e superiore delle ordinate(di Y). 34 Questi dati vanno a modificare la definizione del nodo: Newnodetype=record XVAL, YVAL: real XLB,XUB,YLB,YUB: real LLINK, RLINK: newnodetype 35 ALBERI K-D per K>2 In modo analogo, possiamo considerare un albero tri- dimensionale con k=3 con coordinate(x,y,z), oppure un albero a 4-D che rappresenterebbe punti della forma (x,y,z,t), etc. La struttura del nodo in un albero K-D INFO: infotype VAL[K]:real LLINK,RLINK:nodetype Il campo VAL[K] è una matrice di dimensioni pari a K 36 PUNTI QUADTREE Questo tipo di struttura è utilizzato per rappresentare i punti in due dimensioni. Ogni nodo divide la regione in quattro quadranti:NO(nord-ovest),NE(nord-est), SO(sud-ovest),SE(sud-est). In questo caso, il nodo N divide le regioni che rappresenta, disegnando sia una linea orizzontale che una linea verticale attraverso i punti XVAL e YVAL. 37 STRUTTURA NODO QUADTREE Qt_node_type= record INFO: type_info XVAL: real YVAL: real NO,NE,SO,SE: Qt_node_type 38 STRUTTURA NODO QUADTREE I campi NO,NE,SO,SE corrispondono ognuno ad un figlio del nodo N. quindi ogni nodo potrebbe avere quattro figli. INFO NO SO X NE Y SE 39 INSERIMENTO NEI PUNTI QUADTREE Inizialmente, l’albero è vuoto quindi inseriamo il primo nodo TORINO con i campi XVAL e YVAL rispettivamente(66,83). NO SO NE SE 40 Inseriamo il secondo elemento BIELLA che ha coordinate(74,115), questa città cade nel quadrante NE (risultante della divisione precedente). In questo modo TORINO ha come figlio NE BIELLA. TORINO 66 83 NE BIELLA 74 115 41 42 Inseriamo il terzo elemento, ALESSANDRIA che ha coordinate(98,65). Questo punto si trova a SE della divisione di TORINO. Procediamo con l’inserimento del quarto punto che è CUNEO, con coordinate(42,15), e questo ultimo punto si trova nel quadrante SO . 43 44 45 Se volessimo aggiungere ad. es. un’altra città ALBA, con coordinate (70,49), questa si troverà a SO di ALESSANDRIA. 46 47 CANCELLAZIONE PUNTI QUADTREE Quando cancelliamo un nodo N da un punto quadtree, come nel caso dell’albero a 2-D, per prima cosa dobbiamo trovare un valido sostituto del nodo da cancellare. Nel caso del nodo foglia la cancellazione è banale, infatti basta settare il puntatore del nodo padre a NULL. 48 CANCELLAZIONE PUNTI QUADTREE La cancellazione, invece, di un nodo interno è più complessa. Infatti per prima cosa bisogna trovare un nodo di rimpiazzo, in uno dei sottoalberi N (NO, NE, SO,SE) in modo tale che siano verificate le seguenti proprietà: 1) ogni nodo R1 del sottoalbero N.NO è a NORD-OVEST di R 2)ogni nodo R2 del sottoalbero N.SO è a SUD-OVEST di R 3) ogni nodo R3 del sottoalbero N.NE è a NORD-EST di R 4) ogni nodo R4 del sottoalbero N.SE è a SUD-EST di R 49 QUERY SU INTERVALLI DI VALORI NEI PUNTI QUADTREE Questo argomento viene trattato allo stesso modo degli alberi a K-D. L’intervallo di ricerca viene rappresentato con una circonferenza con coordinate (xc, yc) e raggio r. Ogni nodo nei punti quadtree rappresenta una regione, l’algoritmo di ricerca scarta i sottoalberi la cui radice sono i nodi alle quali le regioni associate non hanno intersezioni con il cerchio di ricerca. 50 Quadtree - MX L’ordine di inserimento dei nodi nei k-tree e nei Quadtree point influenza la forma finale dell’albero. Di conseguenza questo influisce sulla complessità di inserimento e ricerca di un dato nodo N. L’intento dei Quadtree-MX è di rendere indipendente la forma dell’albero rispetto al numero di nodi presenti in esso, così come l’ordine in cui i nodi sono inseriti. Questo tipo di approccio rende gli algoritmi di ricerca e cancellazione più efficienti. 51 Quadtree – MX (Funzionamento) Assumiamo che la mappa da rappresentare sia suddivisa in una griglia di forma per un dato k. Lo sviluppatore può scegliere un k in modo arbitrario, così da poter rispecchiare la granularità desiderata, ma una volta scelto k non può essere cambiato. 52 Quadtree – MX (Struttura) I Quadtree-MX hanno la stessa struttura dei Quadtree Point, salvo per una differenza nella Root dell’albero. Infatti la Root rappresenta la regione specificata da: Tutte le sotto-regioni (NW,SW,NE,SE) hanno lo stesso tipo di rappresentazione delle coordinate, basandosi però su w = XUB – XLB. 53 Quadtree – MX (Inserimento) Fissiamo k = 3 (griglia 8 x 8) Supponiamo di voler inserire i seguenti nodi: Nodo A = Coord (x = 1, y = 3); Nodo B = Coord (x = 3, y = 3); Nodo C = Coord (x = 3, y = 1); Nodo D = Coord (x = 3, y = 0); 54 Quadtree – MX (Inserimento) Nodo generico NW SW NE Root SE 1. Si crea la Root che rappresenta la regione (XLB = o,XUB = 4, YLB = 0, YUB = 4) 2. A risiederà nella sotto-regione NW della Root. Quindi si crea il nodo NW. 55 Quadtree – MX (Inserimento) Nodo generico NW SW NE Root SE 1. Si crea la Root che rappresenta la regione (XLB = o,XUB = 4, YLB = 0, YUB = 4) 2. A risiederà nella sotto-regione NW della Root. Quindi si crea il nodo NW. A 56 Quadtree – MX (Inserimento) Nodo generico NW SW NE SE Root A = (1,3) B = (3,3) A B 57 Nodo generico Quadtree – MX (Inserimento) NW SW NE SE Root A = (1,3) B = (3,3) C = (3,1) A B C 58 Nodo generico Quadtree – MX (Inserimento) NW SW NE SE Root A = (1,3) B = (3,3) C = (3,1) D = (3,0) A B C D 59 Quadtree – MX (Cancellazione) La cancellazione nei Quadtree-MX è abbastanza semplice, perché ogni nodo è rappresentato a livello foglia nell’albero. Se N è un nodo internodi un Quadtree-MX la cui radice è puntata da T, allora la regione implicitamente rappresentata da N contiene almeno un punto esplicitamente contenuto nell’albero. 60 Quadtree – MX (Cancellazione) Per cancellare un punto (x,y) da un albero T si procede come segue: 1. 2. 3. Si imposta il valore del collegamento di N al padre (M) a NULL. Si controlla se gli altri tre campi DIR del padre sono vuoti. Se si, allora si passa al padre di M (P) e si imposta il collegamento nodo figlio (M in questo caso) a NULL. Si procede così ricorsivamente a salire. 61 Quadtree – MX (Cancellazione) In conclusione… Il tempo di accesso all’albero richiede uno scorrimento dall’alto verso il basso (per trovare e cancellare il nodo) ed uno scorrimento dal punto di cancellazione fino alla radice (per eliminare i nodi impliciti ed espliciti che contenevano al più un solo “figlio”). Il tempo richiesto è quindi O(k). 62 Quadtree – MX (Range Query) Sono gestite allo stesso modo dei Quadtree Point, salvo per due differenze: 1. Il contenuto dei campi XUB,XLB,YUB,YLB è differente. 2. Siccome i punti sono tutti immagazzinati al livello foglia, la verifica di un punto per vedere se risiede nel query range, viene fatta solo al livello foglia. 63 R - Tree Questo tipo di strutture dati serve ad immagazzinare “regioni rettangolari” di un’immagine o di una mappa. Gli R-Tree sono davvero efficienti per immagazzinare grandi quantità di dati su disco. Dal momento che l’accesso al disco richiede molto tempo, gli R-Tree garantiscono un metodo conveniente, minimizzando il numero di accessi. 64 R – Tree (Struttura) Rnodetype = record Rec1,……Reck = rectangle; P1,……….Pk = ->rnodetype; End R1 R2 G1 G2 R3 R4 R5 R6 R7 G3 G4 R8 R9 65 R – Tree (Struttura) Ogni R-Tree ha associato un ordine che è un intero k. Ogni nodo che non è una foglia, contiene un insieme di k rettangoli (al massimo) o [k/2] rettangoli (almeno). Root è l’unica eccezione a queste regole. Ogni rettangolo è sia un rettangolo reale che un gruppo di rettangoli. 66 R – Tree (Inserimento) Supponiamo di voler inserire il rettangolo R10 dentro la struttura ad albero vista in precedenza e rappresentata dalla mappa a destra… R7 R5 R6 R4 R1 R 2 R3 R8 R10 R9 67 R – Tree (Inserimento) Il metodo migliore che ci viene suggerito anche dalla figura è quello di inserire il rettangolo R 10 espandendo l’area del gruppo 1 di rettangoli. Infatti, se si cercasse di inserire R 10 dentro il gruppo 3 si averebbe un incremento sostanziale dell’area coperta . R7 R5 R6 R4 R1 R 2 R3 R8 R10 R9 68 R – Tree (Inserimento) Ora vogliamo inserire il rettangolo R11… Abbiamo 2 opzioni: 1. Inserire il rettangolo nel gruppo che ha ancora spazio (in questo caso il gruppo 3). R7 R5 R6 R4 R1 R 2 R3 R10 R11 R8 R9 69 R – Tree (Inserimento) Ora vogliamo inserire il rettangolo R11… Abbiamo 2 opzioni: 1. Inserire il rettangolo nel gruppo che ha ancora spazio (in questo caso il gruppo 3). 2. Creare un sotto-gruppo con le regioni R4 ed R11 R7 R5 R6 R4 R1 R 2 R3 R10 R11 R8 R9 70 R – Tree (Cancellazione) La cancellazione negli R-Tree può violare il vincolo i integrità (ovvero che ci siano sempre almeno [k/2] rettangoli (reali o gruppi). Quindi, quando si elimina un rettangolo dall’albero, bisogna assicurare il vincolo. R7 R5 R6 R4 R1 R 2 R3 R10 R11 R8 R9 71 R – Tree (Cancellazione) G1 G2 R1 R2 R3 R4 R5 R6 R7 G3 G4 R8 R9 72 R – Tree (Cancellazione) G1 G2 G3 G4 Condizione di Underflow R1 R2 R3 R4 R5 R6 R7 R8 73 R – Tree (Cancellazione) G1 G2 G3 G4 Soluzione!!! R1 R2 R3 R4 R6 R7 R8 R5 74 Per concludere… Point Quadtree: Pro: di facile implementazione Contro: un albero con k nodi può avere l’altezza = k e la complessità può arrivare a O(k). Inoltre è richiesta sempre la comparazione di due campi, non solo uno. La cancellazione è spesso difficile. K-d tree: Pro: di facile implementazione Contro: un albero con k nodi può avere l’altezza = k e la complessità è peggiore dei point-Quadtree. La complessità nel caso peggiore della ricerca arriva a 75 Per concludere… Quadtree-MX: Pro: garantiscono l’altezza O(n). Inserimento, cancellazione e ricerca hanno un tempo proporzionale O(n). Il range di ricerca è molto efficiente dove N = numero di punti in risposta alla ricerca e h è l’altezza dell’albero. R-tree: Pro: Ottimi per l’ottimizzazione degli accessi al disco, riducendo notevolmente l’altezza dell’albero. Questo li rende molto popolari. Contro: I rettangoli si possono sovrapporre tra di loro, dando vita a percorsi differenti che portano allo stesso rettangolo. Questo può provocare un accesso multiplo al disco, vanificando l’ottimizzazione. 76