KD tree详解

KD tree是一个为了组织多维数据空间分割结构体,

我现在只讲一个简单的,

如果我们有一组数据 (2,3), (5,4), (9,6), (4,7), (8,1), (7,2).

KD-TREE的操作

1.构建

排序第一维数据 那么就是 2,4,5,7,8,9

选取第一维的中点 7  所以第一个node 就是 (7,2)

左子树的节点 应该是 (2,3), (5,4),(4,7)右子树 节点应该为(9,6),(8,1)

再根据第二维排序第二层节点  左(5,4) 右(9,6)

(如果有k维  那么第1层选取第一维做分割,第二层选取第二维度做分割。。。一直到k

不过有时候可以先算一个各个维度的方差选取最大的分割,优缺点暂时还不清楚)

2.添加节点

譬如要添加(3,6)

第一层第一维是3 < 7 那么在左子树,

第二层第二维为 6 > 4,。。。。。

和一般的排序树一样 不过比较时 要根据这个节点的分界维度比较,然后插入

3.最邻近点搜索

好像很复杂的。


搜索执行下列过程

  1.从根节点开始,算法递归的沿着树往下执行,和插入执行相同的步骤。(根据对比当前节点的分割维度的值决定往左或往右)

  2.一旦算法到达一个叶子节点保存当前节点为当前最优

  3.这个算法递归的展开这棵树,实行下面的步骤在每个节点上

           1.如果的当前节点比当前最优更好那么当前节点变成当前最优

          下面需要回溯对每个搜索路径上的节点执行下面操作。

           2.检测分割点另一面的节点是否更好。原则上,这是通过通过画一个超球面(圆心为搜索点,半径为当前最优距离)是否与分割超平面相交。因为所有的超平面与轴平行。 所以就是比较当前搜索节点分割维度到当前节点的距离是否小于搜索节点到最优节点的距离。

             1.如果相交那么就有比较近的节点在另一边。所以这个算法必须到另一边寻找最近的节点,(在另一面执行继续搜索到叶子节点,继续执行上面的操作)

              2.如果不想交继续当前的回溯,对搜索路径的上级继续执行上面操作。

   4.当处理到更节点,算法完成。


本人文采不好,见谅



c语言代码                http://code.google.com/p/kdtree/大家可以阅读代码 可以有更深的了解

原文地址:https://www.cnblogs.com/xiaokangzi/p/3576146.html