如何在范围树中搜索?

时间:2016-05-14 00:40:50

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

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

我首先根据点的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进行范围查询。

1 个答案:

答案 0 :(得分:2)

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

例如,最初您应该将/\b[^e]*\b/g(-inf, 1)进行比较,(-5, 6)是树的数据范围(您还可以使用(-inf, inf)作为树的数据范围或任何时间间隔包含(-5, 6),而不是值0.递归地,您应该将查询范围与以您查询的节点为根的子树范围进行比较。

此外,范围更新可以在搜索时完成 - 在节点分割时,左/右递归调用间隔的上/下界是节点值。