Это специфическая форма проблемы k-ближайшего соседа , а именно, где k = 3. На приведенной странице не указывается алгоритмическая сложность, но совершенно очевидно, что наивный подход заключается в вычислении расстояния от выбранной точки до всех других точек, а затем вычислении расстояния от этой точки до всех других точек, а также расстояния наша исходная точка для новой выбранной точки O (n k-1 ). Рассмотрим псевдокод:
for pointB in searchSpace do:
distanceAB := calculateDistance(pointA, pointB)
for pointC in {searchSpace} - {pointB} do:
distanceBC := calculateDistance(pointB, pointC)
distanceCA := calculateDistance(pointC, pointA)
if (distanceAB + distanceBC + distanceCA) < currentMin then:
currentMin := distanceAB + distanceBC + distanceCA
closestPoints := {pointA, pointB, pointC}
Обратите внимание, что мы предполагаем, что pointA
уже удален из searchSpace
. Это алгоритм O (n 2 ). Предполагая, что размерность относительно мала, или что функция calculateDistance
растет линейно или меньше вместе с размером, это дает решение в приемлемых временных рамках. Оптимизация, конечно, может быть, но она может и не потребоваться.
Если вы хотите увидеть настоящий код, в Википедии есть много ссылок на реализации .