【发布时间】:2018-11-14 21:22:12
【问题描述】:
这里有图说明问题:
图中有一些特征点显示为蓝色十字。我知道所有功能的坐标(x,y)。现在我想查询圆形区域(绿色圆圈)内有哪些特征。在实践中,大约有 500 个特征和 300 个查询(300 个不同的圆、不同的中心和半径)。我知道圆的参数(位置,半径)。有没有什么好的算法可以完成这项任务?
目前我有两个想法。
- 最愚蠢的一个,只是遍历每个功能中的所有功能 询问。这比较慢。
- 一个粗略的想法。将整个图片分成一些子图片。根据子图将特征放入树状结构中,如果特征在同一个子图中,则放入同一个叶子。在每个查询中,找出圆圈覆盖的子图片,并检查这些子图片中的所有特征。
有没有人有更好的想法?
【问题讨论】:
-
通常的算法驱动方法是使用度量树,如k-d trees,通常允许类似query_ball_point。然后,这会导致构建所有点的树,然后为每个中心/半径调用此函数。但是您的数据集有点小,很难说它是否会更快。实施良好的蛮力搜索也可能很快。
-
@sascha 的方法很好,但如果您还没有相应的库,可能需要做一些工作。一个相当简单、相当快速的解决方案是通过它们的 x 坐标对十字架进行排序(如果数据集“又高又瘦”,则选择 y)。然后对于以 (x, y) 为中心的半径为 r 的圆,您可以对叉形数组进行二分搜索以找到 x-r,然后向右移动,检查每个叉形,直到找到 x+r。 (圆圈中的每个十字都必须在这个 x 范围内。)
-
@j_random_hacker 这是一个非常好的主意。易于实施并且可能足够快。我想做个测试。
标签: algorithm