Você está na página 1de 29
Árvores k-d Humberto Razente

Árvores k-d

Humberto Razente

Árvores k-d

J. L. Bentley. Multidimensional binary search trees used for associative searching. Communications of the ACM, 18(9):509-517,

1975.

multidimensional binary search tree (k-d tree)

k é a dimensionalidade do espaço

Árvores k-d

Dados: k dimensões

Árvores k-d são árvores binárias

Objetivo é manipular dados espaciais em memória principal de modo simples

 Árvores k-d são árvores binárias  Objetivo é manipular dados espaciais em memória principal de

Árvores k-d

Nó consiste de:

ponteiros para filhos à esquerda e à direita

chave k-dimensional

informações satélite (por exemplo, nome de um local)

Árvores k-d – construção

A cada passo escolha uma coordenada como base para dividir o restante dos pontos

Exemplo: na raiz escolha coordenada x

como em uma árvore binária, todos os itens à esquerda terão valor de x menor que o da raiz

e todos os itens à direita terão valor de x maior ou igual ao da raiz

Árvores k-d – construção

Escolha a coordenada y para como base para os filhos da raiz

Escolha a coordenada z para os netos da raiz

Escolha a coordenada x novamente para os filhos dos netos da raiz

< >=
<
>=

e assim por diante

Árvores k-d – construção

Exemplo em 2D: inserção dos pontos (35,90), (70,80), (10,75) (80,40), (50,90), (70,30), (90,60), (50,25), (25,10), (20,50) e (60,10)

inserção dos pontos (35,90), (70,80), (10,75) (80,40), (50,90), (70,30), (90,60), (50,25), (25,10), (20,50) e (60,10)

Árvores k-d – construção

Exemplo em 2D: inserção dos pontos (35,90), (70,80), (10,75) (80,40), (50,90), (70,30), (90,60), (50,25), (25,10), (20,50) e (60,10)

inserção dos pontos (35,90), (70,80), (10,75) (80,40), (50,90), (70,30), (90,60), (50,25), (25,10), (20,50) e (60,10)
inserção dos pontos (35,90), (70,80), (10,75) (80,40), (50,90), (70,30), (90,60), (50,25), (25,10), (20,50) e (60,10)

Árvores k-d – inserção

chamada inicial

root = insere_kd (ponto, root, 0);

nodokd insere_kd (ponto, nodo, profundidade) { // selecionar dimensão int dim = profundidade mod k;

if (nodo == NULL) nodo = new nodokd(ponto) else if (ponto[dim] < nodo.ponto[dim]) nodo.esq = insere_kd(ponto, nodo.esq,

profundidade+1)

else nodo.dir = insere_kd(ponto, nodo.dir,

return nodo;

}

profundidade+1)

Árvores k-d – inserção

Não são feitas rotações para manter balanceamento

assume-se que se dados são inseridos aleatoriamente, estrutura será balanceada

Árvores k-d – inserção

Heurística

para um conjunto de dados estático, pode-se procurar pelas medianas para inserção balanceada

 Heurística  para um conjunto de dados estático, pode-se procurar pelas medianas para inserção balanceada

Árvores k-d – FindMin

FindMin(d): encontrar o ponto com o menor valor na d-ésima dimensão

travessia recursiva na árvore

se a dimensão de corte do nodo for igual a d então

menor valor não está na sub-árvore à direita, logo acesse recursivamente apenas ponteiro à esquerda

se não houve sub-árvore à esquerda, então nódo corrente tem o menor valor na dimensão d

se a dimensão de corte do nodo for diferente de d então

menor valor pode estar em ambas as sub-árvores, logo acesse recursivamente os ponteiros à esquerda e à direita

Árvores k-d – FindMin

Árvores k-d – FindMin
Árvores k-d – FindMin

Árvores k-d – FindMin

Árvores k-d – FindMin
Árvores k-d – FindMin

Árvores k-d – FindMin

Árvores k-d – FindMin

Árvores k-d – remoção

Encontrar nodo

Se nodo é uma folha, remova-o e atribua NULL no ponteiro do seu ancestral

Senão

encontre na sub-árvore elemento para substituí-lo:

se nódo tem sub-árvore à direita, FindMin(T.right,d)

elemento que tem o menor valor para a dimensão d

senão na sub-árvore à esquerda FindMin(T.left,d)

troque o elemento T pelo resultado do FindMin

coloque a sub-árvore à esqueda no ponteiro à direita

repita recursivamente

Árvores k-d – remoção

Por que não encontrar o elemento com maior valor na dimensão d na sub-árvore à esquerda?

pois se houverem outros pontos nessa sub-árvore com esse valor máximo na dimensão d, eles não poderão ser encontrados por conta da condição de menor à esquerda (e maior ou igual à direita)

Árvores k-d – remoção

Árvores k-d – remoção

Árvores k-d – remoção

Exemplo: remoção da raiz (35,60)

(35,60)

x x

 Exemplo: remoção da raiz (35,60) (35,60) x x (20,45)(20,45) (60,80) (10,35) (80,40) x (20,20) (50,30)
 Exemplo: remoção da raiz (35,60) (35,60) x x (20,45)(20,45) (60,80) (10,35) (80,40) x (20,20) (50,30)

(20,45)(20,45)

(60,80)

remoção da raiz (35,60) (35,60) x x (20,45)(20,45) (60,80) (10,35) (80,40) x (20,20) (50,30) (90,60) (70,20)

(10,35)

da raiz (35,60) (35,60) x x (20,45)(20,45) (60,80) (10,35) (80,40) x (20,20) (50,30) (90,60) (70,20) (60,10)

(80,40)

x

(35,60) (35,60) x x (20,45)(20,45) (60,80) (10,35) (80,40) x (20,20) (50,30) (90,60) (70,20) (60,10) y x
(35,60) (35,60) x x (20,45)(20,45) (60,80) (10,35) (80,40) x (20,20) (50,30) (90,60) (70,20) (60,10) y x
(35,60) (35,60) x x (20,45)(20,45) (60,80) (10,35) (80,40) x (20,20) (50,30) (90,60) (70,20) (60,10) y x
(35,60) (35,60) x x (20,45)(20,45) (60,80) (10,35) (80,40) x (20,20) (50,30) (90,60) (70,20) (60,10) y x
(35,60) (35,60) x x (20,45)(20,45) (60,80) (10,35) (80,40) x (20,20) (50,30) (90,60) (70,20) (60,10) y x
(35,60) (35,60) x x (20,45)(20,45) (60,80) (10,35) (80,40) x (20,20) (50,30) (90,60) (70,20) (60,10) y x

(20,20) (50,30) (90,60)

(60,80) (10,35) (80,40) x (20,20) (50,30) (90,60) (70,20) (60,10) y x y y  Remover raiz

(70,20)

(60,80) (10,35) (80,40) x (20,20) (50,30) (90,60) (70,20) (60,10) y x y y  Remover raiz

(60,10)

y

x

y

y

Remover raiz (35,60):

encontrar o elemento na sub-árvore a

direita que tem o menor valor para a dimensão x: (50,30)

Árvores k-d – remoção

Exemplo: remoção da raiz (35,60)

(50,30)

x x

 Exemplo: remoção da raiz (35,60) (50,30) x x (20,45)(20,45) (60,80) (10,35) (80,40) x (20,20) (50,30)
 Exemplo: remoção da raiz (35,60) (50,30) x x (20,45)(20,45) (60,80) (10,35) (80,40) x (20,20) (50,30)

(20,45)(20,45)

(60,80)

remoção da raiz (35,60) (50,30) x x (20,45)(20,45) (60,80) (10,35) (80,40) x (20,20) (50,30) (90,60) (70,20)

(10,35)

da raiz (35,60) (50,30) x x (20,45)(20,45) (60,80) (10,35) (80,40) x (20,20) (50,30) (90,60) (70,20) (60,10)

(80,40)

x

(35,60) (50,30) x x (20,45)(20,45) (60,80) (10,35) (80,40) x (20,20) (50,30) (90,60) (70,20) (60,10) y x
(35,60) (50,30) x x (20,45)(20,45) (60,80) (10,35) (80,40) x (20,20) (50,30) (90,60) (70,20) (60,10) y x
(35,60) (50,30) x x (20,45)(20,45) (60,80) (10,35) (80,40) x (20,20) (50,30) (90,60) (70,20) (60,10) y x
(35,60) (50,30) x x (20,45)(20,45) (60,80) (10,35) (80,40) x (20,20) (50,30) (90,60) (70,20) (60,10) y x
(35,60) (50,30) x x (20,45)(20,45) (60,80) (10,35) (80,40) x (20,20) (50,30) (90,60) (70,20) (60,10) y x

(20,20) (50,30) (90,60)

(60,80) (10,35) (80,40) x (20,20) (50,30) (90,60) (70,20) (60,10) y x y y  Para substituir

(70,20)

(60,80) (10,35) (80,40) x (20,20) (50,30) (90,60) (70,20) (60,10) y x y y  Para substituir

(60,10)

y

x

y

y

Para substituir o elemento (50,30), encontrar o elemento com menor valor na

dimensão y na sub- árvore à esquerda (pois não há sub-árvore à direita), entretanto ligar sub-árvore à esquerda no ponteiro à direita

Árvores k-d – remoção

Exemplo: remoção da raiz (35,60)

(50,30)

(50,30)

x x

 Exemplo: remoção da raiz (35,60) (50,30) (50,30) x x (20,45)(20,45) (60,80) y (20,45)(20,45) (80,40) x
 Exemplo: remoção da raiz (35,60) (50,30) (50,30) x x (20,45)(20,45) (60,80) y (20,45)(20,45) (80,40) x

(20,45)(20,45)

(60,80)

y

(20,45)(20,45)

(50,30) x x (20,45)(20,45) (60,80) y (20,45)(20,45) (80,40) x y (10,35) (60,80) (10,35) (80,40) (20,20) (60,10)
(50,30) x x (20,45)(20,45) (60,80) y (20,45)(20,45) (80,40) x y (10,35) (60,80) (10,35) (80,40) (20,20) (60,10)

(80,40)

x x (20,45)(20,45) (60,80) y (20,45)(20,45) (80,40) x y (10,35) (60,80) (10,35) (80,40) (20,20) (60,10) (90,60)

x

x (20,45)(20,45) (60,80) y (20,45)(20,45) (80,40) x y (10,35) (60,80) (10,35) (80,40) (20,20) (60,10) (90,60)
x (20,45)(20,45) (60,80) y (20,45)(20,45) (80,40) x y (10,35) (60,80) (10,35) (80,40) (20,20) (60,10) (90,60)
x (20,45)(20,45) (60,80) y (20,45)(20,45) (80,40) x y (10,35) (60,80) (10,35) (80,40) (20,20) (60,10) (90,60)

y

(20,45)(20,45) (60,80) y (20,45)(20,45) (80,40) x y (10,35) (60,80) (10,35) (80,40) (20,20) (60,10) (90,60)

(10,35)

(60,80) y (20,45)(20,45) (80,40) x y (10,35) (60,80) (10,35) (80,40) (20,20) (60,10) (90,60) (70,20)
(60,80) y (20,45)(20,45) (80,40) x y (10,35) (60,80) (10,35) (80,40) (20,20) (60,10) (90,60) (70,20)
(60,80) y (20,45)(20,45) (80,40) x y (10,35) (60,80) (10,35) (80,40) (20,20) (60,10) (90,60) (70,20)
(60,80) y (20,45)(20,45) (80,40) x y (10,35) (60,80) (10,35) (80,40) (20,20) (60,10) (90,60) (70,20)

(60,80)

(60,80) y (20,45)(20,45) (80,40) x y (10,35) (60,80) (10,35) (80,40) (20,20) (60,10) (90,60) (70,20) (20,20)

(10,35)

(80,40)

(20,45)(20,45) (80,40) x y (10,35) (60,80) (10,35) (80,40) (20,20) (60,10) (90,60) (70,20) (20,20) (60,10) (90,60) x
(20,45)(20,45) (80,40) x y (10,35) (60,80) (10,35) (80,40) (20,20) (60,10) (90,60) (70,20) (20,20) (60,10) (90,60) x
(20,45)(20,45) (80,40) x y (10,35) (60,80) (10,35) (80,40) (20,20) (60,10) (90,60) (70,20) (20,20) (60,10) (90,60) x
(20,45)(20,45) (80,40) x y (10,35) (60,80) (10,35) (80,40) (20,20) (60,10) (90,60) (70,20) (20,20) (60,10) (90,60) x
(20,45)(20,45) (80,40) x y (10,35) (60,80) (10,35) (80,40) (20,20) (60,10) (90,60) (70,20) (20,20) (60,10) (90,60) x

(20,20) (60,10) (90,60)

(80,40) x y (10,35) (60,80) (10,35) (80,40) (20,20) (60,10) (90,60) (70,20) (20,20) (60,10) (90,60) x (70,20)

(70,20)

(80,40) x y (10,35) (60,80) (10,35) (80,40) (20,20) (60,10) (90,60) (70,20) (20,20) (60,10) (90,60) x (70,20)

(20,20) (60,10) (90,60)

x
x

(70,20)

(80,40) x y (10,35) (60,80) (10,35) (80,40) (20,20) (60,10) (90,60) (70,20) (20,20) (60,10) (90,60) x (70,20)

(60,10)

y

Consultas

Consulta pontual:

em uma k-d com k=3, selecionar ponto (30,25,90)

Consulta pontual parcial

em uma k-d com k=3, selecionar ponto (30,25,?)

Consulta por região

encontrar todos os pontos que estão dentro de um hiper- retângulo k-dimensional

Consulta por abrangência

encontrar todos os pontos que tem distância ao ponto de consulta menor ou igual que um raio

Consulta ao vizinho mais próximo (nearest neighbor)

dada uma função de distância e um ponto p, encontrar o vizinho mais próximos ao ponto p

Nearest neighbor

Dado um ponto Q, encontre o ponto P mais próximo

Não funciona: encontrar a célula que poderia conter o ponto Q e retornar o ponto

razão: o ponto mais próximo no espaço pode estar longe de P na árvore

(52,52)
(52,52)

Nearest neighbor

Nearest neighbor

Nearest neighbor

Nearest neighbor

Nearest neighbor

Nearest neighbor

Nearest neighbor

Nearest neighbor

Leitura complementar

J. L. Bentley. Multidimensional binary search trees used for associative searching. Communications of the ACM, 18(9):509-517,

1975.

Referência

Contém slides e figuras do curso ”CMSC 420:

Data Structures” da University of Maryland

http://www.cs.umd.edu/class/spring2008/cmsc420/