You are on page 1of 29

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 espao
rvores k-d
Dados: k dimenses
rvores k-d so rvores binrias
Objetivo manipular dados espaciais em
memria principal de modo simples
rvores k-d

N consiste de:
ponteiros para filhos esquerda e direita
chave k-dimensional
informaes satlite (por exemplo, nome de um
local)
rvores k-d construo

A cada passo escolha uma coordenada como


base para dividir o restante dos pontos

Exemplo: na raiz escolha coordenada x


como em uma rvore binria, todos os itens
esquerda tero valor de x menor que o da raiz
e todos os itens direita tero valor de x maior ou
igual ao da raiz
rvores k-d construo

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 construo
Exemplo em 2D: insero 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 construo
Exemplo em 2D: insero 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 insero
chamada inicial
root = insere_kd (ponto, root, 0);

nodokd insere_kd (ponto, nodo, profundidade) {


// selecionar dimenso
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,
profundidade+1)
return nodo;
}
rvores k-d insero

No so feitas rotaes para manter


balanceamento
assume-se que se dados so inseridos
aleatoriamente, estrutura ser balanceada
rvores k-d insero
Heurstica
para um conjunto de dados esttico, pode-se
procurar pelas medianas para insero balanceada
rvores k-d FindMin

FindMin(d): encontrar o ponto com o menor valor na


d-sima dimenso
travessia recursiva na rvore
se a dimenso de corte do nodo for igual a d ento
menor valor no est na sub-rvore direita, logo acesse
recursivamente apenas ponteiro esquerda
se no houve sub-rvore esquerda, ento ndo corrente
tem o menor valor na dimenso d
se a dimenso de corte do nodo for diferente de d ento
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 remoo
Encontrar nodo
Se nodo uma folha, remova-o e atribua NULL no
ponteiro do seu ancestral
Seno
encontre na sub-rvore elemento para substitu-lo:
se ndo tem sub-rvore direita, FindMin(T.right,d)
elemento que tem o menor valor para a dimenso d
seno 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 remoo
Por que no encontrar o elemento com maior valor
na dimenso d na sub-rvore esquerda?
pois se houverem outros pontos nessa sub-rvore com
esse valor mximo na dimenso d, eles no podero
ser encontrados por conta da condio de menor
esquerda (e maior ou igual direita)
rvores k-d remoo
rvores k-d remoo
Exemplo: remoo da raiz (35,60)

(35,60) x

(20,45) (60,80) y
Remover raiz (35,60):
(10,35) (80,40) x encontrar o elemento
na sub-rvore a
(20,20) (50,30) (90,60) y direita que tem o
menor valor para a
(70,20) x dimenso x: (50,30)

(60,10) y
rvores k-d remoo
Exemplo: remoo da raiz (35,60)

(50,30) x

(20,45) (60,80) y
Para substituir o
(10,35) (80,40) x elemento (50,30),
encontrar o elemento
com menor valor na
(20,20) (50,30) (90,60) y dimenso y na sub-
rvore esquerda (pois
(70,20) x no h sub-rvore
direita), entretanto ligar
(60,10) y sub-rvore esquerda
no ponteiro direita
rvores k-d remoo
Exemplo: remoo da raiz (35,60)

(50,30) x (50,30)

(20,45) (60,80) y (20,45) (60,80)

(10,35) (80,40) x (10,35) (80,40)

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

(70,20) 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 regio
encontrar todos os pontos que esto dentro de um hiper-
retngulo k-dimensional
Consulta por abrangncia
encontrar todos os pontos que tem distncia ao ponto de
consulta menor ou igual que um raio
Consulta ao vizinho mais prximo (nearest neighbor)
dada uma funo de distncia e um ponto p, encontrar o
vizinho mais prximos ao ponto p
Nearest neighbor
Dado um ponto Q, encontre o ponto P mais prximo
No funciona: encontrar a clula que poderia conter o
ponto Q e retornar o ponto
razo: o ponto mais prximo no espao pode estar
longe de P na rvore

(52,52)
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.

28
Referncia

Contm slides e figuras do curso CMSC 420:


Data Structures da University of Maryland
http://www.cs.umd.edu/class/spring2008/cmsc420/

29

You might also like