Задача: <p> Предоставить функцию для поиска ближайших двух точек среди множества заданных точек в двух измерениях, т. <ahref="https://en.wikipedia.org/wiki/Closest pair of points problem"title="wp: Ближайшая проблема с двумя точками">Е. Решить задачу Ближайшей пары точек</a> в плоском случае. </p><p> Прямым решением является алгоритм O (n <sup>2</sup> ) (который мы можем назвать алгоритмом грубой силы); псевдокод (с использованием индексов) может быть простым: </p><pre> bruteForceClosestPair из P (1), P (2), ... P (N)
</pre><p> Лучший алгоритм основан на подходе рекурсивного разделения и покорения, как это объясняется также в <ahref="https://en.wikipedia.org/wiki/Closest pair of points problem#Planar_case"title="wp: Ближайшая проблема с двумя точками # Planar_case">самой близкой проблеме точек Википедии</a> , которая является O (n log n); псевдокод может быть: </p><pre> ближайшая пара (xP, yP)
где xP - P (1) .. P (N), отсортированная по координате x, и
yP - P (1). P (N), отсортированный по координате y (по возрастанию)
если N ≤ 3, то
возвращать ближайшие точки xP с использованием алгоритма грубой силы
еще
xL ← точки xP от 1 до ⌈N / 2⌉
xR ← точки xP от ⌈N / 2⌉ + 1 до N
xm ← xP (⌈N / 2⌉) <sub>x</sub>
yL ← {p ∈ yP: p <sub>x</sub> ≤ xm}
yR ← {p ∈ yP: p <sub>x</sub>> xm}
(dL, pairL) ← ближайшая пара (xL, yL)
(dR, pairR) ← ближайшая пара (xR, yR)
(dmin, pairMin) ← (dR, pairR)
если dL <dR, тогда
(dmin, pairMin) ← (dL, pairL)
ENDIF
yS ← {p ∈ yP: | xm - p <sub>x</sub> | <dmin}
nS ← число точек в yS
(ближайший, ближайший) ← (dmin, pairMin)
для i от 1 до nS - 1
k ← i + 1
в то время как k ≤ nS и yS (k) <sub>y</sub> - yS (i) <sub>y</sub><dmin
</pre> Ссылки и дальнейшие чтения: <ahref="http://classes.cec.wustl.edu/~cse241/handouts/closestpair.pdf"title="ссылка: http://classes.cec.wustl.edu/~cse241/handouts/closestpair.pdf">Самая близкая</a><ahref="https://en.wikipedia.org/wiki/Closest pair of points problem"title="wp: Ближайшая проблема с двумя точками">пара проблем точек</a><ahref="http://www.cs.mcgill.ca/~cs251/ClosestPair/ClosestPairDQ.html"title="ссылка: http://www.cs.mcgill.ca/~cs251/ClosestPair/ClosestPairDQ.html">Ближайшая пара (McGill)</a><ahref="http://www.cs.ucsb.edu/~suri/cs235/ClosestPair.pdf"title="ссылка: http://www.cs.ucsb.edu/~suri/cs235/ClosestPair.pdf">Ближайшая пара (UCSB)</a><ahref="http://classes.cec.wustl.edu/~cse241/handouts/closestpair.pdf"title="ссылка: http://classes.cec.wustl.edu/~cse241/handouts/closestpair.pdf">Ближайшая пара (WUStL)</a><ahref="http://www.cs.iupui.edu/~xkzou/teaching/CS580/Divide-and-conquer-closestPair.ppt"title="ссылка: http://www.cs.iupui.edu/~xkzou/teaching/CS580/Divide-and-conquer-closestPair.ppt">Ближайшая пара (IUPUI)</a><p> Для ввода предположим, что аргумент представляет собой массив объектов (точек) с элементами <code>x</code> и <code>y</code> установленными в числа. Для вывода возвращаем объект, содержащий пары ключ: значение для <code>distance</code> и <code>pair</code> (т. Е. Пару из двух ближайших точек). </p>