L'exercice suivant a été remis aux étudiants que je supervise:
Étant donné points dans le plan, imaginez un algorithme qui trouve une paire de points dont la distance est minimale parmi toutes les paires de points. L'algorithme doit s'exécuter au temps .
Il existe un algorithme de division et de conquête (relativement) simple qui résout la tâche dans le temps .
Question 1 : Existe-t-il un algorithme qui résout le problème donné exactement dans le pire des cas ?
Ce qui m'a fait soupçonner que cela pourrait être possible est un résultat que je me souviens avoir vu dans certains discours (référence appréciée). Il a déclaré quelque chose dans le sens que pas plus d'un nombre constant de points peuvent être disposés dans le plan autour d'un point intérieur d'un cercle de rayon , avec la distance minimale entre deux des points impliqués . Je pense que , les points formant un hexagone équilatéral avec au centre (dans le cas extrême).
Dans ce cas, l'algorithme suivant devrait résoudre le problème en étapes.
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
Notez que ceci est (prétendu être) dans le temps linéaire , car seul un nombre constant de points ne r
peut être farer loin que m
de p
( en supposant déclaration ci - dessus); seuls ces points doivent être étudiés pour trouver un nouveau minimum. Il y a un hic, bien sûr; comment implémentez-vous nextNeighbour
(peut-être avec un prétraitement en temps linéaire)?
Question 2 : Soit un ensemble de points et un point . Soit avec
and
.
Assume is finite. Is it possible to find with minimal distance from in (amortised) time ? (You may assume to be constructed by adding investigated points one by one.)