Motivation
一维范围查询:先进行预处理(在 O(n * log n) 时间内组织成一个有序向量),然后在 O(log n) 时间内找到起始位置,遍历找出范围内的点。
那么,如何查询二位平面内,矩形范围内的点?
kd树是一棵递归定义的平衡二叉搜索树。树上的每个节点都对应二位平面上的一个矩形区域。父节点对应的区域等于子节点对应区域之和。
构造算法
若当前节点深度为偶(奇)数,则沿垂直(水平)方向切分,所得子区域随同包含的输入点分别构成左、右孩子。重复,直到子区域只剩单个点。
这里约定每个区域的上边和右边包含在区域内,下边和左边在区域外。
查找
在任一节点处,
- 若子树仅包含单个节点,则直接判断
- 若节点对应区域在矩形内,则直接输出所有子节点
- 若节点对应区域在矩形外,则所有子节点都不在矩形内,不必再向下
- 否则,继续递归深入左右子树
时间复杂度