查找段的邻居(Bentley-Ottmann算法)

时间:2015-04-14 12:10:44

标签: algorithm data-structures tree computational-geometry avl-tree

我正在实施Bentley-Ottmann算法 找到段交叉点的集合,
不幸的是我不明白一些事情。

a segment tree, the segments and the sweep line it represents

例如:

  • 如何在图像中获取段Sj的邻居。

我正在使用一个平衡的二叉搜索树作为sweepLine状态,但我们在读取此wikipedia article之后将片段存储在树叶中。我没有找到此操作的解释。

参考书(de Berg & al.: "Computational Geometry",生病。第25页):

  

假设我们在 T 中搜索位于扫描线上的某个点 p 左侧的段。   在每个内部节点 v ,我们测试 p 是否位于存储在 v 的段的左侧或右侧。   根据结果​​,我们下降到 v 的左侧或右侧子树,   最终落到一片叶子里。   这片叶子或它左边的叶子都存储了我们正在搜索的片段。

对于我的例子,如果我按照这个,我将到达叶子Sj,但我会知道左边的叶子,即S k ,我怎么能得到S i

修改 我发现这个discussion看起来像我的问题,遗憾的是我没有关于如何在这种数据结构中实现某些操作的答案。

操作是:

  • 在此类数据结构中插入节点。
  • 删除节点。
  • 交换两个节点。
  • 搜索邻居节点。

我知道如何在内部节点中存储数据时在平衡二进制搜索树中实现这些操作,但是使用这种类型的AVL我不知道它是否是同一个东西。

谢谢

2 个答案:

答案 0 :(得分:0)

我在阅读Computational Geometry from DeBerg时偶然发现了同样的问题(参见第25页的报价和图片)。我的理解如下:

说你需要树中locate node S if S has a right subtree: return the left-most node of the right subtree of S else if S is in the left sub-tree of any ancestor: return the lowest/nearest such ancestor else return not found 段的右邻居。如果在节点中存储数据,则伪代码为:

let p the point of S currently on the sweep line
let n the segment at the root of the tree

while n != null && n is not a leaf:
   if n = S:
     n = right child of S
   else:
     determine if p is on the right or left of n
     update n accordingly (normal descent)

如果将数据存储在树叶中,则伪代码将变为:

n

最后,Width:100%为空,表示没有正确的邻居,或者n指向正确的叶子。

同样的逻辑适用于左邻居。

答案 1 :(得分:0)

与您一样,在阅读de Berg等人的著作《计算几何学》时,我遇到了同样的问题。但是我认为C ++标准模板库(STL)具有一种称为“地图”的植入物,可以完成这项工作。

您只需要为线段和事件点及其比较功能定义一些个性化的类。然后,使用map.find()来构建树,并使用@import "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.4.0/css/font-awesome.css";来访问邻居元素并进行迭代,并使用迭代器来访问两个邻居元素。