我阅读了几张幻灯片,比如这个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的树中搜索是没有意义的。而且,这将导致访问节点多于必要的节点。
我在c++中实现了这一点,如果重要的话。
* 在[-inf,1]范围内对x进行范围查询,在[0,5]范围内对y进行范围查询。
答案 0 :(得分:2)
您提出的算法并不完全正确 - 您应该将您查询的范围与您正在查看的节点的范围进行比较,而不是节点的值。
例如,最初您应该将/\b[^e]*\b/g
与(-inf, 1)
进行比较,(-5, 6)
是树的数据范围(您还可以使用(-inf, inf)
作为树的数据范围或任何时间间隔包含(-5, 6)
,而不是值0.递归地,您应该将查询范围与以您查询的节点为根的子树范围进行比较。
此外,范围更新可以在搜索时完成 - 在节点分割时,左/右递归调用间隔的上/下界是节点值。