【问题标题】:Implementation of Planar Point Location using slabs使用平板实现平面点定位
【发布时间】:2015-11-03 11:45:43
【问题描述】:

我正在研究平面点位置,现在正在考虑使用 The Slabs 方法。

我已经阅读了几篇文章:

我理解持久平衡二叉搜索树背后的概念,但我们在这个问题中忽略它们,我并不关心额外的存储空间开销。文章的内容是他们正在讨论如何提高速度,但不解释基本内容。例如:

如果我错了,请纠正我:

  1. 我们在所有交叉点上画一条线。

  2. 现在,我们的平板被不同角度的线段分割。

  3. 与任何线的每个交点都被视为一个顶点。

  4. Slab 在二叉搜索树中按顺序排序(让我们省略部分持久的 bst)

  5. 不知何故,扇区在那些各自的 BST 中排序,即使分割它们的段几乎总是成一个角度。是不是每个节点都要带一个面积的定义?

请参考此示例图片:

问题:

  1. 我如何才能真正确定该点是否位于节点 c 而不是节点 b 中?是不是通过区域?

  2. 我是否需要安排我的节点以包含有关段的信息?然后我可以检查查询点是否位于段上方(如果这是我应该确定我的扇区的方式)?如果是这样,我会在之后搜索一个多边形列表,看看这个特定段属于哪个多边形吗?

  3. 也许我需要为每条线而不是平板存储 BST?

  4. 然后我是否必须查看属于左侧线的 2 个 BST,以及从顶点到右侧的第二个线?然后,我可以按每棵树中的 y 坐标对顶点进行排序,并返回查询点正下方的顶点(段的末尾)的 y 坐标。为左右线完成此操作后,我将进行比较以查看这些顶点来自的段的名称是否实际匹配。

  5. 但是,这不会给我正确的答案,因为即使名称匹配,我也可能低于或高于该段(如果我接近它)。此外,这意味着我必须进行 3 次二进制搜索(1 次用于线,1 次用于左行的 y 坐标,1 次用于右行),并且书籍说我只需要进行 2 次搜索(1 次用于平板,第二次部门)。

有人可以指点我做这件事的方向吗?

我可能只是错过了一些重要的想法或其他东西。

编辑:

Here 是另一篇好文章,它解释了问题的解决方案,但是,我不太明白如何实现以下目标:

"考虑任意查询点 q ∈ R2。要找到 G 的包含 q 的面,我们首先使用 q 的 x 坐标进行二分查找,找到包含 q 的垂直平板 s。给定 s,我们使用 q 的 y 坐标进行二分搜索来找到 q 所在的 Es 的边。"

如何准确找到这两条边?是否像检查点是否位于线段下方一样简单?然而,这似乎是一项复杂的检查(而且成本很高),因为我们沿着树向下检查其他节点。

【问题讨论】:

    标签: algorithm location point


    【解决方案1】:

    嗯,这是一年前问的,所以我猜你不会接受这个答案。不过,这是一个有趣的问题,所以不管怎样……

    • 是的,您可以使用穿过每个交叉点的垂直线将平面划分为多个板。重要的结果是所有接触到平板的线段都会一直穿过,并且这些线段的顺序在整个平板上都是相同的。

    • 在每个slab 中,您为这些线段创建一个二叉搜索树,按它们在slab 中的顺序排序。您称为“节点”的区域是树的叶子,线段是内部节点。我将把叶子称为“区域”以避免歧义。由于线段的顺序在整个平板上是相同的,因此这棵树中的顺序对平板中的每个 x 坐标都有效。

    • 要确定包含任何点的区域,请找到包含该点的平板,然后在 BST 中进行简单搜索以找到该区域。

    • 假设您正在寻找点 C,并且您位于平板 2 中包含 (x2,y2) - (x3,y4) 的节点。判断 C 是在这条线段的上方还是下方,然后在树中取那个分支。

    例如,如果 C 为 (cx,cy),则段在 x=cx 处的 y 坐标为:

    testy = ((cx-x2)/(x3-x2)) * (y4-y2) + y2

    如果 cy

    当你到达一片叶子时,这就是包含 C 的区域。你就完成了。

    现在...为每个平板制作一棵全新的树会占用大量空间,因为您可以有 N^2 个交点,因此可以有 N^2 个平板。在每个平板中存储一棵单独的树将占用 O(N^3) 空间。

    但是,如果使用持久性红黑树,slab 实际上可以共享很多节点。使用像 Chris Okasaki 的红黑树这样的简单纯函数式实现,每个交叉点占用 O(log N) 空间,总共需要 O(N^2*log N) 空间。

    我似乎记得还有一个 constant-space-per-change 持久性红黑树可以给你 O(N^2),但我没有参考。

    请注意,对于大多数现实生活场景,交叉点更接近 O(N),因为线不会交叉太多,但使用持久树来节省空间仍然很好。

    【讨论】:

      猜你喜欢
      • 2018-04-23
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-19
      • 2013-04-01
      • 2014-10-30
      • 1970-01-01
      相关资源
      最近更新 更多