La distancia más corta entre un punto en A y un punto en B


9

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, .ABnABmin { dist(p,q) | pAqB }

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 O(n) en un espacio bidimensional.


44
¿Cuál es la pregunta aquí?
Raphael


No soy un experto, pero generalmente en el aprendizaje automático, donde estos puntos son datos, los conjuntos se comportan bien la mayor parte del tiempo y están agrupados, por lo que los algoritmos como el sugerido por @Pedro funcionan bien.
chazisop

3
"que obviamente puede ser resuelto por LP en O (n) en un espacio bidimensional" - Me pregunto qué provocó esta afirmación. La "programación lineal" en general no se puede resolver en tiempo lineal; lo "lineal" se refiere a otra cosa. Entonces, ¿el LP tiene una forma especial?
Raphael

Respuestas:


5

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)

  1. dejar que sea el eje entre los centros de masa de y .A BvAB
  2. 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 nABa0a1anb0b1bn

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

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)ABO(nlogn)

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(nlogn)

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


2
@Pedro: Lo siento, no he comentado antes (no hay tiempo en ese momento). La razón por la que rechacé su respuesta fue porque fue una mala respuesta y no debería haber estado en la parte superior. Esto es realmente un problema bien conocido en geometría computacional con el peor de los casos O (n log n). Una buena respuesta habría señalado el problema conocido (tal vez con una referencia) y las soluciones comunes, que incluyen: usar árboles kd y probar por elementos, algoritmos de barrido, etc. La idea general debería ser preprocesar en una estructura ordenada y usar eso . Mire el caso 1D: más obvio O (n log n) allí.
ex0du5

2
@ ex0du5: ¡Parece que debería publicar su propia respuesta! Tenga en cuenta que "hay una mejor respuesta" generalmente no es una buena razón para votar negativamente; esta medida debe reservarse para respuestas incorrectas, spam y muy mal formateadas. Pedro no es ninguno de los dos. Vea también aquí para tener una idea de cuánto piensan algunas personas que deberían darse antes de un voto negativo.
Raphael

1
@Raphael: No respondí porque había una respuesta justa y no tuve tiempo de buscar referencias. En cuanto a su referencia sobre cómo hacer un voto negativo, ¡es un algoritmo horrible para estos sitios! Los estudiantes de CS deben comprender especialmente la importancia de no perder la meta del formalismo. El objetivo de la votación es mover las respuestas a una clasificación que guiará a los estudiantes posteriores del mismo problema a las respuestas más útiles. Mi algoritmo para votar hace eso. Ese algo: obviamente no. Esto se puede discutir en un meta si lo desea, pero como adultos, deberíamos usar nuestros poderes para siempre, creo.
ex0du5

1
@ ex0du5: Parece que ahora tienes algo de tiempo libre. ¿Puede realmente demostrar que esta instancia es en realidad un "problema bien conocido con el peor de los casos "? O(norteIniciar sesiónnorte)
Pedro

1
@ ex0du5: En realidad, la búsqueda de vecino más cercano, por ejemplo, usando árboles kd , solo tiene una complejidad promedio O (logn) . Así que volvemos al punto de partida.
Pedro

4

Puede adaptar el algoritmo de barrido de línea del "par más cercano" que es .O(norteIniciar sesiónnorte)

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.


2
Solo una observación, también se puede adaptar el algoritmo clásico de dividir y conquistar para pares más cercanos que también se ejecuta en ; ver también Wikipedia . O(norteIniciar sesiónnorte)
rizwanhudda

1
Para un algoritmo de tiempo lineal aleatorio, vea, por ejemplo, Rabin lanza una moneda en el blog de Lipton.
Juho

3
¿Podría ser un poco más específico acerca de cómo implementaría esto para conjuntos disjuntos, especialmente con respecto al mantenimiento del límite ? O(norteIniciar sesiónnorte)
Pedro

-1 por incorrección. El algoritmo de barrido de línea de par más cercano que vincula depende del conjunto ordenado que contiene elementos , pero en el caso de conjuntos disjuntos, este conjunto comienza con elementos, por lo que ya no está en , en al menos no en el peor de los casos. n O ( n log n )O(1)norteO(norteIniciar sesiónnorte)
Pedro

1
@Pedro: ¿Por qué sería más grande? En todo caso, el conjunto de puntos candidatos actuales debería reducirse.
Raphael

4

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:

  1. Tome el conjunto A y cree la eficiente estructura de consulta de Vecino más cercano que elija. Este paso de construcción es O (n log n) [véase el teorema 4].
  2. Para cada elemento en B, consulte la estructura A para el vecino más cercano. Cada consulta es O (log n) [ver teorema 15, dimensión fija], por lo que el tiempo total de consulta para todos los puntos en B es O (n log n).
  3. Cuando se recupera el resultado del punto más cercano en A a cada B, colóquelo en una estructura ordenada en la distancia. Esto es O (log n) inserte cada resultado u O (n log n) para todos.
  4. Cuando se ha mirado todo B, puede obtener rápidamente (O (1)) el punto B en la estructura ordenada con la distancia vecina más pequeña a un punto en A.

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.


1
"La solución de Artium, por ejemplo, se puede escribir de esta forma y es completamente válida". - bueno, lo que propones aquí ya no es un algoritmo de línea de barrido (puro), así que no sé sobre eso.
Raphael

@Raphael: Claro que lo es. Los algoritmos Sweepline preprocesan los puntos en una estructura ordenada tal como se describe aquí. Incluso me vinculé al algoritmo de Fortune bajo su respuesta, que muestra que el algoritmo de línea de barrido es solo una instancia del algoritmo de Voronoi. La razón por la que mantuve la solución genérica para la estructura de consulta es porque hay una gran cantidad de mecanismos geométricos que se han desarrollado para esto.
ex0du5

No necesita un orden particular mientras itera sobre , mientras que el orden es esencial para los algoritmos de línea de barrido (¿muchos / todos?) (De ahí el nombre, supongo). si
Raphael

1

No estoy seguro si tengo 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 parece estar relacionado con la búsqueda del tramo más delgado entre dos conjuntos de puntos que, obviamente, puede ser resuelto por LP en un espacio bidimensional.

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(nlogn)

Reduciremos la instancia del problema de distinción de elementos E a C.

  • Entrada a E: S={una1,una2,una3,...,unanorte}
  • Sea > 0 una fracción pequeñaϵ
  • A = ,B = { ( a i + ϵ ) : 1 i n }{(unayo,0 0):1yonorte}si={(unayo+ϵ):1yonorte}
  • Ahora, si podemos encontrar la distancia más corta (d) entre los conjuntos A y B. Podemos decidir el problema de distinción de elementos en un tiempo adicional de siguiente manera O(norte)
    • El conjunto tiene un duplicado si y solo si d =ϵSϵ

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(norteIniciar sesiónnorte)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.