【问题标题】:Nearest point to point, nearest point to line最近点到点,最近点到线
【发布时间】:2013-03-27 21:40:26
【问题描述】:

想象一下二维平面中的一组m 点,称为“候选点”。然后是以下两种情况之一:

  • 还有一组n点(“对象”)——见图1

  • 还有一组n 线与 X 或 Y 轴(“对象”)共线 - 见图 2

我想知道哪个候选对象对的笛卡尔距离最短。

请问,有谁知道这个问题在计算几何中是否有名称?有没有比 O(m*n) 更快的算法?如果对象保持不变,只有候选对象发生变化——通过一些巧妙的预计算,是否有可能比 O(m*n) 更快?

图。 1

              c      o
       c
                          o         c      o
           o    c
                             c
              c o              
                       c             o
                                          c
               o                 c
          c

图。 2

             |                      c           |  
-------------+----------------------------------+------  
             |                                  |  
             |              c                   |    c  
             c                                  |  
             |                                  |  
-------------+----------------------------------+------  
             |          c            c          |  
-------------+----------------------------------+------  
             |                            c     |  

【问题讨论】:

  • 两个对象或线条是否可以与同一个候选对象配对?
  • 另外,您真的关心对象与候选对象之间的距离是多少,还是只关心它们是否配对?
  • 听起来很适合 k-d 树。
  • @CoreyOgburn:你的第一个问题:是的,第二个问题:嗯,好问题 - 有什么区别?如果我知道这对,我可以很快计算出实际距离,对吧?
  • 我个人正在考虑优化代码。您可以通过简单地将 x 偏移量添加到 y 偏移量来获得距离的粗略估计,从而避免距离公式中的 sqrt。这不是一个准确的距离,但它会节省大量的处理时间。就像你说的,一旦他们配对,你就可以获得真正的距离。在它们配对之前,可能需要计算很多距离。

标签: algorithm geometry complexity-theory theory computational-geometry


【解决方案1】:

这基本上是对所有候选人的最近邻搜索。您可以使用kd tree 索引加速这些类型的问题。

【讨论】:

    【解决方案2】:

    我不明白您将如何从对象创建线条。为每个对象创建两条线:一条垂直线和一条水平线,是吗?

    在任何情况下,假设您有垂直线 v1,v2,..,va 和水平线 h1,h2,...,hb。

    垂直线按照x轴偏移排序,水平线按照y轴偏移排序。

    对候选集中的每个点进行二分搜索以获得最近的垂直和水平线。现在计算最接近的 (candidate,line) 对是微不足道的。

    【讨论】:

    • “为每个对象创建两行” - 不,它更简单。只有一堆线,恰好是轴对齐的。我想知道哪条线最接近某个点(候选人)。
    • @EcirHana 那么对象是什么意思呢?它们是如何使用的?无论如何,我的答案应该有效(输入一堆轴对齐的线和候选点。我不知道如何处理对象)
    • 也许“对象”这个词有点混乱,我只想用一个词来表示点和线。所以“线”实际上是“物体”,所以给定一堆线和一堆点,哪一对距离最短?对于积分和积分,也是......
    【解决方案3】:

    您要查找的名称很可能是 NNS(请参阅:http://en.wikipedia.org/wiki/Nearest_neighbor_search),是的,给定一些时间和空间来预计算一组静态“对象”,执行搜索的速度应该比 O(n *m)。

    即使使用构建二叉搜索树的最简单方法,您也应该能够将单个查找的时间复杂度降低到 O(log n),从而导致整个问题的 O(m log n)。

    【讨论】:

      【解决方案4】:

      你有两个一维问题而不是一个二维问题。 将所有“候选对象”投影到 x 和 y 轴上,然后将垂直“对象”放在 x 轴上,水平放置在 y 轴上。

      瞧!两个一维问题。

      现在是 1d。

      将所有'condidates'放入排序数组,对于每个'object',使用二分搜索在该数组中查找包含段(两个最接近的'condidates')。

      结果为 O(n log m + n log n)

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多