简单介绍一下KDT/K-D Tree

KDT介绍

KDT/K-D Tree(K-Dimension Tree,K维树)是一种高效处理K维空间信息的数据结构,其可以看做二叉树在K维空间的扩展,它主要用于多维空间关键数据的搜索。KDT是一种特殊的二进制空间分割树,每个节点都表示k维空间中的一个点,并且所有非叶子节点可以用一个超平面将空间分割成两个半空间。节点左边的子树代表在超平面左边的点,节点右边的子树代表在超平面右边的点。

相较于二叉树只需要根据一维数据进行划分,KDT交替的使用某一维的数据进行划分。

应用场景

  • 激光SLAM处理三维点云数据
  • 维护高维度信息、处理偏序问题
  • KNN的一种实现方法

算法解析

构建KDT

已知K维空间内有n个不同的点坐标,构建K-D Tree的方法如下:

  1. 若当前超立方体中只有一个点,则返回这个点。
  2. 选择一个维度,将当前超立方体按照这个维度分成两个超立方体。
  3. 选择切割点:在选择的维度上选择一个点,在这个维度上,值小于这个点的,归入左超立方体(左子树),其余归入右超立方体(右子树)。
  4. 将选择的点作为该子树的根节点,递归上述操作。

最近邻搜索

首先使用类似于二分搜索的方式从根节点开始向下搜索,直到找到叶子节点,期间将访问过的节点都加入到一个栈(Stack)中,同时记录最短距离;找到叶子节点后开始回溯,依次从栈中弹出之前的访问过的节点,判断以待查询点为球心,当前最短距离为半径的超球面,与分割面是否有相交,如果相交则进入该节点的另一个分支,继续执行二分搜索,直到搜索到叶子节点,以此循环往复,直到超球面与分割面没有相交。

插入新节点

借鉴了替罪羊树的思想,替罪羊树是一种自平衡树,但它不是严格意义上的平衡树,而是允许一定的失衡,失衡的程度用一个常数α表示。当失衡时重建整个子树,被重建的子树的根节点就是“替罪羊”节点。虽然重构的代价较大,但是并不是每次插入新节点都会引发重构操作,所以使用这样一种代价较大但是次数较少的重构方式。

补充说明

超立方体

采用类比的方法理解

  1. 正方形是四条长度相等的一维图形围成的二维图形。其四条边首尾相连,每个端点由两条线段共用。
  2. 正方体是六个面积相等的二维图形围成的三维图形。其六个面首尾相连,每个棱由两个面共用。
  3. 不难得出:超立方体是八个体积相等的三维图形围成的四维图形。其八个体首尾相连,每个面由两个体共用。

维度选择

K维轮流法

大方差优先法

随机划分法

选中位数

只需要找出部分数组的中位数就可以了,即找出第k大的数

代码模板

// KDT建树,作者还没写
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CresCent_Charles

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值