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 rpuede ser no farer lejos que ma 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).