NOTA : La pregunta se ha reformulado en mis respuestas: Suponiendo ahora que podemos encontrar a los antepasados hermanos más bajos en el tiempo , ¿se puede realizar realmente el ANN en ?O ( log n )
Los quadtrees son índices espaciales eficientes. Tengo un enigma con la implementación de una búsqueda de vecino más cercano en una estructura de árbol cuádruple comprimido como se describe en [2]. (Sin entrar en detalles, la búsqueda va de arriba hacia abajo a lo largo de los llamados cuadrados equidistantes, terminando en el nodo de cola de un camino equidistante. En la imagen adjunta, este podría ser cualquiera de los nodos en el sureste llenos de puntos).
Para que su algoritmo funcione, uno debe mantener para cada nodo, un cuadrado con al menos dos cuadrantes no vacíos, punteros para cada nodo ancestro más bajo (más cercano en la jerarquía) en cada una de las cuatro direcciones (norte, oeste, sur , este). Estos están indicados por las flechas verdes para el ancestro hacia el oeste de los nodos (la flecha apunta al centro del cuadrado del ancestro).
El documento afirma que estos punteros pueden actualizarse en O (1) durante las inserciones y eliminaciones de puntos. Sin embargo, al observar la inserción del punto verde, parece que necesito actualizar cualquier número arbitrario de punteros, en este caso seis de ellos.
Espero un truco para hacer esta actualización de puntero en tiempo constante. ¿Quizás hay una forma de indirección que puede ser explotada?
EDITAR:
La sección relevante del artículo es 6.3, donde se lee: "si la ruta tiene curvas, además de los antepasados más bajos de de , también deberíamos considerar para cada una de las direcciones las más bajas ancestro de que va en esa dirección [...] Encontrar estos cuadrados de se puede hacer en tiempo por cuadrado si asociamos punteros adicionales a cada cuadrado en apuntando a sus ancestros más cercanos para cada dirección . Estos punteros también pueden actualizarse en el tiempo durante una inserción o eliminación de un punto ".q 2 d q q O ( 1 ) 2 d Q 0 O ( 1 )
[2]: Eppstein, D. y Goodrich, MT y Sun, JZ, "The Skip Quadtree: A Simple Dynamic Data Structure for Multidimensional Data", en Actas del vigésimo primer simposio anual sobre geometría computacional, págs. 296—305 2005.
Respuestas:
Al igual que David, no sé por qué Jonathan hizo ese comentario sobre los 2 ^ d punteros. No son necesarios Como David mencionó anteriormente, la propiedad esencial es que cuando estamos haciendo una ubicación de punto a una hoja v en Q_0, es suficiente recordar los nodos hermanos (y sus cajas) en el quadtree omitido. Cuando procesamos un cuadro desde P, hacemos una ubicación de punto para el cuadro de hoja más cercano a nuestro punto de consulta, insertando los cuadros hermanos a medida que avanzamos. Parece que esto sería más o menos lo mismo que tu respuesta. Además, este procedimiento es muy similar, por ejemplo, a cómo se realiza la ubicación aproximada del punto en el siguiente documento: Arya, Sunil and Mount, David M. y Netanyahu, Nathan S. y Silverman, Ruth y Wu, Angela Y., "Un algoritmo óptimo para el vecino más cercano que busca dimensiones fijas", JACM, 1998. De hecho,
fuente
Uno puede pensar en omitir quadtree como una implementación de lista de omisión de una estructura de datos que almacena los puntos de acuerdo con su orden z. Es (posiblemente) al menos conceptualmente más simple ...
Vea el capítulo 2 aquí: http://goo.gl/pLiEO .
Y sí, suponiendo que pueda realizar algunas operaciones básicas de orden z en tiempo constante, definitivamente puede hacer ANN en tiempo logarítmico. El capítulo antes mencionado también muestra que no hay forma de evitar tener operaciones extrañas si uno quiere cuadráticos comprimidos. Tenga en cuenta que la operación LCA no es necesaria ...
fuente
También intuitivamente siento que uno podría vivir sin esos punteros, y como necesito persistir todos los nodos en el disco duro en algún momento, cualquier reducción en los punteros es excelente.
Mi idea es más o menos la siguiente: además del mejor punto candidato (hoja) , también hacemos un seguimiento de la peor distancia en cada ronda, . La peor distancia sería la distancia máxima de todas las esquinas de un nodo al punto de consulta , sin importar si está dentro de un cuadrado o afuera. r m a x d i s t ′ ( v , q ) q v vlb e s t rm a x reyo soy t′( v , q) q v v
Una ronda es así: si está vacío, devuelve el , si hubiera alguno. De lo contrario, delete-min da el actual en . Inicialice en (o en si aún no se ha observado al mejor candidato). Primero, pruebe cada hijo no vacío de en . Si este hijo es una hoja, actualice y si es necesario. Si es un nodo, calcule y , siendo esta última la mejor distancia: cero, sil b e s t p 0 Q 0 r m a x l b e s t ∞ p 0 Q 0 q l b e s t r m a x q d i s t ′ ( q , v ) d i s t ( q , v ) v q q vPAG lb e s t pag0 0 Q0 0 rm a x lb e s t ∞ pag0 0 Q0 0 q lb e s t rm a x q reyo soy t′( q, V ) rei s t (q, V ) v encuentra dentro de , o la distancia más corta de todas las esquinas de a .q q v
EDITAR (abril de 2013)
fuente
Entonces, a menos que me falte algo crucial, el algoritmo no puede alcanzar la velocidad establecida. ¿Algún comentario o idea?
fuente