Los costos de realizar aprox. búsqueda de vecino más cercano en un quadtree

10

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 )O(1)O(logn)


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?

quadtree antes (izquierda) y después (derecha) inserción del punto

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 )log(c/ε)q2reqqO(1)2reQ0 0O(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.

0__
fuente
2
Ha pasado un tiempo, así que no recuerdo con precisión, pero al releer el periódico esta mañana (tanto en las versiones de arxiv como de diario) no pude encontrar dónde dice que guardamos los punteros que usted dice que necesitamos. Pensé que solo manteníamos punteros de padres e hijos y punteros de muestras cruzadas. Entonces, tal vez podría señalar con mayor precisión el texto en el documento que dice lo que dice que hace.
David Eppstein
2
Hola David, gracias por echar un vistazo. La búsqueda ANN es la última sección (6). El problema se indica en la fig. 7 (b), que es aproximadamente lo que he graficado en la ilustración anterior, si q está en algún lugar en la parte inferior izquierda. He editado la pregunta para incluir la parte particular del texto de la sección 6.3. Tengo algunas ideas sobre cómo podría relajarme con la definición de equistabbing tal vez, pero no estoy seguro de poder probar que cualquier conteo alternativo no viole el rendimiento objetivo ...
0__
2
Ok, eso parece un problema. Lo estoy discutiendo con Goodrich (hemos perdido contacto con Sun, quien hizo la mayoría de los detalles aquí). Nuestra sensación actual es que en realidad no deberíamos necesitar estos punteros adicionales (no los necesitamos para rangos aproximados, por qué los vecinos aproximados deberían ser diferentes, y el algoritmo de consulta debería poder recordar los antepasados ​​que vio en el en lugar de usar punteros para buscarlos), pero nos pondremos en contacto con usted cuando estemos un poco más seguros de los detalles aquí.
David Eppstein
2
Genial, muchas gracias. Por razones de recuento de caracteres y diseño, agregaré una respuesta que esboza mi 'idea intuitiva', tal vez sea un punto de partida.
0__

Respuestas:

11

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,

Michael Goodrich
fuente
¡Esas son buenas noticias! Simplemente no estaba seguro de si agregar a los hermanos durante el paso hacia abajo cambiaría el límite del costo total del peor de los casos o no, pero supongo que no. Arya et al., Había examinado el documento, pero lo encontré mucho menos accesible que su documento de Quadtree :)
0__
55
¡Guauu! Bienvenido a cstheory.SE!
Hsien-Chih Chang 張顯 之
5

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 ...

Sariel Har-Peled
fuente
3
Sí, y las variantes deterministas son muy parecidas a 2-3 árboles para el mismo orden z.
David Eppstein
Gracias por el enlace, he visto tu artículo antes, de hecho. En cualquier caso, no pude verificar empíricamente el límite con el algoritmo dado. Tengo la sensación de que la referencia al Lema 7, que se utiliza para limitar el número de rondas en el teorema 13, podría no ser válida, porque supone un radio constante , mientras que el radio de búsqueda en el ANN cambia gradualmente, y también lo hace el Conjunto de cuadrados críticos. ? r
0__
El radio definitivo se reduce durante el proceso de búsqueda. Soy razonablemente optimista, el argumento es correcto.
Sariel Har-Peled
1

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 vlbestrmaxreyost(v,q)qvv

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 tp 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 vPAGlsimistpag0 0Q0 0rmetrounaXlsimistpag0 0Q0 0qlsimistrmetrounaXqreyost(q,v)reyost(q,v)v encuentra dentro de , o la distancia más corta de todas las esquinas de a .qqv

reyost(q,v)>rmetrounaXq2PAG

qpag0 0QjrmetrounaXQj-1Q0 0

rmetrounaXPAG


EDITAR (abril de 2013)

rmetrounaX

O(norte)

ingrese la descripción de la imagen aquí

0__
fuente
0

O(ϵ1-re(Iniciar sesiónnorte+Iniciar sesiónϵ-1))

ϵ=1v

Q0 0

O(norte)re=2ϵ=1O(Iniciar sesiónnorte)

Entonces, a menos que me falte algo crucial, el algoritmo no puede alcanzar la velocidad establecida. ¿Algún comentario o idea?

el recorrido

0__
fuente