El par de puntos más cercano entre dos conjuntos, en 2D

11

Tengo dos conjuntos de puntos en el plano bidimensional. Quiero encontrar el par de puntos más cercano s , t tal que s S , t T , y la distancia euclidiana entre s , t sea ​​lo más pequeña posible. ¿Cuán eficientemente se puede hacer esto? ¿Se puede hacer en O ( n log n ) tiempo, donde n = | S | + | T | ?S,Ts,tsStTs,tO(nlogn)n=|S|+|T|

Sé que si me dan un solo conjunto , entonces es posible encontrar el par de puntos más cercano s , s S en el tiempo O ( n log n ) usando un algoritmo estándar de divide y vencerás . Sin embargo, ese algoritmo no parece generalizarse al caso de dos conjuntos, porque no hay conexión entre la distancia entre los dos puntos más cercanos dentro de S o T frente a la distancia entre los dos puntos más cercanos a través de esos conjuntos.Ss,sSO(nlogn)ST

Pensé en almacenar el conjunto en un árbol k -d, luego para cada s S , usando una consulta de vecino más cercano para encontrar el punto más cercano en T a s . Sin embargo, el peor tiempo de ejecución de esto podría ser tan malo como el tiempo O ( n 2 ) . Hay resultados que dicen que si los puntos de T se distribuyen aleatoriamente, entonces el tiempo de ejecución esperado para cada consulta es O ( log n ) , por lo que obtendríamos un algoritmo con el tiempo de ejecución esperado O ( n log n )TksSTsO(n2)TO(logn)O(nlogn) si se nos garantizara que los puntos se distribuyen aleatoriamente, pero estoy buscando un algoritmo que funcione para cualquier colección de puntos (no necesariamente distribuidos aleatoriamente).

Motivación: un algoritmo eficiente sería útil para esta otra pregunta .

DW
fuente

Respuestas:

10

Sí, este puede ser el tiempo . Construir un diagrama de Voronoi de T . Luego, para cada punto s S , encuentre en qué celda del diagrama de Voronoi está contenido. El centro de esa celda es el punto t T que está más cerca de s .O(nlogn)TsStTs

Puede construir un diagrama de Voronoi en tiempo , y cada consulta (encontrar la celda que contiene s ) se puede hacer en tiempo O ( log n ) , por lo que el tiempo total de ejecución es O ( n log n ) .O(nlogn)sO(logn)O(nlogn)

DW
fuente
Agradable, mucho más simple de lo que se me ocurrió :).
aelguindy
Buen enfoque! Sin embargo, los enlaces ayudarían, especialmente para el lado de consulta de las cosas. Podría encontrar una página de Wikipedia que muestra que el problema general de la ubicación del punto se puede resolver en el tiempo , pero ¿hay una mejor manera para el caso especial de las células Voronoi? Mi búsqueda solo apareció esta respuesta , que lo hace de la manera O ( n ) . O(logn)O(n)
j_random_hacker
Tn=|S|+|T|O(n)
1
nO(n)6n
Eso parece correcto a partir de esta pregunta en math.stackexchange.
Albjenow
5

L1

dO(nlogd1n)

O(nlogn)O(nlog2n)

S,TSδzTδzzδzδz

aelguindy
fuente
P2pmPPqmQQ
1
l
Enlace roto :(
Keerthana Gopalakrishnan