【发布时间】:2021-01-30 08:59:20
【问题描述】:
明显的O(N^2)就是计算每对点之间的欧几里得距离。我已经用 Python 实现了(calc_euclidean_dist() 实现被省略):
def closestPointPair(pairs):
min_dist = sys.maxsize
for i in range(len(pairs)):
for j in range(i+1, len(pairs)):
dist = calc_euclidean_dist(pairs[i], pairs[j])
if dist < min_dist:
min_dist = dist
return min_dist
有没有更好的解决方案?也许订购积分?
【问题讨论】:
-
由于点a和b之间的距离与b和a之间的距离相同- 不要两次计算相同的值。它会将您带到
O(n Log n)。 -
@PM77-1 实际上 dist(a,b)=dist(b,a) 并且内部循环只需要在列表索引 i+1 和 N-1 之间进行迭代。我已经用这个改进更新了我的问题中的代码。尽管如此,该算法仍然是 O(N^2),因为比较次数将为 N-1 + N-2 + ... + 1 = sum(1,N-1) = (n^2-n)/ 2,即 O(N^2)。
-
是的,你是对的。