如何在范围树中搜索
How to search in a Range Tree?
我读了几张幻灯片,比如这张幻灯片的最后一页,其中描述了搜索算法。然而,我有一个基本的问题。数据位于二维空间中。
我首先基于点的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。递归地,您应该将查询范围与根在您查询的节点上的子树的范围进行比较。
此外,范围更新可以在搜索时进行——在节点处进行拆分时,左/右递归调用间隔的上/下限是节点值。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 尝试通过多个向量访问变量时,向量下标超出范围
- 有根的二进制搜索树.保留与其父级的链接
- 错误:未在此范围内声明'reverse'
- 变量未在此范围内声明 数组线性搜索
- C 中的快速范围搜索实现
- 如何在范围树中搜索
- 使用cctype库搜索函数,以查找某个范围内的数字字符数
- 是什么让这个二叉搜索更接近最大范围
- 二叉搜索以查找数字所在的范围
- 模板类C++符号范围搜索顺序不同
- 范围搜索的数据结构(重新访问)
- 使用std::equalrange来搜索某些范围内的向量
- 在字符串范围列表中搜索字符串
- 在搜索字符串时,Vector下标超出了范围
- 从范围的末尾开始搜索
- c ++二进制搜索排序的日期->我需要一个范围(CCA)
- 如何使用CGAL对三维点集进行范围搜索
- 在c++中搜索排序向量中的范围[x,y][使用lower_bound()和upper_bound()]
- 二进制搜索范围