Tengo cierta experiencia en informática científica, y he usado ampliamente kd-trees para aplicaciones BSP (partición de espacio binario). Recientemente me he familiarizado con los octrees, una estructura de datos similar para particionar espacios euclidianos en 3-D, pero que funciona a intervalos regulares fijos, por lo que deduzco.
Un poco de investigación de independencia parece indicar que los árboles kd son típicamente superiores en rendimiento para la mayoría de los conjuntos de datos, más rápidos de construir y consultar. Mi pregunta es, ¿cuáles son las ventajas de los octrees en el desempeño espacial / temporal o de otra manera, y en qué situaciones son más aplicables (he escuchado programación de gráficos 3D)? Un resumen de las ventajas y problemas de ambos tipos sería muy apreciado.
Como extra, si alguien pudiera dar más detalles sobre el uso de la estructura de datos del árbol R y sus ventajas, también lo agradecería. Los árboles R (más que los octreos) parecen aplicarse de manera bastante similar a los árboles kd para las búsquedas de k-vecino más cercano o rango.
fuente
Respuestas:
Las celdas en un árbol pueden tener una relación de aspecto alta, mientras que las celdas de octree tienen la garantía de ser cúbicas. Dado que este es un panel de teoría, le daré la razón teórica por la cual una alta relación de aspecto es un problema: hace que sea imposible usar límites de volumen para controlar el número de celdas que debe examinar al resolver consultas vecinas más cercanas.k D
Más detalladamente: si solicita un vecino más cercano aproximado a un punto de consulta q , y el vecino más cercano real está a la distancia d , generalmente termina con una búsqueda que examina cada celda de estructura de datos que llega desde el interior al fuera de un anillo o capa anular con radio interno d y radio externo ( 1 + ϵ ) d . Si las celdas tienen una relación de aspecto acotada, como están en un quadtree, entonces puede haber como máximo 1 / ϵ d - 1 de esas celdas, y puede probar buenos límites en el tiempo para la consulta. Si la relación de aspecto no está acotada, como en una kϵ q re re ( 1 + ϵ ) d 1 / ϵre- 1 -tree, estos límites no se aplican.k D
árboles D tienen una ventaja diferente sobre los árboles cuádruples, ya que se garantiza que tienen una profundidad logarítmica máxima, lo que también contribuye al tiempo para una consulta de vecino más cercano. Pero la profundidad de un quadtree es como máximo el número de bits de precisión de la entrada que generalmente no es grande, y existen métodos teóricos para controlar que la profundidad sea esencialmente logarítmica (ver la estructura de datos omitir quadtree).k D
fuente
Un grupo de amigos y yo estamos trabajando en un juego de estrategia en tiempo real como un divertido proyecto paralelo. Estamos usando muchas de las cosas que hemos aprendido en Ciencias de la Computación para hacerlo altamente eficiente, lo que nos permite hacer ejércitos masivos más adelante.
Para este propósito, hemos considerado usar kd-trees, pero los descartamos rápidamente: las inserciones y eliminaciones son extremadamente comunes en nuestro programa (considere una nave volando por el espacio), y este es un desastre impío con kd-trees. Por lo tanto, elegimos octrees para nuestro juego.
fuente
Los árboles kD son árboles binarios balanceados y los octrees son intentos por lo que las ventajas y desventajas probablemente se hereden de esas estructuras de datos más generales. Específicamente:
Además, la bisección (como en los octrees) se presta a una implementación trivial en términos de giro de bits. Del mismo modo, imagino que los octrees pueden beneficiarse enormemente de las distancias precalculadas cuando realizan búsquedas de rango.
EDITAR
Al parecer, mis referencias a los intentos y la homogeneidad necesitan aclaración.
Los intentos son una familia de estructuras de datos representadas por árboles de diccionarios y se usan como diccionarios para claves que son secuencias (especialmente cadenas pero también secuencias de ADN y los bits en un valor hash para intentos hash). Si cada diccionario mapea un bit de cada una de las coordenadas x, y y z (el bit más significativo en el primer nivel del trie, el siguiente bit significativo en el segundo nivel, etc.), entonces el trie es un octree que subdivide uniformemente el espacio 3D. Por lo tanto, los octrees heredan las características de los intentos que son, en general:
La desventaja es que la heterogeneidad puede dar lugar a intentos / octrees desequilibrados, por lo que las búsquedas pueden requerir muchas indirecciones. El problema equivalente en los intentos se resuelve utilizando la compresión de bordes para colapsar múltiples niveles de indirección en un solo nivel. Los octrees no hacen esto, pero no hay nada que te impida comprimir un octree (¡pero no creo que puedas llamar al resultado octree!).
A modo de comparación, considere un diccionario especializado para claves de cadena que se representa como un trie. El primer nivel del trie se ramifica en el primer personaje de la clave. El segundo nivel en el segundo personaje y así sucesivamente. Se puede buscar cualquier cadena buscando el primer carácter de la clave en el diccionario para obtener un segundo diccionario que se utiliza para buscar el segundo carácter de la clave y así sucesivamente. Un conjunto de cadenas de teclas aleatorias sería una distribución homogénea . Un conjunto de cadenas clave que comparten un prefijo (por ejemplo, todas las palabras que comienzan con "anti") son heterogéneasdistribución. En el último caso, el primer diccionario contiene solo un enlace, para "a", el segundo solo para "n" y así sucesivamente. La búsqueda de cualquier mapeo en el trie siempre se realiza buscando los mismos cuatro diccionarios con las mismas cuatro teclas. Esto es ineficiente y esto es lo que hacen los octrees si, por ejemplo, se utilizan para almacenar distribuciones de partículas heterogéneas donde la gran mayoría de las partículas se encuentran en un pequeño volumen dentro del espacio vectorial.
fuente
Los octrees son útiles como un tipo de datos base para modelos continuos, ver por ejemplo el solucionador de flujo Gerris . La vida es bastante difícil en la dinámica de fluidos, por lo que saber que el tamaño de todos sus subcubos depende solo de su profundidad debe ser un factor simplificador.
Advertencia: ¡no soy un dinámico dinámico!
fuente