快速算法将两个k-d树(2D点)相互比较?

时间:2014-07-29 22:11:31

标签: c# algorithm geospatial kdtree

简短版本:鉴于两个kd树包含相似但不完全相同的2D点集,并且可能没有相同的根,您是否可以利用它们都是树的事实来匹配一个点到最近点的点在另一个中查找步骤少于逐个查找节点的情况?

我们有一个公共API,可以向客户端应用程序发送几何图形(WKT格式的lat-long coords,可以是点或多边形),它们会进行修改并将修改后的WKT发回给我们。最近我们遇到了一个问题,即客户端应用程序在保存之前投影并取消投影所有点,这会导致所有点因浮点数学精度限制而漂移很小,即使对于用户不打算移动的点也是如此。客户端应该做的是保留未修改的原始值的副本,并仅更新用户实际移动的点。

显然,这需要在客户端应用中修复。但我想知道将来何时发生这种情况,以便我们能够“抓住”正在这样做的客户。它只能是一种启发式方法,但是如果我们看到90%的点数只是移动了一小部分,我们就可以记录一个警告。如果点的移动量超过一小部分,我们可以假设用户想要移动点。

一个复杂的因素是客户端可以自由地将点或多边形顶点序列化回我们的顺序与我们发送它的顺序不同 - 但它仍然可以表示相同的形状并且是有效的。此外,用户可能会分割多边形,并且可能会删除点或顶点或将其添加到数据中。如果它只是多边形,我们可以旋转顶点列表直到它们“匹配”,但是考虑到多边形可能被编辑,并且我们也有尽可能多的数据只是点而不是多边形,我认为它是简化假设,只是将所有数据视为一组点以进行验证。

我想出的一个算法就是将其中一组点放入k-d树中进行快速查找,然后查找第二组中每个点的最近邻居。但我可以将它们都放入k-d树中,我想知道是否有比较两个k-d树的快速算法?

1 个答案:

答案 0 :(得分:2)

无论你的距离公差是多少来声明两个点是相同的(称之为D),对于第一组(x,y)中的给定点,你可以散列并存储(x / D,y)的整数部分/ D)并存储指向散列表中的点的指针,然后对于第二组中的每个点(x,y),您可以散列(x / D,y / D)的整数部分以及所有邻居(向每个值添加0或+/- 1)如果从第一组中找到散列点,则将第二组中的点与从第一组中找到的所有点进行比较,以查看第一组中的某个点在第二组中的特定点的距离D内。如果你的两组点中没有一对点在彼此的距离D内,那么这应该在基本上线性的时间内运行。