在坐标略有不同的列表中进行交叉引用

时间:2016-09-02 15:37:21

标签: python algorithm list

我想做一些与此处提出的问题非常相似的事情:

Comparing two lists of coordinates in python and using coordinate values to assign values

也就是说,我有两个坐标列表(例如,x和y),如果(x,y)坐标与列表1中的(x,y)坐标匹配,我想从列表2中提取数量。

现在,只要坐标匹配完全

,上面链接的问题中的答案就可以很好地解决这个问题。

但是,我想说明可能会有轻微变化。因此,假设两个坐标中存在小的偏差dx或dy。假设我说,“对于dx<R,我认为这些坐标是相同的。”我将如何将其纳入代码中 - 牢记上面链接中已经提供的解决方案(当然还有其他创造性解决方案)。

注意:对于快速而肮脏的解决方案(双循环),这相对容易。在接受的答案中给出的O(n)解决方案更加棘手,这正是我正在寻找的。

1 个答案:

答案 0 :(得分:0)

这绝对是一种计算几何算法。您可以按如下方式重新表述:给定一组平面中的一组点,找到所有点P距离<= R(相对于Chebyshev distance所提供的所有点的集合条件dx <= Rdy <= R必须发生。)

二次时间的解决方案很简单:你只需要检查一个点是否位于给定的方格中。不过,我不认为基于哈希表的方法(在平均线性时间内运行)可以很容易地进行调整。

O(n log n)中的解决方案是可以想象的(尽管它可能由每个方格中的点数决定:我假设R非常小,因此只有一定数量的平均每个方格的点数。)

为此,您可以调整sweep-line algorithm。首先,您可以通过仅考虑与输入中给定点相对应的xy来“离散”坐标(这用于在坐标上发出请求而不是在点,同时仅根据输入中的点数保持复杂性。

之后,您可以对点进行排序,例如根据他们的x坐标。事实上,最好在x+rx-r添加“事件”(您也可以在x上放置一个事件,以便考虑每个点而不是扫描一个每个点的不同数据结构,对应于正方形的左角和右角。扫描这些事件,在y坐标(*)排序的二叉搜索树中遇到左角时添加点,并在读取右角事件时删除它们。

因此,在给定时间,您的树恰好包含与当前事件相关的(x, y)|x-xcurrent| <= R。当你得到一个点时,你只需找到(x, y)集合中关于当前事件验证|y-ycurrent| <= R的所有点。

(*)实际上,有可能使用诸如Fenwick trees之类的数据结构,这些数据结构更容易“从头开始”编码,并导致比复杂数据结构(如二叉搜索树)更低的常量。