【问题标题】:Finding the neighbours of a segment (Bentley-Ottmann algorithm )查找段的邻居(Bentley-Ottmann 算法)
【发布时间】:2015-04-14 12:10:44
【问题描述】:

我正在实施 Bentley-Ottmann 算法 找到线段交点的集合,
可惜有些东西我没看懂。

例如:

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

我对sweepLine状态使用了平衡二叉搜索树,但是我们将段存储在叶子中,在阅读了这个wikipedia article之后我没有找到这个操作的解释。

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

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

对于我的例子,如果我遵循这个,我将到达叶子 Sj,但我只知道左边的叶子,即 Sk,我怎样才能得到 Si?

编辑 我发现这个discussion 看起来像我的问题,不幸的是没有关于如何在这种数据结构中实现一些操作的答案。

操作是:

  • 在这种数据结构中插入一个节点。
  • 删除节点。
  • 交换两个节点。
  • 正在搜索邻居节点。

当我们也在内部节点中存储数据时,我知道如何在平衡二叉搜索树中实现这些操作,但是对于这种类型的 AVL,我不知道它是否是同一件事。

谢谢

【问题讨论】:

  • 您的问题是如何在任意二叉树中找到叶子的(左)邻居?或者是为什么引用的算法返回“正确”结果的问题?
  • 我的问题是如何在平衡二叉搜索树中找到节点的左右邻居,而不是任何二叉树,有一些标准算法可以找到前任和后继node ,但不知道是否适合扫线算法
  • 在平衡的二叉搜索树中找到邻居与不(必然)平衡没有区别,更不用说在应用程序之间了。 (如果不是搜索树,我想要predecessorsuccessor 的定义。)

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


【解决方案1】:

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

假设您需要在树中的段S 的右邻居。如果在节点中存储数据,伪代码为:

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为null,表示没有右邻居,要么n指向正确的叶子。

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

【讨论】:

  • 我在pdf中添加了该书的链接。
  • 除了配方,我看不出有什么不同。
【解决方案2】:

和你一样,我在阅读 de Berg & al.: "Computational Geometry" 时遇到了同样的问题。但我认为 C++ 标准模板库 (STL) 有一个名为“map”的植入程序可以完成这项工作。

您只需要为线段和事件点及其比较函数定义一些个性化的类。然后,使用std::map构建树并使用map.find()获取和迭代器访问相邻元素,并使用迭代器访问两个相邻元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    相关资源
    最近更新 更多