¿Cuáles son las mejores estructuras de datos para un índice espacial utilizado para averiguar en qué región de un espacio delimitado cae un nuevo punto dado?

Hay algunos problemas que hacen que sus requisitos sean complejos, por lo que los abordaré uno a la vez:

Primero, aunque los árboles kd son el algoritmo canónico para la indexación de alta dimensionalidad, no se pueden fragmentar de manera eficiente en una gran cantidad de máquinas. Para un clúster pequeño, puede hacer que funcione si la tasa de actualización es muy baja.

En segundo lugar, si el conjunto de datos es muy grande y está fragmentado en muchas máquinas, necesitará usar una estructura de datos de descomposición espacial, que no es un árbol kd. Todas las estructuras de descomposición espacial en la literatura, como el árbol cuádruple, solo son útiles en espacios con buena distribución sobre los bits más significativos de las dimensiones individuales. Las estructuras de descomposición espacial no tienen dimensionalidad intrínseca, la dimensionalidad es una interpretación (ver: números de Morton), por lo que podría almacenar un modelo de 1000 dimensiones en un árbol cuádruple en principio, aunque un árbol cuádruple tenga un árbol de decisión de baja dimensionalidad.

El mayor problema es que pocos modelos de datos con miles de dimensiones tienen una buena distribución de valores en sus dimensiones. Una propiedad de las estructuras de descomposición espacial es que existe una relación profunda entre la similitud de la estructura de registros y el árbol de decisión que le permite direccionar el contenido de la ubicación de almacenamiento de registros. Si la mayoría de sus miles de dimensiones tienen una distribución de valor deficiente, de modo que existe una gran similitud récord en algunas dimensiones, la estructura distribuida tendrá una forma fea e ineficiente. He visto (y he usado) estructuras de datos de descomposición espacial hiperdimensionales que son asimétricas adaptativas, pero actualmente no hay ninguna en la literatura que sepa que pueda señalar.

Dada la forma en que ha descrito su caso problemático, e ignorando los algoritmos que no están actualmente en la literatura, sugeriría diseñar un algoritmo híbrido que se base en la descomposición del espacio en las primeras partes del método de acceso y cambiar a una estructura de árbol kd localmente. Hay muchos detalles y advertencias sobre cómo funcionaría, pero debería ser capaz de adaptarse a su caso de uso, requisitos de rendimiento y modelo de datos.

Puede que no comprenda completamente sus requisitos, pero siento que hay una respuesta directa que proviene de ajustar el algoritmo de la curva Z. Para determinar la región en la que se encuentra un punto, simplemente debe determinar lo siguiente:

para cada hiperplano, ¿está el punto en el lado A o en el lado B (lazos se rompen arbitrariamente)?

Cada consulta se puede realizar en tiempo O (D), y si hay n consultas de este tipo y distribuye sus hiperplanos de manera uniforme en un grupo de nodos, puede resolver la consulta en tiempo O (n * D / s). Al concatenar los resultados de cada consulta se obtiene una cadena de bits que es una firma para la región a la que pertenece el punto. Puede indexar este punto con la cadena de bits como clave, y todos los puntos en la misma región se agruparán. Los mismos fragmentos que realizan su consulta también se pueden usar como un índice de valor clave distribuido para sus puntos.

Además, si puede determinar que algunos hiperplanos son “más importantes” de alguna manera (por ejemplo, ecuador y meridiano principal / línea de fecha en el ejemplo de búsqueda geográfica), puede colocar esos bits primero en la cadena, y si su sistema de almacenamiento admite consultas de rango, También puede consultar puntos en superregiones importantes.

Me complace dar más detalles o hablar sin conexión al respecto, o revisar si mi comprensión de su problema no era del todo correcta.

Creo que quieres un árbol kd , o algo así. Depende de cómo se divide su espacio, y cómo puede representar las regiones, y si eso se ajusta al modelo del árbol kd. Si todas las divisiones son por hiperplanos, deberías estar bien. Las consultas de puntos son O (log n), pero en este caso, la pregunta es “¿qué es n?” Y para responder eso, necesito un poco más de información sobre sus regiones.

Un árbol de rango no es bueno en una dimensión muy alta, usted paga un factor de registro adicional por cada dimensión que agregue.
¿Necesitas algo dinámico? ¿Va a cambiar las regiones con frecuencia?

More Interesting

En un montón binario, un nodo con índice i tiene hijos en los índices 2i + 1 y 2i + 2 (cuando la matriz es 0 indexada). ¿Cómo se deriva esta relación?

¿Cómo idearé un algoritmo eficiente para determinar todos los cursos que debo tomar antes de un curso en particular sin un orden topológico?

¿Puede un programa escribir un programa (es decir, el programa x puede identificar un algoritmo para escribir el programa y, a pesar del algoritmo z)?

¿Qué tecnología utiliza X ?: ¿Cómo implementan las empresas de análisis (Mixpanel, KISSMetrics, etc.) el análisis de embudos?

¿Es posible implementar algoritmos de aprendizaje automático en lenguaje ensamblador?

¿Cuál es la mejor manera de ingresar al último proceso de aprendizaje de algoritmos de reconocimiento facial?

¿Cómo se puede observar fácilmente que la complejidad temporal del código escrito es exponencial?

Cómo alterar el rango de un bucle for dentro del bucle en Python

¿Cómo crean los algoritmos los programadores de software?

¿Cuál fue su enfoque para aprender estructuras de datos y algoritmos?

¿Es una persona inteligente debido a los 'algoritmos' que usa su cerebro? Si es así, ¿alguien podría copiar ese 'algoritmo' para ser igualmente inteligente?

Cómo usar un algoritmo rápido para la detección y el seguimiento del objeto anómalo

En C, el nombre de la matriz denota la dirección del elemento cero de la matriz. ¿Es esto solo una regla, o tiene alguna razón asociada?

¿Hay alguna relación de recurrencia famosa aparte de Fibonacci?

¿Cuál es la lógica detrás de los algoritmos de ajuste de aprendizaje automático?