其实KDTree 就是一个二叉树,KDTree的创建、查询和二叉树方法都是类似的,只不过在划分二叉树的时候要考虑k维来划分,而二叉树只考虑一维。
定义:
KDTree是每个节点都为k维点的二叉树。所有非叶子节点可以视作用一个超平面把空间分割成两部分。在超平面左边的点代表节点的左子树,在超平面右边的点代表节点的右子树。超平面的方向可以用(n
mod k)(n可以认为是数的层级数,比如k为3 ,即x、
、z三维,那么第一次分就是按x值来分(第一层级)、第二次分就按y值分(第二层级)。。。第四层级又按x值来分二叉树等等。。。。)来选择:每个节点都与k维中垂直于超平面的那一维有关。因此,如果选择按照x轴划分,所有x值小于指定值的节点都会出现在左子树,所有x值大于指定值的节点都会出现在右子树。这样,超平面可以用该x值来确定,其法矢为x轴的单位向量。以使用在多种应用场合,如多维键值搜索。KDtree是二叉树的一种特殊情况。如下图所示:
第一次划分(红色)把根节点(白色)划分成两个节点,然后它们分别再次被划分(绿色)为两个子节点。最后这四个子节点的每一个都被划分(蓝色)为两个子节点。至此已经不能再被划分,最后得到的八个节点称为叶子节点。
有时间传上具体代码 作参考。。。。
KDTree 解析 、构建
时间: 2024-11-29 08:12:24