¿Cuáles son las ventajas de los octrees en el rendimiento espacial / temporal o de otra manera, y en qué situaciones son más aplicables (he escuchado programación de gráficos 3D)?
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:
- El reequilibrio puede ser costoso (los octrees no necesitan reequilibrar).
- El equilibrio maneja mejor la heterogeneidad porque es adaptativa.
- Un mayor factor de ramificación en los octreos significa árboles menos profundos (menos indirecciones y asignaciones) para distribuciones homogéneas.
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:
- Un alto factor de ramificación puede significar árboles poco profundos que incurren en pocas indirecciones, por lo que la búsqueda es rápida, por ejemplo, se pueden almacenar 20 niveles de árbol binario en 4 niveles de un árbol con un factor de ramificación de 256.
- Los intentos no se reequilibran durante las inserciones y eliminaciones, lo que ahorra una operación costosa requerida para árboles binarios equilibrados.
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.