KDT介绍
KDT/K-D Tree(K-Dimension Tree,K维树)是一种高效处理K维空间信息的数据结构,其可以看做二叉树在K维空间的扩展,它主要用于多维空间关键数据的搜索。KDT是一种特殊的二进制空间分割树,每个节点都表示k维空间中的一个点,并且所有非叶子节点可以用一个超平面将空间分割成两个半空间。节点左边的子树代表在超平面左边的点,节点右边的子树代表在超平面右边的点。
相较于二叉树只需要根据一维数据进行划分,KDT交替的使用某一维的数据进行划分。
应用场景
- 激光SLAM处理三维点云数据
- 维护高维度信息、处理偏序问题
- KNN的一种实现方法
算法解析
构建KDT
已知K维空间内有n个不同的点坐标,构建K-D Tree的方法如下:
- 若当前超立方体中只有一个点,则返回这个点。
- 选择一个维度,将当前超立方体按照这个维度分成两个超立方体。
- 选择切割点:在选择的维度上选择一个点,在这个维度上,值小于这个点的,归入左超立方体(左子树),其余归入右超立方体(右子树)。
- 将选择的点作为该子树的根节点,递归上述操作。
最近邻搜索
首先使用类似于二分搜索的方式从根节点开始向下搜索,直到找到叶子节点,期间将访问过的节点都加入到一个栈(Stack)中,同时记录最短距离;找到叶子节点后开始回溯,依次从栈中弹出之前的访问过的节点,判断以待查询点为球心,当前最短距离为半径的超球面,与分割面是否有相交,如果相交则进入该节点的另一个分支,继续执行二分搜索,直到搜索到叶子节点,以此循环往复,直到超球面与分割面没有相交。
插入新节点
借鉴了替罪羊树的思想,替罪羊树是一种自平衡树,但它不是严格意义上的平衡树,而是允许一定的失衡,失衡的程度用一个常数α表示。当失衡时重建整个子树,被重建的子树的根节点就是“替罪羊”节点。虽然重构的代价较大,但是并不是每次插入新节点都会引发重构操作,所以使用这样一种代价较大但是次数较少的重构方式。
补充说明
超立方体
采用类比的方法理解
- 正方形是四条长度相等的一维图形围成的二维图形。其四条边首尾相连,每个端点由两条线段共用。
- 正方体是六个面积相等的二维图形围成的三维图形。其六个面首尾相连,每个棱由两个面共用。
- 不难得出:超立方体是八个体积相等的三维图形围成的四维图形。其八个体首尾相连,每个面由两个体共用。
维度选择
K维轮流法
大方差优先法
随机划分法
选中位数
只需要找出部分数组的中位数就可以了,即找出第k大的数
代码模板
// KDT建树,作者还没写
868

被折叠的 条评论
为什么被折叠?



