Skip to content

模型Model

k-d Tree

施工中 · 内容逐步修订

k-d tree · kd-tree

递归按坐标切分空间,并以包围区域剪枝多维范围或最近邻查询。

形式陈述 ​

构造与区域不变量 ​

固定维数 d≥1 和每条点记录的唯一 ID。kd-tree 是一棵二叉树;本页静态版本在逐层循环的坐标轴 0,…,d−1 上,以 (xj,id) 为键选中位顺序统计量。中位记录存于节点,其余记录按键唯一分入左右子树,规模相差至多一;原坐标在左侧不大于切分值、右侧不小于它,坐标相同时仍不重复记录。确定性线性选择可构造高度 O(log⁡(n+1)) 的树。每个节点隐式或显式对应一个轴对齐区域,子区域由父区域切成两半。

范围与最近邻 ​

用于正交范围报告时,区域与查询盒不交则剪枝,完全包含则报告整棵子树,否则递归。对上述固定循环轴、中位平衡的版本,二维范围报告界为 O(n+k);固定 d≥2 时为 O(n1−1/d+k)。为使重复坐标也服从分割分析,可在每一轴按 (xj,id) 的秩表示点,用该轴 lower/upper bound 将原查询区间转为秩区间。报告成员不变,而各轴秩互异;预处理保存这些次序,查询转换另花 O(dlog⁡(n+1))。对固定 d≥2,它被上述界吸收;一维直接采用区间搜索的 O(log⁡(n+1)+k) 界。任意换轴启发式或仅有高度平衡,不自动满足同一个循环轴分析。

界的来源是查询边界穿过多少个区域。在互异秩的表示中,固定一张垂直于某轴的查询边界:沿该轴切分时,它至多穿过一个子区域的内部;沿其他轴切分时至多穿过两个。每 d 层至多留下 2d−1 个子问题,各含至多约 n/2d 条记录,故边界工作为 O(n1−1/d)。固定维盒子只有 2d 张边界,完全包含的子树则按实际输出收费,得到上述 +k 项。开闭边界用秩区间的一致端点约定处理。

欧氏最近邻另外选用原坐标的标准内积;秩坐标只用于范围报告,不能替代真实距离。非空树先沿分割朝查询点所在一侧下降到叶或空孩子,再回溯检查节点点。初始最好距离为 +∞,只有找到真实点才更新;空树直接返回不存在。回溯时以当前最好距离为半径;若另一子区域到查询点的最小距离不小于最好值就剪枝,否则必须搜索。这里返回任意一个最近点;若需报告全部并列最近点,下界等于当前最好值时也不能剪枝。正确性不依赖“通常很近”,而依赖包围区域给出的下界。

直觉

k-d tree 的每次切分都给子树附上一块轴对齐区域。查询不必只看存储点本身,而可先比较整个区域与查询盒或当前最近球:区域下界已经不可能改进答案时,整棵子树都能剪掉;维数升高后大量区域同时相交,剪枝才会退化。

k-d Tree 的空间切分与安全剪枝
例子与边界

地理索引例子 ​

在选定的平面地图投影中,门店点按两个坐标交替切分;全球经纬度上的球面距离需要相应的区域下界,不能直接拿本页欧氏公式替代。查询一个轴对齐地图视窗时,西侧节点区域若完全在视窗外可整棵跳过;最近门店查询则用当前候选距离判断是否有必要跨越切分线。

维数灾难 ​

最近邻最坏可访问全部 n 个点,不是无条件 O(log⁡n)。高维中查询球常与大量区域相交,剪枝退化;重复坐标与极偏分布会使区域形状不利于最近邻剪枝;若切分不保持中位平衡,树高还可能增加。动态插入若不重平衡,树可能成链;使用方差轴是启发式,不改变最坏结论。

推论与应用

构建成本与距离下界 ​

每层若对当前子集线性选择中位数,所有节点一层总工作 O(n),平衡高度给构建 O(nlog⁡n);每层重新完整排序会增加不必要成本。重复坐标可用另一坐标或稳定 ID tie-break,确保每个点只进入一侧。

欧氏最近邻中,查询点到轴对齐包围盒的最小距离由各坐标超出区间的量平方和给出。只有该下界已不小于当前最好距离时才能剪枝;只比较查询点与切分平面的距离,在节点存有更紧包围盒时虽安全但可能少剪枝,反向用错误上界则会漏答案。

最近邻查询的堆栈状态 ​

查询点 q 时先按切分坐标选择下降方向,维护目前最近距离 R。回溯节点时更新切分点距离,再计算 q 到另一子区域包围盒的最小可能距离 dbox:只有 dbox<R 才进入另一侧。剪枝证书是区域下界,而不是“另一侧离切分平面较远”的直觉判断。

例如二维节点按 x=5 切分,q=(6,2),当前最近距离为 3。仅凭到平面距离 1 不能剪左侧;若左子区域的 y 范围为 [10,20],包围盒距离至少 8,才可安全跳过。反过来,若只存切分轴、不存区域边界,使用欧氏距离剪枝时必须从祖先约束重建盒子。

平衡构造保证树高 O(log⁡n),却不保证访问节点数对数。精确最近邻在高维或点集中于薄壳时可能检查线性多节点;随机近似搜索通过限制回溯预算改变的是答案保证,而不是同一算法的常数优化。

范围报告查询对与矩形相交的区域递归,对完全包含的区域可直接报告整棵子树;若节点未存子树点列表,仍需遍历输出,成本自然含 +k。空区域和边界相切时应按闭/开区间约定统一处理。

删除若仅打墓碑会让高度与区域包围盒逐渐失真。动态 k-d tree 常按失衡或墓碑比例重建子树,这提供的是摊还或经验性能,不能与静态中位数构造的最坏高度混写。

参考资料
  • Jon Bentley, Multidimensional Binary Search Trees Used for Associative Searching, CACM, 1975.
  • Mark de Berg et al., Computational Geometry: Algorithms and Applications, 3rd ed., Springer, 2008, multidimensional searching.
关系图谱11 个相邻概念 · 4 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
分类位置

上位 / 更一般

下位 / 直接特例

暂未标注直接特例。

类型化关系