fbpx
Wikipedia

Á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 kd son un caso especial de los árboles BSP.

Un árbol kd 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.

Un árbol kd 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 kd, 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 kd.

Técnicamente, la letra k se refiere al número de dimensiones. Un árbol kd tridimensional podría ser llamado un árbol 3d. Sin embargo se suele emplear la expresión "árbol kd tridimensional". (También es más descriptivo, ya que un árbol tridimensional puede ser varias cosas, pero el término árbol kd 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 kd. El sistema habitual es:

  • Conforme se desciende en el árbol, se emplean ciclos a través de los ejes para seleccionar los 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 de la raíz 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 método lleva a un árbol kd 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 kd balanceado que contiene dichos puntos.

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 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:

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 kd 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 kd sin romper el invariante. (POR HACER)

Equilibrar un árbol kd

Hay que ser cuidadoso al equilibrar un árbol kd. 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

  • En esta animación se representa como se busca el punto más próximo a otro punto dado (marcado en rojo). Aquí, el árbol ya está construido, cada vértice corresponde a un rectángulo, cada rectángulo se divide en dos subrectángulos iguales, y las hojas corresponden a rectángulos que contienen un solo punto.
    Implementación en CBR ( Razonamiento Basado En Casos)

Búsqueda ortogonal en un árbol kd

Usar un árbol kd 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 solo por los vértices del árbol kd 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 kd 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.

Complejidad

  • Construir un árbol kd estático 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 (inglés)

  • C++ library that uses kd-trees for Approximate Nearest Neighbor Searching


  •   Datos: Q309949

Árbol, ciencias, computación, abreviatura, árbol, dimensional, estructura, datos, particionado, espacio, organiza, puntos, espacio, euclídeo, dimensiones, árboles, caso, especial, árboles, árbol, tridimensional, primera, división, rojo, corta, celda, raíz, bla. En ciencias de la computacion un Arbol kd abreviatura de arbol k dimensional es una estructura de datos de particionado del espacio que organiza los puntos en un Espacio euclideo de k dimensiones Los arboles kd son un caso especial de los arboles BSP Un arbol kd tridimensional La primera division rojo corta la celda raiz 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 mas divisiones las ocho finales se llaman hojas Las esferas amarillas representan los nodos del arbol Un arbol kd emplea solo planos perpendiculares a uno de los ejes del sistema de coordenadas Esto difiere de los arboles BSP donde los planos pueden ser arbitrarios Ademas todos los nodos de un arbol kd desde el nodo raiz hasta los nodos hoja almacenan un punto Mientras tanto en los arboles BSP son las hojas los unicos nodos que contienen puntos u otras primitivas geometricas Como consecuencia cada plano debe pasar a traves de uno de los puntos del arbol kd Tecnicamente la letra k se refiere al numero de dimensiones Un arbol kd tridimensional podria ser llamado un arbol 3d Sin embargo se suele emplear la expresion arbol kd tridimensional Tambien es mas descriptivo ya que un arbol tridimensional puede ser varias cosas pero el termino arbol kd se refiere a un tipo en concreto de arbol de particionado Las letras k y d se escriben en minusculas incluso al principio de una oracion La k se escribe en cursiva aunque son tambien comunes las formas arbol KD y arbol Kd Indice 1 Operaciones en arboles k 1 1 Construir un arbol k 1 2 Anadir elementos a un arbol kd 1 3 Eliminar elementos de un arbol kd 1 4 Equilibrar un arbol kd 2 Usos de un arbol kd 2 1 Busqueda ortogonal en un arbol kd 2 2 Determinar donde evaluar una superficie 3 Complejidad 4 Enlaces externos ingles Operaciones en arboles k EditarConstruir un arbol k Editar Dado que hay muchas maneras posibles de elegir planos alineados a los ejes hay muchas maneras de generar arboles kd El sistema habitual es Conforme se desciende en el arbol se emplean ciclos a traves de los ejes para seleccionar los planos Por ejemplo la raiz puede tener un plano alineado con el eje x sus descendientes tendrian planos alineados con el y y los nietos de la raiz alineados con el z y asi sucesivamente En cada paso el punto seleccionado para crear el plano de corte sera la mediana de los puntos puestos en el arbol kd lo que respeta sus coordenadas en el eje que esta siendo usado Este metodo lleva a un arbol kd balanceado donde cada nodo hoja esta a la misma distancia de la raiz De todas formas los arboles balanceados no son necesariamente optimos para todas las aplicaciones Dada una lista de n puntos el siguiente algoritmo genera un arbol kd balanceado que contiene dichos puntos pre style overflow x auto b function b kdtree i list of points i pointList i int i depth b if b pointList b is empty b b return b b nil b b else b i Select axis based on depth so that axis cycles through all valid values i b var b i int i axis depth b mod b k i Sort point list and choose median as pivot element i b sort b pointList b using predicate b point1 axis lt point2 axis b choose b median b from b pointList i Create node and construct subtrees i b var b i tree node i node node location median node leftChild kdtree points b in b pointList b before b median depth 1 node rightChild kdtree points b in b pointList b after b median depth 1 b return b node pre Este algoritmo implementado en Python seria 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 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 subarbol de la izquierda estan en un lado del plano de corte y todos los nodos del subarbol de la derecha estan en el otro lado El plano de corte de un nodo pasa a traves del punto asociado con ese nodo referenciado en el codigo por node location Anadir elementos a un arbol kd Editar Los nodos se anaden a un arbol kd de la misma forma que se anaden a cualquier otro arbol Primero se recorre el arbol empezando por la raiz y siguiendo por el nodo de la izquierda o de la derecha dependiendo de si el punto que se quiere insertar esta en la derecha o en la izquierda del plano de corte Una vez que se llega a un nodo hoja se anade 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 arbol kd Editar Eliminar un punto de un arbol kd sin romper el invariante POR HACER Equilibrar un arbol kd Editar Hay que ser cuidadoso al equilibrar un arbol kd Como estos arboles estan ordenados en multiples dimensiones no se puede emplear la tecnica de rotacion de arboles para equilibrarlos esto romperia el invariante Usos de un arbol kd Editar source En esta animacion se representa como se busca el punto mas proximo a otro punto dado marcado en rojo Aqui el arbol ya esta construido cada vertice corresponde a un rectangulo cada rectangulo se divide en dos subrectangulos iguales y las hojas corresponden a rectangulos que contienen un solo punto Implementacion en CBR Razonamiento Basado En Casos Busqueda ortogonal en un arbol kd Editar Usar un arbol kd para encontrar todos los puntos que se encuentran en un rectangulo determinado o analogo de mas dimensiones Esta operacion tambien se denomina rango de busqueda ortogonal Determinar donde evaluar una superficie Editar En las regresiones locales es comun evaluar la superficie contenida directamente solo por los vertices del arbol kd e interpolar en algun punto Este uso reflejado en la imagen de arriba busca asegurar que solo se realizaran las evaluaciones directas necesarias Como los arboles kd se adaptan al espacio este metodo puede suministrar una excelente aproximacion a las verdaderas superficies de regresion local Si la aproximacion es pobre puede mejorarse con mas subdivisiones Complejidad EditarConstruir un arbol kd estatico a partir de n puntos es de O nlogn Insertar un nuevo punto en un arbol kd balanceado es de O logn Eliminar un punto de un arbol kd balanceado es de O logn Enlaces externos ingles EditarC library that uses kd trees for Approximate Nearest Neighbor Searching Datos Q309949 Obtenido de https es wikipedia org w index php title Arbol kd amp oldid 128605031, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos