假设我们有一个包含n个向量的数组。我们想要计算这些向量之间的最大欧氏距离。 最简单(天真?)的方法是迭代数组,并为每个向量计算其与所有后续向量的距离,然后找到最大值。 然而,这个算法会增长(n-1)!关于阵列的大小。
还有其他更有效的方法解决这个问题吗?
感谢。
答案 0 :(得分:3)
你对朴素算法的复杂性的计算是不可靠的,它应该是O(n(n-1)/2)
,它会减少到O(n^2)
。计算两个向量之间的距离是O(k)
,其中k
是向量中元素的数量;这仍然会使复杂性远低于O(n!)
。
答案 1 :(得分:1)
对于强力算法,复杂度为O(N ^ 2 * K)(K是向量中的elem的数量)。但是我们可以通过在欧几里德空间中了解A,B和C点来做得更好:
|AB| + |AC| >= |BC|
算法应该是这样的:
如果到目前为止找到的最大距离为MAX
,而|AB|
的最大距离为C
,则已计算距离|AC|
和|CB|
MAX > |AC|+|CB|
,然后我们可以跳过|AB|
的计算。
很难说这个算法的复杂性,但我的直觉告诉我离O(N*log(N)*K)
答案 2 :(得分:0)
此问题之前已在此处,请参阅How to find two most distant points?
答案是:可以在欧几里德空间中小于O(n ^ 2)。另请参阅http://mukeshiiitm.wordpress.com/2008/05/27/find-the-farthest-pair-of-points/
答案 3 :(得分:0)
假设你有一对A点和B点。考虑分别在北极和南极有A和B的超球面。包含在超球面中的任何一点C能否远离A而不是B?
进一步假设我们将pointset分区为sqrt(N)超级盒,每个盒子都有sqrt(N)个点。对于任何一对超级箱,我们可以在k时间内计算其中包含的无限点集的任意两点之间可能的最大距离 - 通过简单地计算它们最远角之间的距离。如果我们已经有一个比这更好的候选者,我们可以丢弃那些超级盒子中的所有点。