estrutura de dados espaciais §necessidade de indexação dos dados espaciais de modo a reduzir o...
TRANSCRIPT
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 discoA 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-TreeAlgoritmo 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-TreeAlgoritmo 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 R-tree 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-TreeAlgoritmo 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-TreeAlgoritmo 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-TreeAlgoritmo 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-TreeAlgoritmo 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-TreeAlgoritmo 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-TreeAlgoritmo 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-TreeAlgoritmo 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-TreeAlgoritmo 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-TreeDivisã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 2dTécnica bastante simplesO 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
1 5 14
62
3
812
11
13
9
107
4
x y a
tz
b
c d
R
a[8,11,12,13] [3,4,7] d [9,10,13]
b c d
[1,2,5,6] [5,6,14] [2,3,6] [6]x y z t
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
1 5 14
62
3
812
11
13
9
107
4
x y a
tz
b
c d
R
a[8,11,12,13] [3,4,7] d [9,10,13]
b c d
[1,2,5,6] [5,6,14] [2,3,6] [6]x y z t
P
Exemplo de Consulta Ponto P
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
1 5 14
62
3
812
11
13
9
107
4
x y a
tz
b
c d
Inserção em Quadtree
15
16
m n
p q
Como ficará a árvore após as inserções de 15 e 16?
k-d treeUsado 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 página física
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
A
B
C
D
Árvore para figura anterior
K-d Tree
Outro ExemploSejam as cidades com coordenadas
Cidade (X,Y)
Mossoró (19,45)Natal (40,50)Campina Grande (38,38)João Pessoa (54,40)Monteiro (4,4)
K-d Tree
Monteiro
Campina GrandeJoão Pessoa
NatalMossoró
K-d Tree
Inserção de Mossoró
Inserção de Natal
Mossoró (19,45)
Mossoró (19,45)
Natal (40,50)
K-d Tree
Monteiro
Campina GrandeJoão Pessoa
NatalMossoró
K-d Tree
Monteiro
Campina GrandeJoão Pessoa
NatalMossoró
K-d Tree
Inserção de Campina
Campina (38,38)
Mossoró (19,45)
Natal (40,50)
K-d Tree
Monteiro
Campina GrandeJoão Pessoa
NatalMossoró
K-d Tree
Inserção de João Pessoa:
Campina(38,38)
Mossoró (19,45)
Natal (40,50)
JP(54,40)
K-d Tree
Monteiro
Campina GrandeJoão Pessoa
NatalMossoró
K-d Tree
Inserção de Monteiro:
Campina(38,38)
Mossoró (19,45)
Natal (40,50)
JP(54,40)
Monteiro(4,4)
K-d Tree
Monteiro
Campina GrandeJoão Pessoa
NatalMossoró
K-D-Tree
A
B
C
D
Árvore para figura anterior