【发布时间】:2017-05-04 12:41:28
【问题描述】:
我需要一个算法来找到同一条线上的最大等距点数。
输入:共线点列表
例如:我的积分可能是
[(1, 1), (1, 2), (1, 3)]
在这种情况下,我可以做的是根据点到原点的距离对点进行排序,然后依次找到距离。但是,在以下情况下,条件失败。所有点都在同一条线上y=-x+6,并且彼此等距。
[(3, 3), (2, 4), (4, 2), (5, 1), (1, 5)]
因为所有点都与原点等距,并且排序顺序可以是任何顺序,因此不可能进行顺序遍历。
例如,如果最终字典变成 [(3, 3), (5, 1), (4, 2), (2, 4), (1,5)],我们最终会计算 (3,3) 和 (5,1) 之间的距离,这是不正确的。理想情况下,我想计算最近点之间的距离,所以顺序应该是 (1,5), (2,4)。
为了克服这个问题,我创建了一个 O(n*n) 解决方案,方法是使用 2 个循环进行迭代,并找到任意 2 个点之间最小距离的频率:
import sys
distance_list=[]
lop=[(1, 3), (2, 4), (3, 5), (4, 6), (10, 12), (11, 13), (12, 14), (13, 15), (14, 16)]
lop.sort(key=lambda x: x[0]*x[0] + x[1]*x[1])
for k in range(0, len(lop)):
min_dist=sys.maxint
for l in range(0, len(lop)):
if k!=l:
temp_dist = ( (lop[k][0] - lop[l][0])*(lop[k][0] - lop[l][0]) + (lop[k][1] - lop[l][1])*(lop[k][1] - lop[l][1]) )
min_dist= min(min_dist, temp_dist)
distance_list.append(min_dist)
print distance_list.count (max(distance_list,key=distance_list.count))
但是,对于以下测试用例,上述解决方案失败:
[(1, 3), (2, 4), (3, 5), (4, 6), (10, 12), (11, 13), (12, 14), (13, 15), (14, 16)]
预期答案应该是:5 但是,我得到:9
基本上,我无法确定如何区分包含等距点的 2 个点簇;在上面的例子中,这将是
[(1, 3), (2, 4), (3, 5), (4, 6)] AND [(10, 12), (11, 13), (12, 14), (13, 15), (14, 16)]
【问题讨论】:
-
您能否提供一些代码来展示您的尝试?
-
失败是什么意思?如果它们都与原点等距,则任何顺序都是正确的排序顺序......这就像对相同数字的数组进行排序
-
我需要一个算法来解决旅行商问题。
-
@DeepSpace 那么也许你可以问自己的问题。
-
@Nuageux 添加了代码