Dados dos conjuntos y cada uno con puntos disjuntos en el plano, calcule la distancia más corta entre un punto en y un punto en , es decir, .
No estoy seguro de tener razón, pero este problema es muy similar a los problemas que pueden resolverse mediante programación lineal en geometría computacional. Sin embargo, la reducción a LP no es sencilla. Además, mi problema se relaciona con encontrar el punto más delgado entre dos conjuntos de puntos que, obviamente, se puede resolver con LP en en un espacio bidimensional.
Respuestas:
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)
El resto está en pseudocódigo para hacerlo más claro:
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á.v re sik- unj v ≤ ∥ 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) UNA si O ( 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
fuente
Puede adaptar el algoritmo de barrido de línea del "par más cercano" que es .O ( n logn )
El único cambio que tendrá que hacer es ignorar los pares que pertenecen al mismo conjunto.
Editar: Esto en realidad no es simple (o incluso posible) como lo describí. Ver comentarios para la discusión.
fuente
La idea en problemas como este es crear una estructura ordenada a partir de uno de los conjuntos que permita consultas eficientes del vecino más cercano. El artículo clásico que presentó una estructura de consulta O (log n) para una dimensión arbitraria fue:
Shamos y Hoey sobre soluciones Voronoi
Desde entonces se han creado una serie de otras particiones espaciales basadas en ideas de teselaciones de Delauney, que también se traducen en una variedad de descripciones de barrido del subespacio. Tenga en cuenta que el método Voronoi también se incluiría en una descripción general de divide y vencerás debido a su partición plana que hace que el paso de construcción O (n log n).
Entonces, la solución básica a este problema es:
Como se puede ver mirando la complejidad de cada paso, la complejidad total es O (n log n). Para el lector moderno que no mira documentos clásicos, esto está cubierto en muchos libros de algoritmos, por ejemplo, "El algoritmo de diseño manual" de Skiena.
fuente
El límite inferior para este problema es bajo el modelo de árbol de decisión algebraico. Daré un bosquejo de su prueba aquí.O ( n ∗ logn )
Reduciremos la instancia del problema de distinción de elementos E a C.
Sabemos que el límite inferior en tiempo de ejecución para decidir el problema de distinción de elementos es . Por lo tanto, por reducción, el límite inferior también se aplica a nuestro problema.O ( n ∗ logn )
fuente