【问题标题】:Balanced Binary Search Tree Keys平衡二叉搜索树键
【发布时间】:2021-04-19 10:27:44
【问题描述】:

我试图弄清楚如何为存储“线段”的二叉搜索树的元素设置关键字。我正在阅读的计算几何书说

更详细地说,我们将与扫描线相交的线段存储在平衡二叉搜索树 T 的叶子中。沿扫描线的线段从左到右的顺序对应于从左到右的顺序T中的叶子

假设关键是事件点的 x/y 值(此处为 A 或 B),在以下情况下状态结构将如何保持线段的正确顺序(虚线是扫描线)。

B 显然在 A 之前击中扫描线,但如果 B 的段加上它的 x/y 值,它将在状态行中的 A 之后。

所以在我看来,状态行段的键不能是静态值,例如点的 x/y 值——但是这本书在这方面如何构建树时非常安静。我已经看到一些示例,将键作为 (m,b) 的元组,其中 m 是线条渐变,b 是 y 截距,但我不太清楚它是如何工作的。

【问题讨论】:

  • 我认为关键是交点(即如果扫​​描线是水平的,则为 x,如果为垂直,则为 y)。
  • 没有静态排序。每次扫描线碰到两条线段的交点时,这些线段就会在搜索树中交换位置。
  • 我不太清楚你的意思,这两个段不相交——不仅如此,B 还没有在状态结构中。
  • 我想我的问题是——当B 被添加到状态结构时,结构的什么键控将允许这个特定的段系统正确存储为排序B A。它不能是队列中点的x,y(也就是段的起点),因为这将为上述段提供A B 的排序,因为Ax,y 小于@ 987654332@ 的B
  • 键是对行的描述吗?因此,在上面的例子中,当我们在将B添加到状态结构时搜索放置在哪里时,我们得到第一个节点A(本例中唯一的节点),插入扫描线的y值进入A 的描述以获取A 上的特定点,然后将其与我们的点B 进行比较——B 将位于A 的左侧?

标签: algorithm computational-geometry


【解决方案1】:

您需要按照当前时刻与扫描线相交的顺序存储线段。由于其性质,二叉搜索树是可能的:左节点包含较低的键,右节点 - 较大的键。

由于结构的动态特性,键也将是动态的。每次将段添加到 BST(二叉搜索树)中时,您都需要在 Y 坐标处比较键,该键将是扫描线上交点的 X 分量。

在扫掠线与B线段或B线段起点相交的时刻,A线段已经在A线段起点添加到BST中。所以按照 BST 项插入的规则,你需要检查 B 段的键,即 Y 处的 X 坐标,它是否大于或低于 BST 项的键。很明显B的Y处的X坐标小于A的Y处的X坐标,所以B段将被添加到BST的左节点

      A
    /   \
   B     null
  / \
null null

【讨论】:

  • 感谢您的回复。最后,我将每个节点实现为值的元组,这些值将描述任何给定 x 值的行,例如 y = mx + c 的 [ m, c ]。将数据存储为点会使搜索和比较值变得更加困难
  • 不错的解决方案。当我实现它时,我使用的是一般形式的线而不是斜率截距。斜率截距不包括垂直线,那么您是如何解决的?你处理过这种特殊情况吗?
猜你喜欢
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
相关资源
最近更新 更多