【发布时间】:2020-06-15 17:34:55
【问题描述】:
我有两个坐标列表:
s1 = [(0,0), (0,1), (1,0), (1,1)]
s2 = [(3,2), (1,9)]
我想计算 s1 中每个点到 s2 中任何点的最小距离。例如结果应如下所示。
result = [3.60, 3.16, 2.82, 2.23]
问题:在执行时间方面最优化的方式是什么?
到目前为止,我已经尝试过了,但执行时间并不乐观:
import math
def nearestDistance(boundary, p):
minDistList = map(lambda b: (b[0] - p[0])**2 + (b[1] - p[1])**2, boundary)
minDist2 = min(minDistList)
return math.sqrt(float(minDist2))
d = []
for p in s1:
d.append(nearestDistance(s2, p))
我应该改变 s1 和 s2 的结构吗(例如使用二维数组而不是点)?
【问题讨论】:
-
我不认为这比 O(n^2) aka 尝试所有其他方法更好。除非你做一些聪明的数学运算,让你以某种方式过滤
s2的每一项s1。 -
我想知道我是否可以利用 s1 实际上是一个坐标网格这一事实,并且确实没有必要尝试将 s2 的元素与 s1 的每个元素进行比较
-
s1 和 s2 在现实中会有多大?
-
@orak 这极大地改变了游戏规则。如果
s2是s1的子集,那么其中会有一些等式(s1的一些元素也会在s2中所以最小距离将为0)。首先搜索这些将显着加快速度。 O((n-k)^2) 与k共同元素的数量。
标签: python optimization