范围树
给定平面点集,对矩形区域的查询,报告区域内的所有点。 暴力解法: 输出敏感?
一维情况:二分查找找到右端点后逐个向前检查,时间复杂度 该思路不容易扩展到高维。
能否用 BBST 解决? 时间构造一颗 BBST,查询两个端点,得到两根藤,内侧子树即为所求,同样可以在 时间内完成,空间复杂度为 。
怎么推广到高维? 先做 x-query,再做 y-query
问题:可能 x-query 几乎命中了所有点,而 y-query 排除了几乎所有点,此时总耗时退化到
多层搜索树 MLST
x-tree 中每个节点对应一个 y-tree。 查询时, 时间得到 颗 y-tree,对每颗 y-tree 再做一次 时间查询,总查询时间为 。
空间复杂度
- 每个点存在 颗 y-tree 中
- x-tree 中的每层各个节点关联的 y-tree 没有重叠,占用 空间 均可推出,总空间复杂度为
预处理
在自底向上构造 x-tree 时可同时构造 y-tree,合并两个子节点对应的 y-tree,可以先将它们转化为有序数组,进行二路归并,再转为 BBST,时间正比于两个 y-tree 的节点总数,同高度的 y-tree 总共恰好保存了所有节点,因此每层 y-tree 合并只需 时间,总时间复杂度为
更高维度
维情况:
- 占用空间
- 构造时间
- 查询时间
优化:分散级联
对于最后一维(二维情况下的 y 维度),实际上不需要组织为 BBST,可以简化为一个有序列表。
注意到每次查询中,对于多个 y-tree 的查询的范围是一致的,因此孩子的查询可以复用父亲的查询结果。
找到所有待查询的 x 树中节点的 LCA,在该节点对应的 y 树中花 查询后其余节点只需 时间即可完成查询
该优化只能用于最后一维,可以将查询时间优化到 ,而构造时间和占用空间不变