Estrutura de Dados Espaciais Necessidade de indexação dos dados espaciais de modo a reduzir o tempo de acesso aos mesmo Métodos de indexação tradicionais não são indicados para dados espaciais Hash: não atendem a consultas de faixa (reange queries) B-Tree: trata apenas uma dimensão Estrutura de Dados Espaciais Operação comum com dados espaciais é a pesquisa de objetos que estão numa determinada área Ex.: Encontre todos os hospitais que estão a no máximo 20KM deste ponto Estrutura de Dados Espaciais Algumas estruturas de dados propostas: Grid quad-trees k-d-tree r-tree R-Tree É uma árvore similar a uma B+-tree, com índices para dados nas folhas Nós correspondem à páginas de disco A estrutura é projetada de forma que uma pesquisa espacial requer visitar um número pequeno de nós Um BD espacial consiste de tuplas representando objetos espaciais, onde cada tupla possui um identificador R-Tree Nós folhas contêm entradas da forma: (R, TId) Onde: R contém o retângulo que encobre a área da tupla identificada por TId. Este retângulo é conhecido por Minimum Bounding Box Ex. R-Tree Nós não -folhas contêm entradas da forma: (R, Filho) Onde R é o retângulo que envolve todos os retângulos dos descendentes deste nó e Filho é o endereço do nó filho R-Tree Definição: Sejam M e m o número máximo e mínimo de entradas de um nó respectivamente, tal que m <= M/2 Uma R-tree satisfaz às seguintes propriedades: P1. Cada nó contém entre M e m entradas, exceto a raiz P2. Para cada registro de índice (R, TId), R é o menor retângulo que espacialmente contém os dados n-dimensionais representados pela tupla TId R-Tree Definição (cont) P3. Cada nó tem entre M e m filhos, exceto a raiz P4. Para cada entrada (R, filho) num nó não folha, T é o menor retângulo que espacialmente contém os retângulos descendentes P5. O nó raiz tem pelo menos dois filhos a menos que seja um nó folha P6. Todas as folhas aparecem num mesmo nível R-Tree R-Tree R-Tree Algoritmo de Busca Inicia-se na raiz de forma similar a uma B-tree Entretanto, mais de uma sub-árvore pode ser visitada R-Tree Algoritmo Busca: Dada uma R-tree cujo nó raiz é T, encontre todos os registros de índices cujos retângulos sobrepões (overlap) o retângulo de busca S. S1: Pesquisa Sub-árvores • Se T não é folha, verifique cada entrada E para determinar se E.R sobrepõe S • Para todas entradas que sobrepõem, chame Pesquisa(E.Tid) S2: Se T é folha, verifique todas as entradas E para determinar se E.R sobrepõe S. Se sim, E é um registro do resultado. R-Tree Algoritmo Inserção (similar à inserção em B-tree: inserção nas folhas, nós que ficam cheios são divididos e divisão se propaga até a raiz):Inserir uma nova entrada E na Rtree I1. Encontre a posição para o novo registro : chamar escolhaFolha() para selecionar o nó folha L que conterá E I2. Adicione o registro ao nó folha: Se L tem espaço coloque E, senão chame divideNo() para obter L e LL que conterá E mais as entradas de L R-Tree Algoritmo Inserção I3. Propagar mudanças para cima: chame ajusteTree() em L, também passando LL se uma divisão foi realizada I4. Árvore cresce: Se uma propogação de divisão de nó causar a raiz dividir-se, então crie uma nova raiz cujos filhos são os dois nós resultantes R-Tree Algoritmo escolhaFolha() EF1. Inicialize: N = raiz EF2. Verifique Folhas: Se N é folha, retorne N EF3. Escolha sub-árvore: Se N não é folha, Seja F a entrada em N cujo retângulo F.R precisa do menor crescimento para incluir E.R (escolhe-se a entrada com retângulo de menor área) EF4. Descer até encontrar folha: Faça N ser o nó filho apontado por F.Tid e volte para EF2. R-Tree Algoritmo ajusteTree() AT1. Inicialize: N = L. Se L foi dividido faça NN = LL AT2. Verifique se já finalizou: Se N é raiz, então pare. AT3. Ajuste retângulo na entrada pai: Seja P o pai do nó N, e seja En a n-ésima entrada em P. Ajuste En.R de modo que englobe todos os retângulos em N. R-Tree Algoritmo ajusteTree() (cont) AT4. Propagar divisão de nós para cima: • Se N tem um irmão NN resultante de uma divisão anterior, crie uma nova entrada ENN com ENN.Tid apontando para NN e ENN.R englobando todos retângulos de NN. • Adicione ENN a P se existir espaço • Caso contrário chame divideNo() para produzir P e PP contendo ENN e todas as entradas de P AT5. Mova para cima para o próximo nível • Faça N=P e NN=PP • Se uma divisão ocorrer, repita de AT2. R-Tree Algoritmo Remoção(): Remove um registro E de uma R-tree R1. Encontre o nó contendo o registro: • Chame encontreFolha() para localizar o nó folha L contendo E • Pare se o registro não foi encontrado R2. Remova o registro: remova E de L R3. Propague as mudanças: chame árvoreDensa(), passando L R5. Diminua a árvore: se a raiz tem apenas um filho depois que a árvore foi ajustadam faça este filho a nova raiz R-Tree Algoritmo encontreFolha(): • Dada uma R-tree cuja raiz é T, encontre a folha contendo a entrada E EF1: Pesquise Sub-árvores • SE T não é folha, verifique cada entrada F em T para determinar se F.R sobrepõe E.R • Para cada tal entrada cmae encotreFolha(() na árvore cuja raiz é apontada por F.Tid até que E seja encontrado ou todas as entradas tenham sido checadas EF2: Pesquise nó folha : • Se T é folha verifique cada entrada para ver se casa com E • Se E não for encontrada, retornar T R-Tree Algoritmo condensaTree • Dado um nó folha L que tenha tido uma entrada removida, elimine o nodo se ele tem poucas entradas e realoque suas entradas • Propague a eliminação do nó para cima quando necesário • Ajuste todos os retângulos no caminho no sentido da raiz, fazendo-os menores quando possível CT1. Inicialize: Faça N =L, Seja Q, o conjunto de nós eliminados inicialmente vazio. CT2. Encontra a entrada pai • Se N é raiz, vá para CT6 • Seja P o pai de N, e En a N entrada em P R-Tree Algoritmo condensaTree (cont) CT3. Elimine nós underflow: • Se N tem menos que m entradas, remova En de P e adicione N ao conjunto Q CT4. Ajuste retângulo • Se N não foi eliminado, ajuste EN.R para conter todas as entradas em N. CT5. Mova para cima um nível: Faça N=P e repita de CT2 CT6. Re-insira entradas orfãs • Re-insira toras as entradas de nodos do conjunto Q R-Tree Divisão de Nó Para adicionar uma nova entrada a um nó cheio é necessário dividir as entradas em dois nós A divisão deve ser feita de modo que seja improvável que ambos nós sejam examinados em pesquisas subsequentes Uma vez que a decisão de visitar um nó depende se seu retângulo sobrepões a área sendo pesquisada, a área total dos dois retângulos deve ser minimizada R-Tree Veja que a área do Bad Split é muito maior do que a área de Good Split Quad trees Acelera o acesso a dados num plano 2d Técnica bastante simples O espaço de busca é recursivamente decomposto em quadrantes até que o número de retângulos sobrepondo cada quadrante é menor do que a capacidade da página. Os quadrante são nomeados: Noroeste, Nordeste, Sudeste e Sudoeste Quad trees O índice é representado como uma árvore quaternária (cada nó interno tem 4 filhos, um por quadrante) Cada folha é associada com uma página de disco Cada retângulo aparece em todos os quadrantes folhas que o sobrepõem Quad trees x 1 2 y 5 a 14 8 6 t z 11 R 12 a 13 3 c 7 4 b 9 10 b [8,11,12,13] c d [3,4,7] d [9,10,13] d x y z t [1,2,5,6] [5,6,14] [2,3,6] [6] Quad tree Consulta de ponto (point query) é simples em quad tree. Um único path (caminho) é percorrido da raiz até a folha Em cada nível, é escolhido um dos quadrantes que contém o ponto da consulta Quad trees Exemplo de Consulta Ponto P x y a b 11 1 5 14 2 8 6 z t 12 P 13 3 c 9 d 7 4 10 R a b [8,11,12,13] x y z c d [3,4,7] d [9,10,13] t [1,2,5,6] [5,6,14] [2,3,6] [6] Quad trees Inserção em quadtrees um retângulo será inserido em cada quadrante folha que o sobrepõe então todos os caminhos que para as folhas que sobrepõem o retângulo a ser inserido são percoridos a página P associada com cada folha é lida Se P não está cheio, então insere o novo retângulo Quad trees Inserção em quadtrees (cont) Se P estiver cheio, O quadrante deve ser dividido em quatro quadrantes e 3 novas páginas são alocadas As entradas da página antiga mais a página nova são divididas nas quatro páginas Uma entrada E é adicionada a toda página cujo quadrante intercepta E.MBR (Minimum Bounding Rectangle) Quad trees Inserção em Quadtree x 1 2 y 5 am 14 p 8 6 t z 3 n 11 b 15 12 q 13 16 c 7 9 d 10 4 Como ficará a árvore após as inserções de 15 e 16? k-d tree Usado para representar pontos árvore kd particiona o espaço em células é uma árvore de busca binária, reside em memória principal, tal que os nós interiores em cada nível contêm valores referentes a um único eixo, X ou Y, alternadamente as folhas apontam para páginas físicas Várias folhas podem apontar para a mesma k-d tree o valor armazenado na raiz divide o espaço em dois subespaços através de uma reta perpendicular ao eixo dos X, digamos; o valor armazenado no filho à esquerda (ou direita) por sua vez divide o subespaço à esquerda (ou direita) em dois subespaços através de uma reta perpendicular ao eixo dos Y ; e assim por diante, alternando as dimensões. K-D-Tree K-D-Tree Árvore para figura anterior A B D C K-d Tree Outro Exemplo Sejam as cidades com coordenadas Cidade Mossoró Natal Campina Grande João Pessoa Monteiro (X,Y) (19,45) (40,50) (38,38) (54,40) (4,4) K-d Tree Natal Mossoró João Pessoa Campina Grande Monteiro K-d Tree Inserção de Mossoró Mossoró (19,45) Inserção de Natal Mossoró (19,45) Natal (40,50) K-d Tree Natal Mossoró João Pessoa Campina Grande Monteiro K-d Tree Natal Mossoró João Pessoa Campina Grande Monteiro K-d Tree Inserção de Campina Mossoró (19,45) Natal (40,50) Campina (38,38) K-d Tree Natal Mossoró João Pessoa Campina Grande Monteiro K-d Tree Inserção de João Pessoa: Mossoró (19,45) Natal (40,50) Campina(38,38) JP(54,40) K-d Tree Natal Mossoró João Pessoa Campina Grande Monteiro K-d Tree Inserção de Monteiro: Mossoró (19,45) Monteiro(4,4) Natal (40,50) Campina(38,38) JP(54,40) K-d Tree Natal Mossoró João Pessoa Campina Grande Monteiro K-D-Tree Árvore para figura anterior A B D C