El siguiente ejercicio ha sido entregado a los estudiantes que superviso:
Dados puntos en el plano, diseñe un algoritmo que encuentre un par de puntos cuya distancia sea mínima entre todos los pares de puntos. El algoritmo debe ejecutarse en el tiempo .
Existe un algoritmo de división y conquista (relativamente) simple que resuelve la tarea a tiempo .
Pregunta 1 : ¿Existe un algoritmo que resuelva el problema dado exactamente en el peor de los casos ?
Lo que me hizo sospechar que esto podría ser posible es un resultado que recuerdo haber visto en alguna charla (referencia apreciada). Declaró algo en el sentido de que no se puede disponer más que un número constante de puntos en el plano alrededor de algún punto dentro de un círculo de radio , con la distancia mínima entre cualquiera de los dos puntos involucrados . Creo que , los puntos que forman un hexágono equilátero con en el centro (en el caso extremo).
En ese caso, el siguiente algoritmo debería resolver el problema en pasos.
fun mindist [] | p::[] = INFINITY
| mindist p1::p1::[] = dist(P[0], P[1])
| mindist p::r = let m = mindist(r) in
min(m, nextNeighbour(p, r, m))
end
Observe que esto es (afirma que es) en el tiempo lineal porque sólo un número constante de puntos en r
puede ser no farer lejos que m
a partir de p
(suponiendo por encima de declaración); solo estos puntos tienen que ser investigados para encontrar un nuevo mínimo. Hay una trampa, por supuesto; ¿Cómo se implementa nextNeighbour
(tal vez con preprocesamiento en tiempo lineal)?
y
.
Suponga que es finito. ¿Es posible encontrar con una distancia mínima desde en tiempo (amortizado) ? (Puede suponer que se construye agregando puntos investigados uno por uno).
fuente
Respuestas:
Es imposible resolver el problema en menos de tiempo en modelos estándar, por ejemplo, utilizando árboles de decisión algebraicos. Esto se desprende del trabajo de Yao y Ben-Or que muestra que en este modelo no es posible decidir si un conjunto de números de entrada son todos diferentes o no (ver http://people.bath.ac.uk/masnnv /Teaching/AAlg11_8.pdf ). En caso de su problema, imagine que todos ellos están en la línea real. Si dos puntos son iguales, entonces su salida sería dos puntos con distancia cero, mientras que de lo contrario no, por lo que una solución a su problema también resolvería el problema DISTINCT NUMBERS. Si desea suponer que todos sus puntos son diferentes, simplemente agregue acnlogn n iϵ xi entradas del problema DISTINCT NUMBERS, en este caso si su salida es como máximo , entonces los números no son todos distintos. (Aunque en este caso tiene que usar una versión prometedora donde la diferencia de dos números distintos es al menos , pero creo que la misma prueba funciona para mostrar que también necesita en este caso.)nϵ 2nϵ Ω(nlogn)
fuente
Hay un algoritmo de tiempo esperado lineal aleatorio de Rabin; ver, por ejemplo, Rabin lanza una moneda en el blog de Lipton.
fuente
Por mucho que entiendo la pregunta 2, el algoritmo de Rabin proporciona una especie de respuesta a eso también. En cada paso de tiempo, la estructura de datos es una cuadrícula con un ancho de celda menor que la distancia más pequeña entre pares de puntos vistos hasta ahora, dividido por (para que ninguna celda contenga más de un solo punto). Para responder la consulta en la pregunta 2, solo necesita asignar a una celda en la cuadrícula y observar un número constante de celdas a su alrededor. Mediante el análisis del algoritmo, si el conjunto de puntos de entrada se examina en orden aleatorio, entonces el tiempo de actualización amortizado para la cuadrícula es por nuevo punto en expectativa.2–√ p O(1)
fuente