【问题标题】:How to search in a Range Tree?如何在范围树中搜索?
【发布时间】:2016-09-10 07:31:31
【问题描述】:

我阅读了几张幻灯片,例如 one 的最后一页,其中描述了搜索算法。但是,我有一个基本问题。数据位于二维空间中。

我首先根据点的 x 值构建一个二叉搜索树。每个内部节点都持有一个基于该内部节点子树中点的 y 值的 BST。

然后我认为我应该搜索位于范围查询 [x1, x2] 中的点,然后检查是否满足请求的 [y1, y2] 范围查询。但是,该算法建议您应该在内部节点的基于 y 的 BST 中搜索,如果内部节点的范围在 [x1, x2] 内,但我不明白。


如果我们这样做,那么在我的示例中,我们将搜索(没有理由)根的基于 y 的 BST。检查示例:

                      ------ 0 ---------------------
                      |                            |
                ---- -3 ----                  ---- 4 ------ 
                |          |                  |           |
          ---- -4 -    -2              --- 3 ---          5
          |       |    / \             |       |         / \
         -5   (-3,4) (-2,2)(0,7)       2    (4,-4)   (5,3)(6,-1)
         / \                          / \
    (-5,6) (-4,0)                  (2,1) (3,6)

我希望执行的范围查询是 (-oo, 1) x (0, 5)*

如果我查看根,它的值为 0,因此它包含在 (-oo, 1) 中,所以如果我遵循算法,我将搜索根的整个基于 y 的树?

那应该是一棵包含所有点的树,因此在基于 x 的树中继续搜索是没有意义的。此外,这将导致访问的节点超出必要的数量。


如果这很重要,我将在 中实现它。

*对 [-inf, 1] 范围内的 x 和 [0, 5] 范围内的 y 执行范围查询。

【问题讨论】:

  • (-inf, 1)(x, y) 坐标还是 (x_lo, x_hi)?我猜是后者。
  • @JamesAdkison 后者,我应该编辑我的问题吗?如果是这样,我应该怎么做?
  • 如果有类似的语句我会很清楚:对范围 [-inf, 1] 中的 x 和 [0, 5] 范围内的 y 执行范围查询(或任何类似)。

标签: c++ c++ algorithm search computational-geometry range-tree


【解决方案1】:

您提出的算法不太正确 - 您应该将查询的范围与您正在查看的节点的范围进行比较,而不是节点的值。

例如,最初您应该将(-inf, 1)(-5, 6) 进行比较,后者是树的数据范围(您也可以使用(-inf, inf) 作为树的数据范围或包含(-5, 6) 的任何区间,例如那件事),而不是值 0。递归地,您应该将查询范围与以您查询的节点为根的子树的范围进行比较。

另外,范围更新可以在搜索时进行——在节点处分裂时,左/右递归调用区间的上/下界即为节点值。

【讨论】:

  • 是的,我知道我错过了一些东西,但我不知道是什么。但是,我正在尝试运行我的问题中的示例,但我不确定如何继续。我的意思是根如何实际检查(-5, 6)?它会存储它吗?
  • 您可以存储它(我认为它可以在极端情况下提供一些加速,例如当整个树在查询范围内时),但您实际上可以使用 (-inf, inf) 和在查询时更新间隔 - 我的最后一次更新是为了解决这一点:-)
  • 谢谢魏先生,我问了一个新的亲戚,question。有时间就去看看吧!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
  • 2013-04-13
  • 2019-08-12
  • 2016-05-21
相关资源
最近更新 更多