这是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
随维度线性增长或更小,这会在适当的时间约束内给出解决方案。当然可以进行优化,但可能不需要。
如果你想看一些真实的代码,维基百科有很多实现 的链接。