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.)
la source
Réponses:
It is impossible to solve the problem in less thancnlogn time in standard models, e.g. using algebraic decision trees. This follows from the work of Yao and Ben-Or that shows that in this model it is not possible to decide if a set of n input numbers are all different or not (see http://people.bath.ac.uk/masnnv/Teaching/AAlg11_8.pdf). In case of your problem, imagine that all of them are on the real line. If two points are the same, then your output would be two points with distance zero, while otherwise not, so a solution to your problem would also solve the DISTINCT NUMBERS problem. If you want to suppose that all your points are different, then just add iϵ to the xi inputs of the DISTINCT NUMBERS problem, in this case if your output is at most nϵ , then the numbers are not all distinct. (Although in this case you have to use a promise version where the difference of any two distinct numbers is at least 2nϵ , but I think the same proof works to show that you also need Ω(nlogn) in this case.)
la source
There is a randomized linear expected time algorithm by Rabin; see e.g. Rabin Flips a Coin on Lipton's blog.
la source
As much as I understand question 2, Rabin's algorithm provides a kind of an answer to that too. At each time step the data structure is a grid with cell width less than the smallest distance between pairs of points seen so far, divided by2–√ (so that no cell contains more than a single point). To answer the query in question 2, you only need to map p to a cell in the grid and look at a constant number of cells around it. By the analysis of the algorithm, if the input point set is examined in random order, than the amortized update time for the grid is O(1) per new point in expectation.
la source