我想做一些与此处提出的问题非常相似的事情:
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)解决方案更加棘手,这正是我正在寻找的。 p>
答案 0 :(得分:0)
这绝对是一种计算几何算法。您可以按如下方式重新表述:给定一组平面中的一组点,找到所有点P
距离<= R
(相对于Chebyshev distance所提供的所有点的集合条件dx <= R
和dy <= R
必须发生。)
二次时间的解决方案很简单:你只需要检查一个点是否位于给定的方格中。不过,我不认为基于哈希表的方法(在平均线性时间内运行)可以很容易地进行调整。
O(n log n)
中的解决方案是可以想象的(尽管它可能由每个方格中的点数决定:我假设R
非常小,因此只有一定数量的平均每个方格的点数。)
为此,您可以调整sweep-line algorithm。首先,您可以通过仅考虑与输入中给定点相对应的x
和y
来“离散”坐标(这用于在坐标上发出请求而不是在点,同时仅根据输入中的点数保持复杂性。
之后,您可以对点进行排序,例如根据他们的x
坐标。事实上,最好在x+r
和x-r
添加“事件”(您也可以在x
上放置一个事件,以便考虑每个点而不是扫描一个每个点的不同数据结构,对应于正方形的左角和右角。扫描这些事件,在y
坐标(*)排序的二叉搜索树中遇到左角时添加点,并在读取右角事件时删除它们。
因此,在给定时间,您的树恰好包含与当前事件相关的(x, y)
点|x-xcurrent| <= R
。当你得到一个点时,你只需找到(x, y)
集合中关于当前事件验证|y-ycurrent| <= R
的所有点。
(*)实际上,有可能使用诸如Fenwick trees之类的数据结构,这些数据结构更容易“从头开始”编码,并导致比复杂数据结构(如二叉搜索树)更低的常量。