【问题标题】:Symmetric "string" matrix in PythonPython中的对称“字符串”矩阵
【发布时间】:2020-03-06 21:41:52
【问题描述】:

我有一组(相当大的)具有纬度和经度的 GPS 点,外加一个名称;例如:

A    30.22    20.45
B    31.00    20.45
...

现在我需要建立一个矩阵来告诉我 A 是否与 B “接近”(

【问题讨论】:

  • B 点是否“预期”(在任何意义上)比 T 点更接近 A?换句话说,目前列表有什么顺序吗?如果没有,构建一半的矩阵可能会节省一半的工作,但问题仍然是 O(n^2)。
  • @FiddleStix:不,它们没有以任何方式订购。
  • 问题可以在O(nlogn)内解决,这是最优解,没有比这更好的了
  • @DervinThunk 我更新了我的答案,试图让你相信你不能过多地改进蛮力解决方案

标签: python


【解决方案1】:

这个问题与众所周知的closest pair of points problem 非常相似。您可以找到一些解决方案here。在这种情况下,可以在 O(nlogn) 时间内找到最优解。但是,我认为情况并非如此。

例如,您的所有点可能都在半径

您可以尝试使用蛮力方法检查所有组合(这样您可以检查 (A,B) 或 (B,A) 对):

from itertools import combinations

def dist(a, b):
    return sqrt((a[1] - b[1])^2 + (a[2] - b[2])^2)

def closer_than_epsilon(points_list, epsilon):
    return [(p1, p2)
            for p1, p2 in combinations(points_list, r=2)
            if dist(p1, p2) < epsilon]

# df is your pd.DataFrame with three columns: name, x_coor, y_coor
result = closer_than_epsilon(df.values.tolist(), 1)

【讨论】:

  • 你确定这是关于最近对的问题吗?问题似乎是关于检查 哪些 对在某个接近阈值内。您已经展示了如何计算最接近的两个点。我不认为它们是相同的(我并不是说使用您的答案不是解决方案的一部分,但我认为它不能直接回答问题)。
  • @FiddleStix 你说得对,我会努力的 :) 感谢您指出
猜你喜欢
  • 2016-09-22
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 2020-05-14
  • 2013-05-28
  • 1970-01-01
  • 2021-12-29
相关资源
最近更新 更多