€rbol kd
1
€rbol kd En ciencias de la computaci‚n, un €rbol kd (abreviatura de •rbol k-dimensional) es una estructura de datos de particionado del espacio que organiza los puntos en un Espacio euclƒdeo de k dimensiones. Los •rboles k d son un caso especial de los •rboles BSP. Un •rbol k d emplea s‚lo planos perpendiculares a uno de los ejes del sistema de coordenadas. Esto difiere de los •rboles BSP, donde los planos pueden ser arbitrarios. Adem•s, todos los nodos de un •rbol k d, d, desde el nodo raƒz 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 geom…tricas). Como consecuencia, cada plano debe pasar a trav…s de uno de los puntos del •rbol d. k d.
Un •rbol k d tridimensional. La primera divisi‚n (rojo) corta la celda raƒz (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 m•s divisiones, las ocho finales se llaman hojas. Las esferas amarillas representan los nodos del •rbol.
T…cnicamente, la letra k se refiere al n„mero de dimensiones. Un •rbol k d tridimensional podrƒa ser llamado un •rbol 3d. Sin embargo se suele emplear la expresi‚n "•rbol k d tridimensional". (Tambi…n es m•s descriptivo, ya que un •rbol tridimensional puede ser varias cosas, pero el t…rmino •rbol k d se refiere a un tipo en concreto de •rbol de particionado.) Las letras k y d se escriben en min„sculas, incluso al principio de una oraci‚n. La k se escribe en cursiva, aunque son tambi…n 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 d. El sistema habitual es: k d. † Conforme Conforme se desciende desciende en el •rbol, •rbol, se emplean emplean ciclos ciclos a trav…s trav…s de los ejes para selecci seleccionar onar los planos. planos. (Por ejemplo, la raƒz puede tener un plano alineado con el eje x, sus descendientes tendrƒan planos alineados con el y y los nietos del raƒz alineados con el z, y asƒ sucesivamente) † En cada paso, paso, el punto selecci seleccionado onado para para crear el plano plano de corte corte ser• la mediana mediana de los los puntos puestos puestos en el •rbol •rbol d, lo que respeta sus coordenadas en el eje que est• siendo usado. k d, Este m…todo lleva a un •rbol k d balanceado, donde cada nodo hoja est• a la misma distancia de la raƒz. 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 k d 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 k; var int axis := depth mod
// Sort point list and choose median as pivot element sort pointList using predicate: point1[axis] < point2[axis];
pointList; choose median from
// 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 serƒa: 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 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 sub•rbol de la izquierda est•n en un lado del plano de corte, y todos los nodos del sub•rbol de la derecha est•n en el otro lado. El plano de corte de un nodo pasa a trav…s del punto asociado con ese nodo (referenciado en el c‚digo por node.location)
A‚adir elementos a un •rbol kd Los nodos se a‡aden a un •rbol k d de la misma forma que se a‡aden a cualquier otro •rbol. Primero, se recorre el •rbol empezando por la raƒz 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 a‡ade 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 k d sin romper el invariante. (POR HACER)
Equilibrar un •rbol kd Hay que ser cuidadoso al equilibrar un •rbol k d. Como estos •rboles est•n ordenados en m„ltiples dimensiones, no se puede emplear la t…cnica de rotaci‚n de •rboles para equilibrarlos € esto romperƒa el invariante.
Usos de un •rbol kd † Implementaci‚n en CBR ( Razonamiento Basado En Casos)
Bƒsqueda ortogonal en un •rbol kd Usar un •rbol k d para encontrar todos los puntos que se encuentran en un rect•ngulo determinado (o an•logo de m•s dimensiones). Esta operaci‚n tambi…n se denomina rango de b„squeda ortogonal.
Determinar d„nde evaluar una superficie En las regresiones locales es com„n evaluar la superficie contenida directamente s‚lo por los v…rtices del •rbol k d e interpolar en alg„n punto. Este uso, reflejado en la imagen de arriba, busca asegurar que s‚lo se realizar•n las evaluaciones directas necesarias. Como los •rboles k d se "adaptan" al espacio, este m…todo puede suministrar una excelente aproximaci‚n a las verdaderas superficies de regresi‚n local. Si la aproximaci‚n es pobre, puede mejorarse con m•s subdivisiones.
3
€rbol kd
Complejidad † Construir un •rbol k d est•tico a partir de n puntos es de O( nlogn). † Insertar un nuevo punto en un •rbol k d balanceado es de O(log n). † Eliminar un punto de un •rbol k d balanceado es de O(log n).
Enlaces externos (ingl…s) † C++ library that uses k d-trees for Approximate Nearest Neighbor Searching [1]
Referencias [1] http:/ / www.cs.umd.edu/ ~mount/ ANN/
4
Fuentes y contribuyentes del artƒculo
Fuentes y contribuyentes del art†culo €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 an‚nimas
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 an‚nimas
Licencia Creative Commons Attribution-Share Alike 3.0 //creativecommons.org/licenses/by-sa/3.0/
5