A中的点与B中的点之间的最短距离


9

给定两个集合AB每个集合在平面中包含n不相交的点,请计算A的点和的点之间的最短距离B,即min { dist(p,q) | pAqB }

我不确定我是否正确,但是这个问题与计算几何中的线性编程可以解决的问题非常相似。但是,降低为LP并不容易。我的问题还与找到两组点之间的最薄规定有关,显然可以通过二维空间中O(n)中的LP来解决。


4
这里有什么问题?
拉斐尔


我不是专家,但是通常在机器学习中,这些要点是数据,这些集合在大多数情况下表现良好,并且被分组在一起,因此@Pedro建议的算法可以很好地工作。
chazisop 2012年

3
“这显然可以通过二维空间中O(n)中的LP来解决” –我不知道是什么促使了这一说法。“线性编程”通常不能在线性时间内解决;“线性”是指其他的东西。LP有特殊形式吗?
拉斐尔

Answers:


5

我有一个解决方案,似乎有些令人费解,但是应该比朴素的蛮力搜索更有效:O(n2)

  1. 设为和的质心之间的轴。A BvAB
  2. 沿该轴分别以降序和升序对和的点进行排序,得到序列,,...,和,,...,。B a 0 a 1 a n b 0 b 1 b nABa0a1anb0b1bn

其余部分使用伪代码使其更加清晰:

d = infinity.
for j from 1 to n
    if (b_1 - a_j) along v > d then break endif
    for k from 1 to n
        if (b_k - a_j) along v > d then
            break
        else
            d = min( d , ||b_k - a_j|| )
        endif
    enddo
enddo

也就是说,通过预先分拣沿点,就可以过滤掉对,绝不会内彼此因为沿着总是会。vdbkajvbkaj

在更坏的情况下,它仍然是,但是如果和很好地分开,它应该比这快得多,但不比,这是必需的用于排序。A B On log n O(n2)ABO(nlogn)

更新资料

这种解决方案绝不是从帽子里掏出来的。这是我在粒子模拟中用于查找具有空间装仓的所有相互作用粒子对的特例。我自己的作品在这里解释了更普遍的问题。

至于使用修改后的行扫描算法的建议,尽管直观上很简单,但当考虑不相交集时,我不认为这在中。Rabin的随机算法也是如此。O(nlogn)

似乎没有很多文献讨论不相交集中最接近的对问题,但是我发现了这一点,这并没有声称在,并且似乎没有对任何事情提出任何要求。O(n2)

可以将以上算法视为第一篇论文(Shan,Zhang和Salzberg)中提出的平面扫描的一种变体,但是代替使用轴且不进行排序,而是使用集合之间的轴并遍历集合以降序/升序排列。x


2
@Pedro:对不起,我没有提早发表评论(当时没有时间)。我之所以拒绝您的答案,是因为这是一个错误的答案,不应该放在首位。这实际上是最坏情况为O(n log n)的计算几何中的一个众所周知的问题。一个好的答案将指出已知的问题(可能带有参考)和常见的解决方案,其中包括:使用kd树和逐元素测试,扫描算法等。一般的想法应该是在有序结构中进行预处理并使用。看一维情况-那里更明显的O(n log n)。
ex0du5 2012年

2
@ ex0du5:听起来好像您应该发布自己的答案!注意,“有更好的答案”通常不是拒绝投票的好理由。此措施应保留用于错误,垃圾邮件和格式很差的答案。佩德罗的都不是。另请参见此处,以给人留下深刻印象,即某些人认为在降票之前应该给予多少思考。
拉斐尔

1
@Raphael:我没有回答,因为有一个合理的答案,而且我没有时间查找参考。至于您如何降低投票率的参考,对于这些网站来说,这是一个可怕的算法!CS学生尤其应该理解不要失去形式主义目标的重要性。投票的目的是将答案移到一个等级,该等级将引导以后有相同问题的学生获得最有用的答案。我的投票算法可以做到这一点。那算法:显然不是。如果您愿意,可以在meta上进行讨论,但是我想,作为成年人,我们应该善用自己的力量。
ex0du5'6

1
@ ex0du5:您现在似乎有一些时间。您是否可以实际表明该实例实际上是“最坏情况为众所周知的问题”?O(nlogn)
Pedro

1
@ ex0du5:实际上,最近的邻居搜索(例如,使用kd树具有平均复杂度O(logn)。所以我们回到正题。
2012年

4

您可以采用的“最近对” 换行算法O(nlogn)

您唯一要做的更改是忽略属于同一集合的对。

编辑:这实际上不是我所描述的那样简单(甚至可能)。参见评论进行讨论。


2
仅需说明,也可以将经典的分治法应用于最接近的对,该算法也以;另请参阅WikipediaO(nlogn)
rizwanhudda 2012年

1
有关随机线性时间算法,请参阅例如Lipton博客上的Rabin Flips a Coin
Juho 2012年

3
您能否更具体地说明如何针对不相交集实现此功能,尤其是在保持绑定方面?O(nlogn)
Pedro

-1为不正确。您链接的最接近的线扫算法依赖于包含元素的排序集合,但是在不相交集合的情况下,此集合开始时包含元素,因此不再位于处至少在最坏的情况下不会如此。n O n log n O(1)nO(nlogn)
Pedro

1
@Pedro:为什么会更大?如果有的话,当前候选点的集合应该缩小。
拉斐尔

4

出现此类问题的想法是从一组集合中创建一个有序结构,以实现对最近邻居的有效查询。提出用于任意维的O(log n)查询结构的经典论文是:

Shamos和Hoey谈Voronoi解决方案

从那时起,基于Delauney细分的思想创建了许多其他空间分区,这些分区也转换为各种子空间扫描描述。请注意,Voronoi方法也将归入一般的“分而治之”描述,因为它的平面划分使构造步骤O(n log n)成为可能。

因此,此问题的基本解决方案是:

  1. 采用集合A并构建您选择的有效的最近邻居查询结构。该构造步骤为O(n log n)[参见定理4]。
  2. 对于B中的每个元素,查询结构A为最近的邻居。每个查询为O(log n)[请参见定理15,固定维],因此B中所有点的总查询时间为O(n log n)。
  3. 检索到A中每个B的最近点的结果后,将其放在按距离排序的结构中。这是O(log n)插入每个结果,或O(n log n)插入所有结果。
  4. 查看完所有B后,您可以快速(O(1))获得有序结构中的B点,该点与A点中的邻居的距离最小。

可以看出,查看每个步骤的复杂度,总复杂度为O(n log n)。对于那些不看经典论文的现代读者来说,这在许多算法书籍中都有介绍,例如Skiena的“算法设计手册”。


1
“例如,Artium的解决方案可以以此形式编写,并且完全有效。” -嗯,您在这里提出的不再是(纯)扫描线算法,因此我对此一无所知。
拉斐尔

@Raphael:是的。扫描线算法将点预处理为有序结构,如此处所述。我什至在他的回答下链接了《财富》算法,这表明扫掠线算法只是Voronoi算法的一个实例。之所以对查询结构使用通用的解决方案,是因为为此已经开发了许多几何机制。
ex0du5

在进行迭代时,您不需要特定的顺序,而该顺序对于(很多/全部?)扫掠线算法必不可少(因此,我猜这就是名称)。B
拉斐尔

1

我不确定我是否正确,但是这个问题与计算几何中的线性编程可以解决的问题非常相似。但是,降低为LP并不容易。我的问题还与寻找两组点之间最薄的规定有关,显然可以通过二维空间中的LP来解决。

在代数决策树模型下,此问题的下界为。在这里,我将对其证明进行粗略的概述。O(nlogn)

我们将元素唯一性问题E简化为C。

  • 输入到E: S={a1,a2,a3,...,an}
  • 令 > 0为一小部分ϵ
  • A =,= { 一个 + ε 1 Ñ }{(ai,0):1in}B={(ai+ϵ):1in}
  • 现在,如果我们可以找到集合A和B之间的最短距离(d)。则可以在额外的时间中确定元素唯一性问题,如下所示 O(n)
    • 当且仅当d =,集合具有重复项εSϵ

我们知道确定元素唯一性问题的运行时下限是。因此,通过简化,下限也适用于我们的问题。O(nlogn)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.