如何在范围树中搜索

How to search in a Range Tree?

本文关键字:搜索 范围      更新时间:2023-10-16

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

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

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


如果我们这样做,那么在我的一个例子中,我们将搜索(没有理由)根的基于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)

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

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

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


如果这很重要的话,我正在c++中实现它

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

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

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

此外,范围更新可以在搜索时进行——在节点处进行拆分时,左/右递归调用间隔的上/下限是节点值。