Articulo de referencia

árbol k -d

O(n) "},"space_worst":{"wt":" O(n) "},"search_avg":{"wt":" O(\\log n) "},"search_worst":{"wt":" O(n) "},"insert_avg":{"wt":" O(\\log n) "},"insert_worst":{"wt":" O(n) "},"delete...

En informática , un árbol k -d (abreviatura de árbol k-dimensional ) es una estructura de datos de partición espacial para organizar puntos en un espacio k -dimensional . K-dimensional es aquel que concierne exactamente a k ejes ortogonales o a un espacio de cualquier número de dimensiones . [ 1 ] Los árboles k -d son una estructura de datos útil para diversas aplicaciones, tales como:

Los árboles k -d son un caso especial de árboles de partición de espacio binario .

Descripción

El árbol k -d es un árbol binario en el que cada nodo es un punto k -dimensional. [ 2 ] Cada nodo no hoja puede considerarse como generador implícito de un hiperplano divisor que divide el espacio en dos partes, conocidas como semi-espacios . Los puntos a la izquierda de este hiperplano están representados por el subárbol izquierdo de ese nodo y los puntos a la derecha del hiperplano están representados por el subárbol derecho. La dirección del hiperplano se elige de la siguiente manera: cada nodo en el árbol está asociado con una de las k dimensiones, con el hiperplano perpendicular al eje de esa dimensión. Así, por ejemplo, si para una división particular se elige el eje "x", todos los puntos en el subárbol con un valor "x" menor que el del nodo aparecerán en el subárbol izquierdo y todos los puntos con un valor "x" mayor estarán en el subárbol derecho. En tal caso, el hiperplano estaría definido por el valor x del punto, y su normal sería el eje x unitario. [ 3 ]

Ejemplo de un árbol kd tridimensional

Operaciones en árboles k -d

Construcción

Dado que existen muchas formas posibles de elegir planos de división alineados con los ejes, existen muchas formas diferentes de construir árboles k -d. El método canónico de construcción de árboles k -d tiene las siguientes restricciones: [ 4 ]

  • A medida que uno desciende por el árbol, se va recorriendo el ciclo de ejes utilizados para seleccionar los planos de división. (Por ejemplo, en un árbol tridimensional, la raíz tendría un plano alineado con el eje x , los hijos de la raíz tendrían planos alineados con el eje y , los nietos de la raíz tendrían planos alineados con el eje z , los bisnietos de la raíz tendrían planos alineados con el eje x , los tataranietos de la raíz tendrían planos alineados con el eje y , y así sucesivamente).
  • Los puntos se insertan seleccionando la mediana de los puntos que se colocan en el subárbol , con respecto a sus coordenadas en el eje que se utiliza para crear el plano de división. (Tenga en cuenta que se supone que introducimos el conjunto completo de n puntos en el algoritmo de antemano).

Este método da como resultado un árbol k -d equilibrado , en el que cada nodo hoja se encuentra aproximadamente a la misma distancia de la raíz. Sin embargo, los árboles equilibrados no son necesariamente óptimos para todas las aplicaciones.

Tenga en cuenta que no es necesario seleccionar el punto medio. En caso de que no se seleccionen puntos medios, no hay garantía de que el árbol esté equilibrado. Para evitar codificar un código complejoO(norte){\displaystyle O(n)}algoritmo de búsqueda de medianas [ 5 ] [ 6 ] o utilizando unO(norteregistro(norte)){\displaystyle O(n\log(n))}Para ordenar los n puntos mediante algoritmos como heapsort o mergesort , una práctica común consiste en ordenar un número fijo de puntos seleccionados aleatoriamente y usar la mediana de estos como plano de división. En la práctica, esta técnica suele generar árboles bien equilibrados.

Dado una lista de n puntos, el siguiente algoritmo utiliza una ordenación por búsqueda de la mediana para construir un árbol k -d equilibrado que contiene esos puntos.

función kdtree ( lista de puntos pointList, int depth) { // Seleccionar el eje en función de la profundidad para que el eje recorra todos los valores válidos var int axis := depth mod k; // Ordenar la lista de puntos y elegir la mediana como elemento pivote seleccionar la mediana por eje de pointList; // Crear nodo y construir subárbol nodo.ubicación := mediana; nodo.hijoizquierdo := kdtree(puntos en pointList antes de la mediana, profundidad+1); nodo.hijoderecho := kdtree(puntos en pointList después de la mediana, profundidad+1); return nodo; }

Es común que los puntos posteriores a la mediana incluyan únicamente aquellos que son estrictamente mayores que la mediana en la dimensión actual. Para los puntos que se encuentran sobre la mediana en la dimensión actual, es posible definir una función que los compare en todas las dimensiones. En algunos casos, es aceptable que los puntos iguales a la mediana se sitúen a un lado de ella, por ejemplo, dividiendo los puntos en un subconjunto de "menores que" y otro de "mayores o iguales que".

Este algoritmo crea la invariante de que, para cualquier nodo, todos los nodos del subárbol izquierdo se encuentran a un lado de un plano de división , y todos los nodos del subárbol derecho se encuentran al otro lado. Los puntos que se encuentran en el plano de división pueden aparecer a cualquiera de los dos lados. El plano de división de un nodo pasa por el punto asociado a dicho nodo (denominado en el código como node.location ).

Los algoritmos alternativos para construir un árbol k -d equilibrado preordenan los datos antes de construir el árbol. Luego, mantienen el orden de la preordenación durante la construcción del árbol y, por lo tanto, eliminan el costoso paso de encontrar la mediana en cada nivel de subdivisión. Dos de estos algoritmos construyen un árbol k -d equilibrado para ordenar triángulos con el fin de mejorar el tiempo de ejecución del trazado de rayos para gráficos por computadora tridimensionales . Estos algoritmos preordenan n triángulos antes de construir el árbol k -d , luego construyen el árbol enO(norteregistronorte){\displaystyle O(n\log n)}tiempo en el mejor de los casos. [ 7 ] [ 8 ] Un algoritmo que construye un árbol k -d equilibrado para ordenar puntos tiene una complejidad en el peor de los casos deO(knorteregistro(norte)){\displaystyle O(kn\log(n))}. [ 9 ] [ 10 ] Este algoritmo preordena n puntos en cada una de las k dimensiones utilizando unO(norteregistro(norte)){\displaystyle O(n\log(n))}Se realiza una ordenación previa mediante algoritmos como Heapsort o Mergesort . De esta forma, se mantiene el orden de estas k preordenaciones durante la construcción del árbol, evitando así encontrar la mediana en cada nivel de subdivisión.

Agregar elementos

Se añade un nuevo punto a un árbol k -d de la misma manera que se añade un elemento a cualquier otro árbol de búsqueda . Primero, se recorre el árbol, comenzando desde la raíz y avanzando hacia el hijo izquierdo o derecho, según si el punto que se va a insertar se encuentra en el lado izquierdo o derecho del plano de división. Una vez que se llega al nodo bajo el cual debe ubicarse el hijo, se añade el nuevo punto como hijo izquierdo o derecho del nodo hoja, dependiendo de qué lado del plano de división del nodo contenga el nuevo nodo.

Agregar puntos de esta manera puede provocar un desequilibrio en el árbol, lo que reduce su rendimiento. La velocidad de degradación del rendimiento depende de la distribución espacial de los puntos agregados y de la cantidad de puntos en relación con el tamaño del árbol. Si un árbol se desequilibra demasiado, puede ser necesario reequilibrarlo para restaurar el rendimiento de las consultas que dependen de dicho equilibrio, como la búsqueda del vecino más cercano.

Eliminación de elementos

Para eliminar un punto de un árbol k -d existente sin romper la invariante, la forma más sencilla es formar el conjunto de todos los nodos y hojas a partir de los hijos del nodo objetivo y recrear esa parte del árbol. [ 2 ]

Otro enfoque es encontrar un reemplazo para el punto eliminado. [ 11 ] Primero, encontrar el nodoR{\displaystyle R}que contiene el punto que se va a eliminar. Para el caso base, donde R es un nodo hoja, no se requiere reemplazo. Para el caso general, encuentre un punto de reemplazo, por ejemplopag{\displaystyle p}, del subárbol con raíz enR{\displaystyle R}. Reemplazar el punto almacenado enR{\displaystyle R}conpag{\displaystyle p}Luego, elimine recursivamentepag{\displaystyle p}.

Para encontrar un punto de reemplazo, siR{\displaystyle R}discrimina enincógnita{\displaystyle x}(decir) yR{\displaystyle R}tiene un hijo derecho, encuentra el punto con el mínimoincógnita{\displaystyle x}valor del subárbol enraizado en el hijo derecho. De lo contrario, encuentre el punto con el máximoincógnita{\displaystyle x}valor del subárbol con raíz en el hijo izquierdo.

Equilibrio

El balanceo de un árbol k -d requiere cuidado porque los árboles k -d están ordenados en múltiples dimensiones, por lo que la técnica de rotación de árboles no se puede utilizar para balancearlos, ya que esto podría romper la invariante.

Existen varias variantes de árboles k -d equilibrados. Entre ellas se incluyen el árbol k -d dividido, el árbol k -d pseudo, el árbol KDB , el árbol hB y el árbol Bkd . Muchas de estas variantes son árboles kd adaptativos .

Ejemplo de búsqueda del vecino más cercano en un árbol 2D. Aquí, el árbol ya está construido, cada nodo 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.

El algoritmo de búsqueda del vecino más cercano (NN) busca el punto en el árbol que esté más próximo a un punto de entrada dado. Esta búsqueda se puede realizar de manera eficiente utilizando las propiedades del árbol para eliminar rápidamente grandes porciones del espacio de búsqueda.

La búsqueda del vecino más cercano en un árbol k -d se realiza de la siguiente manera:

  1. Partiendo del nodo raíz, el algoritmo desciende por el árbol de forma recursiva, del mismo modo que lo haría si se estuviera insertando el punto de búsqueda (es decir, se mueve a la izquierda o a la derecha dependiendo de si el punto es menor o mayor que el nodo actual en la dimensión dividida).
  2. Una vez que el algoritmo llega a un nodo hoja, comprueba el punto del nodo y, si la distancia es mejor que la "mejor actual", ese punto del nodo se guarda como la "mejor actual".
  3. El algoritmo deshace la recursión del árbol, realizando los siguientes pasos en cada nodo:
    1. Si el nodo actual está más cerca que el mejor nodo actual, entonces se convierte en el mejor nodo actual.
    2. El algoritmo comprueba si existen puntos al otro lado del plano de división que estén más cerca del punto de búsqueda que el mejor punto actual. En teoría, esto se logra intersectando el hiperplano de división con una hiperesfera alrededor del punto de búsqueda cuyo radio sea igual a la distancia más cercana actual. Dado que todos los hiperplanos están alineados con los ejes, esto se implementa como una simple comparación para determinar si la distancia entre la coordenada de división del punto de búsqueda y el nodo actual es menor que la distancia (coordenadas generales) desde el punto de búsqueda hasta el mejor punto actual.
      1. Si la hiperesfera cruza el plano, podría haber puntos más cercanos al otro lado del plano, por lo que el algoritmo debe descender por la otra rama del árbol desde el nodo actual buscando puntos más cercanos, siguiendo el mismo proceso recursivo que toda la búsqueda.
      2. Si la hiperesfera no interseca el plano de división, el algoritmo continúa avanzando por el árbol y se elimina toda la rama que se encuentra al otro lado de ese nodo.
  4. Cuando el algoritmo finaliza este proceso para el nodo raíz, la búsqueda se considera completa.

Generalmente, el algoritmo utiliza distancias al cuadrado para la comparación, evitando así el cálculo de raíces cuadradas. Además, puede ahorrar tiempo de cálculo almacenando en una variable la distancia al cuadrado óptima para su posterior comparación.

El algoritmo puede ampliarse de diversas maneras mediante modificaciones sencillas. Puede proporcionar los k vecinos más cercanos a un punto manteniendo k de los mejores resultados actuales en lugar de solo uno. Una rama se elimina únicamente cuando se han encontrado k puntos y no puede tener puntos más cercanos que ninguno de los k mejores resultados actuales.

También se puede convertir en un algoritmo de aproximación para que se ejecute más rápido. Por ejemplo, la búsqueda aproximada del vecino más cercano se puede lograr simplemente estableciendo un límite superior en el número de puntos a examinar en el árbol o interrumpiendo el proceso de búsqueda en función de un reloj en tiempo real (lo que puede ser más apropiado en implementaciones de hardware). El vecino más cercano para los puntos que ya están en el árbol se puede lograr no actualizando el refinamiento para los nodos que dan una distancia cero. Como resultado, esto tiene la desventaja de descartar puntos que no son únicos pero que están ubicados en la misma posición que el punto de búsqueda original.

El método del vecino más cercano aproximado es útil en aplicaciones en tiempo real, como la robótica, debido al aumento significativo de velocidad que se obtiene al no buscar exhaustivamente el mejor punto. Una de sus implementaciones es la búsqueda primero del mejor contenedor .

Una búsqueda de rango busca rangos de parámetros. Por ejemplo, si un árbol almacena valores correspondientes a ingresos y edad, una búsqueda de rango podría consistir en buscar todos los miembros del árbol cuya edad esté entre 20 y 50 años y cuyos ingresos estén entre 50 000 y 80 000. Dado que los árboles kd dividen el rango de un dominio por la mitad en cada nivel del árbol, son útiles para realizar búsquedas de rango.

Los análisis de árboles de búsqueda binaria han encontrado que el tiempo en el peor caso para la búsqueda de rango en un árbol k -dimensional k -d que contiene n nodos viene dado por la siguiente ecuación. [ 12 ]

tel peor=O(knorte11k){\displaystyle t_{\text{peor}}=O\left(k\cdot n^{1-{\frac {1}{k}}}\right)}

Degradación del rendimiento con datos de alta dimensión

En espacios de baja dimensión, el punto más cercano es unO(registro(norte)){\displaystyle O(\log(n))}operación en promedio, en el caso de puntos distribuidos aleatoriamente, aunque el análisis en general es complicado. [ 13 ]

En espacios de alta dimensión, la maldición de la dimensionalidad hace que el algoritmo necesite visitar muchas más ramas que en espacios de menor dimensión. En particular, cuando el número de puntos es solo ligeramente superior al número de dimensiones, el algoritmo es solo ligeramente mejor que una búsqueda lineal de todos los puntos. Como regla general, si la dimensionalidad es k , el número de puntos en los datos, n , debería sernorte2k{\displaystyle n\gg 2^{k}}. De lo contrario, cuando se utilizan árboles k -d con datos de alta dimensión, la mayoría de los puntos del árbol se evaluarán y la eficiencia no es mejor que la búsqueda exhaustiva, [ 14 ] y, si se requiere una respuesta suficientemente rápida, se deben utilizar métodos aproximados del vecino más cercano.

Degradación del rendimiento cuando el punto de consulta está lejos de los puntos en el árbol k -d.

Además, incluso en un espacio de baja dimensión, si la distancia promedio entre pares de los k vecinos más cercanos del punto de consulta es significativamente menor que la distancia promedio entre el punto de consulta y cada uno de los k vecinos más cercanos, el rendimiento de la búsqueda del vecino más cercano se degrada hacia un comportamiento lineal, ya que las distancias desde el punto de consulta a cada vecino más cercano tienen una magnitud similar. (En el peor de los casos, consideremos una nube de puntos distribuidos en la superficie de una esfera centrada en el origen. Cada punto es equidistante del origen, por lo que una búsqueda del vecino más cercano desde el origen tendría que iterar a través de todos los puntos en la superficie de la esfera para identificar al vecino más cercano, que en este caso ni siquiera es único).

Para mitigar la posible degradación significativa del rendimiento de una búsqueda en árbol k -d en el peor de los casos, se puede proporcionar un parámetro de distancia máxima al algoritmo de búsqueda en árbol , y la búsqueda recursiva se puede podar cuando el punto más cercano en una rama determinada del árbol no puede estar a una distancia menor que esta distancia máxima. Esto puede provocar que una búsqueda del vecino más cercano no devuelva ningún vecino más cercano, lo que significa que ningún punto se encuentra dentro de esta distancia máxima del punto de consulta.

Complejidad

  • La construcción de un árbol k -d estático a partir de n puntos tiene la siguiente complejidad en el peor de los casos:
    • O( n log 2 n ) si se utiliza un algoritmo de ordenación O( n log n ) como Heapsort o Mergesort para encontrar la mediana en cada nivel del árbol naciente;
    • O( n log n ) si se utiliza un algoritmo de mediana de medianas O( n ) [ 5 ] [ 6 ] para seleccionar la mediana en cada nivel del árbol naciente;
    • O( kn log n ) si n puntos se preordenan en cada una de las k dimensiones usando un ordenamiento O( n log n ) como Heapsort o Mergesort antes de construir el árbol k -d . [ 10 ]
  • Insertar un nuevo punto en un árbol k -d equilibrado requiere un tiempo de O(log n ) .
  • Eliminar un punto de un árbol k -d equilibrado requiere un tiempo de O(log n ) .
  • Consultar un rango paralelo a los ejes en un árbol k -d equilibrado requiere un tiempo de O( n 1−1/k + m ) , donde m es el número de puntos informados y k la dimensión del árbol k -d.
  • Encontrar el vecino más cercano en un árbol k -d equilibrado con puntos distribuidos aleatoriamente lleva un tiempo promedio de O(log n ) .

Variaciones

Objetos volumétricos

En lugar de puntos, un árbol k -d también puede contener rectángulos o hiperrectángulos . [ 15 ] [ 16 ] Por lo tanto, la búsqueda de rango se convierte en el problema de devolver todos los rectángulos que intersecan el rectángulo de búsqueda. El árbol se construye de la forma habitual con todos los rectángulos en las hojas. En una búsqueda de rango ortogonal , se utiliza la coordenada opuesta al comparar con la mediana. Por ejemplo, si el nivel actual se divide a lo largo de x alto , comprobamos la coordenada x bajo del rectángulo de búsqueda. Si la mediana es menor que la coordenada x bajo del rectángulo de búsqueda, entonces ningún rectángulo en la rama izquierda puede intersecar con el rectángulo de búsqueda y, por lo tanto, se puede podar. De lo contrario, se deben recorrer ambas ramas. Véase también árbol de intervalo , que es un caso especial unidimensional.

Puntos solo en hojas

También es posible definir un árbol k -d con puntos almacenados únicamente en las hojas. [ 4 ] Esta forma de árbol k -d permite una variedad de mecanismos de división distintos de la división mediana estándar. La regla de división del punto medio [ 17 ] selecciona en el medio del eje más largo del espacio que se está buscando, independientemente de la distribución de los puntos. Esto garantiza que la relación de aspecto será como máximo 2:1, pero la profundidad depende de la distribución de los puntos. Una variación, llamada punto medio deslizante, solo divide en el medio si hay puntos a ambos lados de la división. De lo contrario, divide en el punto más cercano al medio. Maneewongvatana y Mount muestran que esto ofrece un rendimiento "suficientemente bueno" en conjuntos de datos comunes.

Utilizando el punto medio deslizante, se puede responder a una consulta aproximada del vecino más cercano enO(1ϵ dregistronorte){\displaystyle O\left({\tfrac {1}{{\epsilon \ }^{d}}}\log n\right)}. El conteo de rango aproximado se puede responder enO(registronorte+(1ϵ )d){\displaystyle O\left(\log n+{\left({\tfrac {1}{\epsilon \ }}\right)}^{d}\right)}con este método.

Véase también

Variaciones cercanas:

  • árbol k -d implícito , un árbol k -d definido por una función de división implícita en lugar de un conjunto de divisiones almacenadas explícitamente.
  • Árbol k -d min/max , un árbol k -d que asocia un valor mínimo y máximo a cada uno de sus nodos.
  • Árbol k -d relajado , un árbol k -d tal que los discriminantes en cada nodo son arbitrarios.

Variaciones relacionadas:

  • Quadtree , una estructura de partición espacial que se divide en dos dimensiones simultáneamente, de modo que cada nodo tiene 4 hijos.
  • Octree , una estructura de partición espacial que se divide en tres dimensiones simultáneamente, de modo que cada nodo tiene 8 hijos.
  • Árbol de bolas , una partición de espacio multidimensional útil para la búsqueda del vecino más cercano.
  • Jerarquía de intervalos de delimitación y árbol R , estructura para particionar objetos en lugar de puntos, con regiones superpuestas.
  • Árbol de punto de vista , una variante de un árbol k -d que utiliza hiperesferas en lugar de hiperplanos para particionar los datos.

Problemas que pueden abordarse con árboles k -d:

  • Particionamiento recursivo , una técnica para construir árboles de decisión estadísticos similares a los árboles k -d.
  • El problema de la medida de Klee , un problema de calcular el área de la unión de rectángulos, se puede resolver usando árboles k -d.
  • Problema de la guillotina , un problema que consiste en encontrar un árbol k -d cuyas celdas sean lo suficientemente grandes como para contener un conjunto dado de rectángulos.

Implementaciones de código abierto

  • ALGLIB dispone de implementaciones en C# y C++ de algoritmos de vecinos más cercanos y vecinos más cercanos aproximados basados ​​en árboles k -d.
  • CGAL, la biblioteca de algoritmos computacionales, incluye implementaciones de algoritmos de búsqueda del vecino más cercano basados ​​en árboles k -d, del vecino más cercano aproximado y de búsqueda por rango.
  • SciPy , una biblioteca de Python para computación científica, contiene implementaciones de algoritmos de búsqueda del vecino más cercano basados ​​en árboles k -d.
  • scikit-learn , una biblioteca de Python para el aprendizaje automático, contiene implementaciones de árboles k -d para respaldar las búsquedas de vecinos más cercanos y vecinos por radio.

Referencias

  1. "k-dimensional" . xlinux.nist.gov . Consultado el 17 de septiembre de 2023 .
  2. ^ Hristov , Hristo (29 de marzo de 2023). "Introducción a los árboles KD" . Baeldung .
  3. Bentley, JL (1975). "Árboles de búsqueda binaria multidimensionales utilizados para la búsqueda asociativa" . Communications of the ACM . 18 (9): 509– 517. doi : 10.1145/361002.361007 . S2CID 13091446 . 
  4. 1 2 Berg, Mark de; Cheong, Otfried; Kreveld, Marc van; Overmars, Mark (2008). "Búsqueda de rango ortogonal". Geometría computacional . págs. 95–120 . doi : 10.1007/978-3-540-77974-2_5 . ISBN  978-3-540-77973-5.
  5. 1 2 Blum, M. ; Floyd, RW ; Pratt, VR ; Rivest, RL ; Tarjan, RE (agosto de 1973). "Límites de tiempo para la selección" (PDF) . Journal of Computer and System Sciences . 7 (4): 448– 461. doi : 10.1016/S0022-0000(73)80033-9 .
  6. ^ Cormen , Thomas H .; Leiserson, Charles E .; Rivest, Ronald L. Introducción a los algoritmos . MIT Press y McGraw-Hill.Capítulo 10.
  7. Wald I, Havran V (septiembre de 2006). "Sobre la construcción de árboles kd rápidos para el trazado de rayos, y sobre cómo hacerlo en O(N log N)" (PDF) . Simposio IEEE de 2006 sobre trazado de rayos interactivo . págs. 61–69 . doi : 10.1109/RT.2006.280216 . ISBN  1-4244-0693-5. S2CID 1603250 . 
  8. Havran V, Bittner J (2002). "Sobre la mejora de los árboles kd para el trazado de rayos" (PDF) . En: Actas de la WSCG : 209–216 .
  9. ^ Procopiuc, T; Agarwal, M; Arge, L; Vittner, J (2003). "Bkd-tree: un kd-tree dinámico escalable". En Hadzilacos, T; Manolopoulos, Y; Roddick, J; Theodoridis, Y (eds.). Apuntes de conferencias sobre informática . vol. 2750. Berlín: Springer-Verlag. págs. 46 a 65.  
  10. 1 2 Brown R (2015). "Construcción de un árbol k -d equilibrado en tiempo O( kn log n ) " . Journal of Computer Graphics Techniques . 4 (1): 50–68 .
  11. Chandran, Sharat. Introducción a los árboles kd . Departamento de Ciencias de la Computación de la Universidad de Maryland.
  12. Lee, DT; Wong, CK (1977). "Análisis del peor caso para búsquedas de regiones y regiones parciales en árboles de búsqueda binaria multidimensionales y árboles cuaternarios balanceados". Acta Informatica . 9 . doi : 10.1007/BF00263763 . S2CID 36580055 . 
  13. Freidman, JH ; Bentley, JL ; Finkel, RA (1977). "Un algoritmo para encontrar las mejores coincidencias en tiempo esperado logarítmico". ACM Transactions on Mathematical Software . 3 (3): 209. doi : 10.1145/355744.355745 . OSTI 1443274 . S2CID 10811510 .  
  14. Jacob E. Goodman , Joseph O'Rourke y Piotr Indyk , eds. (2004). «Capítulo 39: Vecinos más cercanos en espacios de alta dimensión». Manual de Geometría Discreta y Computacional (2.ª ed.). CRC Press. 
  15. Rosenberg, JB (1985). "Estructuras de datos geográficos comparadas: un estudio de estructuras de datos que admiten consultas de regiones". IEEE Transactions on Computer-Aided Design of Integrated Circuits and Systems . 4 : 53–67 . doi : 10.1109/TCAD.1985.1270098 . S2CID 31223074 . 
  16. Houthuys, P. (1987). "Box Sort, un método de ordenación binaria multidimensional para cajas rectangulares, utilizado para búsquedas rápidas de rangos". The Visual Computer . 3 (4): 236– 249. doi : 10.1007/BF01952830 . S2CID 3197488 . 
  17. S. Maneewongvatana y DM Mount . Está bien ser delgado si tus amigos son gordos . 4.º Taller Anual de Geometría Computacional de la CGC, 1999.
Obtenido de " https://en.wikipedia.org/w/index.php?title=K-d_tree&oldid=1331666290 "