Tengo una solución que puede parecer un poco complicada, pero debería ser más eficiente que la ingenua búsqueda de fuerza bruta:O ( n2)
- dejar que sea el eje entre los centros de masa de y .A BvUNAsi
- Ordene los puntos en y largo de este eje en orden descendente y ascendente respectivamente, dando como resultado las secuencias , , ..., y , , ..., .B a 0 a 1 a n b 0 b 1 b nUNAsiuna0 0una1unanortesi0 0si1sinorte
El resto está en pseudocódigo para hacerlo más claro:
d = infinity.
for j from 1 to n
if (b_1 - a_j) along v > d then break endif
for k from 1 to n
if (b_k - a_j) along v > d then
break
else
d = min( d , ||b_k - a_j|| )
endif
enddo
enddo
Es decir, al ordenar previamente los puntos a lo largo de , puede filtrar los pares que nunca estarán dentro de uno del otro ya que largo de siempre será.vresik- unjv≤ ∥ bk- unj∥
En el peor de los casos, esto sigue siendo , pero si y están bien separados, debería ser mucho más rápido que eso, pero no mejor que , que es necesario para la clasificaciónA B O ( n log n )O ( n2)UNAsiO ( n logn )
Actualizar
Esta solución de ninguna manera se saca de un sombrero. Es un caso especial de lo que uso en las simulaciones de partículas para encontrar todos los pares interactivos de partículas con binning espacial. Mi propio trabajo explicando el problema más general está aquí .
En cuanto a la sugerencia de usar un algoritmo de barrido de línea modificado, aunque intuitivamente simple, no estoy convencido de que esto esté en cuando se consideran conjuntos disjuntos. Lo mismo ocurre con el algoritmo aleatorio de Rabin.O ( n logn )
No parece haber mucha literatura sobre el problema del par más cercano en conjuntos disjuntos, pero he encontrado esto , que no pretende estar bajo , y esto , que no parece para hacer cualquier reclamo sobre cualquier cosa.O ( n2)
El algoritmo anterior puede verse como una variante del barrido de plano sugerido en el primer artículo (Shan, Zhang y Salzberg), pero en lugar de usar el eje y no ordenar, se usa el eje entre los conjuntos y se atraviesan los conjuntos. en orden descendente / ascendente.X