给定一个点列表,如何确定哪些点在彼此的特定距离内

时间:2014-06-30 01:17:18

标签: algorithm data-structures

给出一个2d点和最大距离d的列表,比从O(n ^ 2)方法找到哪个点位于每个点的d内更好。我不需要解决方案只是一些启动想法。

2 个答案:

答案 0 :(得分:2)

使用空间索引结构,例如kd树,你可以得到O(n log n)

修改

啊我想我误解了你的评论。如果在查询中设置n个最近邻居,则在最坏的情况下,单个搜索会花费O(n log n),但您可以在每个找到的最近点上放置一个标记,以表示它们是否已属于特定群集。然后,您不必再为这些点执行最近邻居查询。所以最终的复杂性仍然是O(n log n)。以下是有关此类搜索http://www.cs.utah.edu/~lifeifei/cs6931/kdtree.pdf的详细信息。

我在这里假设,如果它已经属于一个集群,那么所需的行为是从一个点中删除一个点。也许你可以澄清一下问题规范?

答案 1 :(得分:0)

“找到”可能有n ^ 2个点对,所以你所追求的并不是很清楚。

执行此操作的“输出敏感”方式,其运行时间类似于O(n log(n)+ h),其中h是您“找到”的对数,如下所示:

  • 按y坐标顺序对点进行排序。
  • 向下扫描一条线,当扫描线撞到它时将一个点扔进一个平衡的二叉树中,并在扫描线上方d处移除它。
  • 当您使用扫描线点击一个点时,迭代平衡二叉树中的所有内容,该值最多为左侧,最多为新点右侧。 “找到”新点的距离d内的每个点。

在第三个项目符号中,如果你必须看k> = 6分,那么至少会有楼层((k / 6)^ 2)对“查找”(运动!),所以数量所考虑的对与“找到的”对的数量成正比。