计算数组中向量之间的最大距离
Posted
技术标签:
【中文标题】计算数组中向量之间的最大距离【英文标题】:Calculate the maximum distance between vectors in an array 【发布时间】:2012-08-24 11:04:31 【问题描述】:假设我们有一个包含 n 个向量的数组。我们想计算这些向量之间的最大欧几里得距离。 最简单的(天真的?)方法是迭代数组并为每个向量计算其与所有后续向量的距离,然后找到最大值。 然而,这个算法会增长(n-1)!关于数组的大小。
还有其他更有效的方法来解决这个问题吗?
谢谢。
【问题讨论】:
向量之间的距离是什么意思?你如何定义2个向量之间的距离?点很清楚,但是向量呢? 两个向量之间的欧式距离定义明确:sqrt(sum((x_i-y_i)^2)) ?您是否担心向量的长度不相等?我认为他的问题意味着所有向量的长度都相等。 (他使用的是数学意义上的向量,而不是 C++ 意义上的) How to find two most distant points?的可能重复 @sdcvvc:这个问题是关于二维点集的。这是一个 kD 点集。 【参考方案1】:您对朴素算法复杂性的计算很不稳定,它应该是O(n(n-1)/2)
,它减少到O(n^2)
。计算两个向量之间的距离是O(k)
,其中k
是向量中的元素数;这仍然给出了远低于O(n!)
的复杂性。
【讨论】:
Computing the distance between two vectors is O(k^2)
-- 这是不正确的。它应该是 O(k)。
@HighPerformanceMark 欧几里得空间有一些有用的属性,可以让您不必检查每一对点。
您的第二段似乎暗示检查每一对是我们能做的最好的。事实并非如此,我们可以做得更好。
好吧,我试图删除这个答案,但显然一旦它被接受我就不能了!
哈哈,删第二段就好了。【参考方案2】:
蛮力算法的复杂度为 O(N^2 * K)(K 是向量中元素的数量)。但是我们可以通过知道在欧几里得空间中的点 A、B 和 C 做得更好:
|AB| + |AC| >= |BC|
算法应该是这样的:
如果到目前为止找到的最大距离是 MAX
并且对于 |AB|
有一个点 C
,这样距离 |AC|
和 |CB|
已经计算并且 MAX > |AC|+|CB|
,那么我们可以跳过计算|AB|
。
很难说这个算法的复杂性,但我的直觉告诉我它离O(N*log(N)*K)
不远@
【讨论】:
【参考方案3】:这个问题之前有过,见How to find two most distant points?
答案是:可以在欧几里得空间中以小于 O(n^2) 的时间完成。另见http://mukeshiiitm.wordpress.com/2008/05/27/find-the-farthest-pair-of-points/
【讨论】:
【参考方案4】:假设您有一对点 A 和 B。考虑分别在北极和南极具有 A 和 B 的超球面。超球面中包含的任何点 C 是否可以比 B 更远?
进一步假设我们将点集划分为 sqrt(N) 个超框,每个超框有 sqrt(N) 个点。对于任何一对超框,我们可以在 k 时间内计算它们中包含的无限点集合中任意两点之间可能的最大距离——通过简单地计算它们最远角之间的距离。如果我们已经有一个比这更好的候选者,我们可以丢弃这些超框中的所有点对。
【讨论】:
以上是关于计算数组中向量之间的最大距离的主要内容,如果未能解决你的问题,请参考以下文章