给定 S | S | = N 的多线组执行基于距离的空间连接,连接折线与距离 d &lt; d <子>限制子> 的。两条多折线 L i 和 L 之间的距离 d(i,j) j 定义为两点之间的最小距离 p v ∈ L i 和 p w ∈ L <子> Ĵ 子>
鉴于以下三条折线的集合,应加入 A 和 B 。
平凡的解决方案检查每个点 p k ∈ L s < / em> 如果任何其他点的距离 p m ∉ L < em> s 小于 d limit 并加入 L s 包含 p m 的多折线。
对于大型 N ,简单的解决方案非常慢。
构建某种索引以加速空间连接。
为此任务索引 S 的最佳方法是什么。
答案 0 :(得分:1)
使用2-D tree可以加速固定半径近邻搜索。
对于每个节点,您将有效地找到距离 d limit 的所有其他节点,将搜索时间从O(N + K)减少到约O(Log(N)+ K)。
不幸的是,一旦你确定B应该加入A,你就无法从进一步的考虑中消除B,因为这将涉及从树中删除B的所有节点,这可能是一项代价高昂的操作。
另一种解决方案是通过网格化:在节点上覆盖方形网格,使每个图块包含其中的一些。
当您考虑某些折线时,从包含折线的切片开始并执行连续的扩张,直到超过 d limit 的大小。扩张中的瓷砖会告诉您其他节点是否足够接近。
更新:
您可以考虑使用Bresenham算法以适合的分辨率(像素大小= d limit )对地图进行光栅扫描,每条折线都有自己的颜色。您必须绘制2像素的线条粗细,因为相邻像素中的点将是近邻像素。报告所有颜色碰撞。
实际上,这是网格化方法的重新制定。如果您无法负担存储整个地图的费用,或者由于稀疏性而导致效率低下,您可以考虑将地图表示为四叉树。这会将空间换成查询时间。
答案 1 :(得分:0)
您可以尝试快速voronoi图表。使用多边形,您可以搜索最近的距离。当所有边缘遍历每个站点并计算到边缘中点的距离时。 vd单元将站点分成2个相等的一半。然后对距离进行排序。它应该给你所有的多边形以及最近的邻居。