我有一组点的列表L
,它们的坐标为(x, y)
,使用欧几里得距离测量方式。
如何找到该列表中两个点之间的最大距离?或者更正式地说:如何找到
简单方法
解决这个问题最简单的方法似乎是尝试所有可能的情况:
def find_max_dist(L):
max_dist = d(L[0], L[1])
for i in range(0, len(L)-1):
for j in range(i+1, len(L):
max_dist = max(d(L[i], L[j]), max_dist)
return max_dist
为了加快计算速度,在循环中可以使用平方距离,最后返回根值。该方法的运行时间复杂度为,其中
n
是列表L
的长度。(空间复杂度为常数)凸包
显然,没有比O(n)更快的算法,因为必须至少查看列表中的每个元素一次。
最高距离将在凸包的元素之间。但是很容易证明,计算凸包的复杂度至少为
O(nlogn)
,而Graham扫描似乎可以做到这一点。但是,在找到复杂的外壳之后,我仍然需要获得最大距离。所以我的最终代码为:def find_max_dist_graham_triv(L):
H = Graham_scan(L)
return find_max_dist(L)
现在,这是一个我不确定的点。我认为可以像这样改进:
def find_max_dist_graham_c1(L):
H = Graham_scan(L) # Get ordered list of convex hull points
max_dist = d(L[0], L[1])
for i in range(0, len(L)-1):
loop_max_dist = 0
for j in range(i+1, len(L):
curr_dist = d(L[i], L[j])
if curr_dist < loop_max_dist:
break
loop_max_dist = curr_dist
max_dist = max(loop_max_dist, max_dist)
return max_dist
这个想法是,当您选取凸包的一个点并从其相邻的点开始时,对角线会不断增加,达到最大值,然后不断减少。虽然我不确定这是否正确。
直观地说,我会继续改进算法:一旦第一内部循环完成,我们就找到了该循环的“最长对角线”。该对角线将所有其他凸壳点分为两个不相交的集合。每条更长的对角线都必须由这些集合中的点组成(对吗?):
def find_max_dist_graham_c1(L):
H = Graham_scan(L) # Get ordered list of convex hull points
max_dist = d(L[0], L[1]) # Get a fist idea what the longest distance might be
i = 0
p1 = L[i] # Grab a random point
loop_max_dist = 0
for j in range(1, len(L):
curr_dist = d(L[i], L[j])
if curr_dist < loop_max_dist:
break
loop_max_dist = curr_dist
max_dist = max(loop_max_dist, max_dist)
# Every diagonal that is longer than the best one found with L[0]
# has to have points in both of the following two sets (correct?):
# [1...j] and [j+1...len(L)]
# Try to find a neighboring diagonal that is longer.
change = True
while change:
change = False
if d(L[i-1], L[j+1]) > max_dist:
max_dist = d(L[i-1], L[j+1])
i -= 1
j += 1
change = True
elif d(L[i+1], L[j-1]) > max_dist:
max_dist = d(L[i+1], L[j-1])
i += 1
j -= 1
change = True
return max_dist
凸包上的每个点P都有一个凸包上的点Q,使得PQ是包括P的最长对角线。但是,P是否也是Q的最长对角线的“端点”呢?
我真的不确定这个算法是否正确。它的复杂度是O(n log n)。
我想问题已经被很好地分析了,所以能否有人为此留下一些注释呢?
虽然我有很多子问题,但主要问题是:
在点列表中查找两点之间最大距离的有效方法是什么?