Mientras trabajaba en la simulación de interacciones entre partículas, tropecé con la indexación de la cuadrícula en Morton-order (orden Z) (Wikipedia link) que se considera que proporciona una búsqueda eficiente de células vecinas más cercanas. La razón principal que he leído es el orden casi secuencial de celdas espacialmente cercanas en la memoria.¿Beneficios de la búsqueda del vecino más cercano con el pedido de Morton?
Al estar en la mitad de una primera implementación, no puedo entender cómo implementar eficientemente el algoritmo para los vecinos más cercanos, especialmente en comparación con una cuadrícula básica uniforme.
Dado una célula (x, y) es trivial para obtener los índices de glóbulos 8 vecino y calcular la respectiva z-index. Aunque esto proporciona tiempo de acceso constante a los elementos, el índice z debe calcularse o buscarse en tablas predefinidas (separadas para cada eje y OR '). ¿Cómo puede ser esto más eficiente? ¿Es cierto que acceder a los elementos de una matriz A en un orden de decir A [0] -> A 1 -> A [3] -> A [4] -> ... es más eficiente que en una orden A [1023 ] -> A [12] -> A [456] -> A [56] -> ...?
He esperado que exista un algoritmo más simple para encontrar los vecinos más cercanos en orden z. Algo a lo largo de las líneas: encuentre la primera celda de vecinos, itere. Pero esto no puede ser cierto, ya que esto funciona muy bien solo dentro de bloques de 2^4 tamaños. Sin embargo, hay dos problemas: cuando la celda no está en el límite, uno puede determinar fácilmente la primera celda del bloque e iterar a través de las celdas del bloque, pero hay que verificar si la celda es el vecino más cercano. Peor es el caso cuando la celda se encuentra en el límite, entonces uno tiene que tener en cuenta 2^5 celdas. ¿Que me estoy perdiendo aqui? ¿Existe un algoritmo comparativamente simple y eficiente que haga lo que necesito?
La pregunta en el punto 1. es fácilmente comprobable, pero no estoy muy familiarizado con las instrucciones subyacentes que el patrón de acceso descrito genera y realmente me gustaría entender lo que está pasando detrás de las escenas.
Gracias de antemano por cualquier ayuda, referencias, etc ...
EDIT:
Gracias por aclarar el punto 1! Entonces, con el orden Z, la tasa de aciertos de caché se incrementa en promedio para las celdas vecinas, interesante. ¿Hay alguna manera de registrar las tasas de aciertos/caídas del caché?
En relación con el punto 2: Debo añadir que entiendo cómo se construye la matriz ordenada por Morton para una nube de puntos en R^d donde se obtiene el índice i = f (x1, x2, ..., xd) bit a bit de entrelazado etc. lo que trato de entender es si hay una manera mejor que la siguiente ansatz ingenua para obtener los vecinos más cercanos (aquí en d = 2, "pseudo código"):
// Get the z-indices of cells adjacent to the cell containing (x, y)
// Accessing the contents of the cells is irrelevant here
(x, y) \elem R^2
point = (x, y)
zindex = f(x, y)
(zx, zy) = f^(-1)(zindex) // grid coordinates
nc = [(zx - 1, zy - 1), (zx - 1, zy), (zx - 1, zy + 1), // neighbor grid
(zx , zy - 1), (zx, zy + 1), // coordinates
(zx + 1, zy - 1), (zx + 1, zy), (zx + 1, zy + 1)]
ni= [f(x[0], x[1]) for x in nc] // neighbor indices
Aquí tienes una implementación de orden Morton en 3D http://dmytry.pandromeda.com/texts/collision_detection_using_z_order_curve_aka_Morton_order.html –
Aquí tienes la matemática detallada, los algoritmos y los resultados experimentales http://compgeom.com/~piyush/ papers/tvcg_stann.pdf –
No he visto sus comentarios antes de la edición. Voy a echar un vistazo más de cerca a las referencias, ¡muy apreciadas! – bbtrb