KD 树
交替地按 x、y 坐标划分平面,直到叶子节点只有一个点。 每个节点对应一个平面矩形区域。
构造
找到中位数点(对应维度下),左右子树分别递归处理两侧节点
查询
递归地进行查询:
- 若为叶子节点,判断节点中的点是否在查询区域内并输出
- 若子节点代表区域包含于查询区域,则输出子树
- 若子节点代表区域与查询区域交不为空,则继续递归查询
- 若子节点代表区域与查询区域交为空,则返回
性质
- 树高为
- 同层的节点对应的区间交为空,并为整个平面
性能
预处理 (构造)
每层耗时来自找到中间值的 耗时 树高为 ,因此空间复杂度为
查询
查询的时间成本取决于递归调用的次数 ,观察发现当且仅当一个子区域的边界与查询区域边界相交时,会触发向下的递归。 渐近等于一条查询区域的边触发的递归调用次数。 可以发现,祖孙节点间存在递推关系,如果一个子区域与查询边相交,则在其四个孙子中,至多会有两个区域与该边相交。 最坏情况构造:点均匀分布,查询形状为长条形,只有一个维度上可以剪枝。则每经过两层,需要访问的节点数会翻倍,总共会访问 个节点
更高维度
依次按第 1 至第 k 维进行划分,
- 在 构造出
- 空间复杂度
- 查询时间