You are on page 1of 5

rbol kd

1
rbol kd
Un rbol kd tridimensional. La primera divisin (rojo) corta la celda raz (blanco) en dos
subceldas, que son divididas a su vez (verde) en dos subceldas. Finalmente, cada una de
esas cuatro es dividida (azul) en dos subceldas. Dado que no hay ms divisiones, las ocho
finales se llaman hojas. Las esferas amarillas representan los nodos del rbol.
En ciencias de la computacin, un
rbol kd (abreviatura de rbol
k-dimensional) es una estructura de
datos de particionado del espacio que
organiza los puntos en un Espacio
eucldeo de k dimensiones. Los rboles
kd son un caso especial de los rboles
BSP.
Un rbol kd emplea slo planos
perpendiculares a uno de los ejes del
sistema de coordenadas. Esto difiere de
los rboles BSP, donde los planos
pueden ser arbitrarios. Adems, todos
los nodos de un rbol kd, desde el nodo
raz hasta los nodos hoja, almacenan
un punto. Mientras tanto, en los
rboles BSP son las hojas los nicos
nodos que contienen puntos (u otras
primitivas geomtricas). Como
consecuencia, cada plano debe pasar a
travs de uno de los puntos del rbol
kd.
Tcnicamente, la letra k se refiere al
nmero de dimensiones. Un rbol kd tridimensional podra ser llamado un rbol 3d. Sin embargo se suele emplear la
expresin "rbol kd tridimensional". (Tambin es ms descriptivo, ya que un rbol tridimensional puede ser varias
cosas, pero el trmino rbol kd se refiere a un tipo en concreto de rbol de particionado.) Las letras k y d se escriben
en minsculas, incluso al principio de una oracin. La k se escribe en cursiva, aunque son tambin comunes las
formas "rbol KD" y "rbol Kd".
Operaciones en rboles k
Construir un rbol k
Dado que hay muchas maneras posibles de elegir planos alineados a los ejes, hay muchas maneras de generar rboles
kd. El sistema habitual es:
Conforme se desciende en el rbol, se emplean ciclos a travs de los ejes para seleccionar los planos. (Por
ejemplo, la raz puede tener un plano alineado con el eje x, sus descendientes tendran planos alineados con el y y
los nietos del raz alineados con el z, y as sucesivamente)
En cada paso, el punto seleccionado para crear el plano de corte ser la mediana de los puntos puestos en el rbol
kd, lo que respeta sus coordenadas en el eje que est siendo usado.
Este mtodo lleva a un rbol kd balanceado, donde cada nodo hoja est a la misma distancia de la raz. De todas
formas, los rboles balanceados no son necesariamente ptimos para todas las aplicaciones.
Dada una lista de n puntos, el siguiente algoritmo genera un rbol kd balanceado que contiene dichos puntos.
rbol kd
2
function kdtree (list of points pointList, int depth)
{
if pointList is empty
return nil;
else
{
// Select axis based on depth so that axis cycles through all valid values
var int axis := depth mod k;
// Sort point list and choose median as pivot element
sort pointList using predicate: point1[axis] < point2[axis];
choose median from pointList;
// Create node and construct subtrees
var tree_node node;
node.location := median;
node.leftChild := kdtree(points in pointList before median, depth+1);
node.rightChild := kdtree(points in pointList after median, depth+1);
return node;
}
}
Este algoritmo implementado en Python sera:
class Node:pass
def kdtree(pointList, depth=0):
if not pointList:
return
# Select axis based on depth so that axis cycles through all valid
values
k = len(pointList[0]) # assumes all points have the same dimension
axis = depth % k
# Sort point list and choose median as pivot element
pointList.sort(key=lambda x:x[axis])
median = len(pointList)/2 # choose median
# Create node and construct subtrees
node = Node()
node.location = pointList[median]
node.leftChild = kdtree(pointList[0:median], depth+1)
node.rightChild = kdtree(pointList[median+1:], depth+1)
return node
Un ejemplo de uso:
rbol kd
3
pointList = [(2,3),(5,4),(9,1),(4,7),(8,1)]
tree = kdtree(pointList)
Este algoritmo crea el invariante para cualquier nodo. Todos los nodos en el subrbol de la izquierda estn en un lado
del plano de corte, y todos los nodos del subrbol de la derecha estn en el otro lado. El plano de corte de un nodo
pasa a travs del punto asociado con ese nodo (referenciado en el cdigo por node.location)
Aadir elementos a un rbol kd
Los nodos se aaden a un rbol kd de la misma forma que se aaden a cualquier otro rbol. Primero, se recorre el
rbol empezando por la raz y siguiendo por el nodo de la izquierda o de la derecha dependiendo de si el punto que
se quiere insertar est en la derecha o en la izquierda del plano de corte. Una vez que se llega a un nodo hoja, se
aade el nuevo punto a la izquierda o a la derecha del nodo hoja, de nuevo dependiendo de en que lado del plano se
encuentra el nuevo punto.
Eliminar elementos de un rbol kd
Eliminar un punto de un rbol kd sin romper el invariante. (POR HACER)
Equilibrar un rbol kd
Hay que ser cuidadoso al equilibrar un rbol kd. Como estos rboles estn ordenados en mltiples dimensiones, no se
puede emplear la tcnica de rotacin de rboles para equilibrarlos esto rompera el invariante.
Usos de un rbol kd
Implementacin en CBR ( Razonamiento Basado En Casos)
Bsqueda ortogonal en un rbol kd
Usar un rbol kd para encontrar todos los puntos que se encuentran en un rectngulo determinado (o anlogo de ms
dimensiones). Esta operacin tambin se denomina rango de bsqueda ortogonal.
Determinar dnde evaluar una superficie
En las regresiones locales es comn evaluar la superficie contenida directamente slo por los vrtices del rbol kd e
interpolar en algn punto. Este uso, reflejado en la imagen de arriba, busca asegurar que slo se realizarn las
evaluaciones directas necesarias. Como los rboles kd se "adaptan" al espacio, este mtodo puede suministrar una
excelente aproximacin a las verdaderas superficies de regresin local. Si la aproximacin es pobre, puede mejorarse
con ms subdivisiones.
rbol kd
4
Complejidad
Construir un rbol kd esttico a partir de n puntos es de O(nlogn).
Insertar un nuevo punto en un rbol kd balanceado es de O(logn).
Eliminar un punto de un rbol kd balanceado es de O(logn).
Enlaces externos (ingls)
C++ library that uses kd-trees for Approximate Nearest Neighbor Searching
[1]
Referencias
[1] http:/ / www. cs. umd.edu/ ~mount/ ANN/
Fuentes y contribuyentes del artculo
5
Fuentes y contribuyentes del artculo
rbol kd Fuente: http://es.wikipedia.org/w/index.php?oldid=68575678 Contribuyentes: Airunp, Alvaro qc, CommonsDelinker, Dusan, Estructuras, GermanX, Khaine, Lasneyx, Petronas,
Thorin, 13 ediciones annimas
Fuentes de imagen, Licencias y contribuyentes
Archivo:3dtree.png Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:3dtree.png Licencia: GNU General Public License Contribuyentes: Btyner, 2 ediciones annimas
Licencia
Creative Commons Attribution-Share Alike 3.0
//creativecommons.org/licenses/by-sa/3.0/

You might also like