kdtree最简单易懂的介绍

1. K-D TREE

1.1. kd-tree定义

基于分区idea的二叉树型数据结构,树中每个节点都是k-dimensional数据。能够用于搜索查询(邻居)和构建点云。

1.2. kd-tree如何分区

树中除了叶子节点以外,其他的节点都通过找到一个超平面将其切割为左子树和右子树。如何找到超平面进行划分,对于k维数据,我们只选择其中的一个维度,然后设定一个值,大于这个值的是一半,小于这个值的也是一半。超平面根据这个值确定,超平面的法线就是这个由这个维度这个值构成的one hot向量。

1.3. kd-tree的两个约束

从哪个维度开始来构建超平面是个问题,所以kd-tree的第一个约束就是从头开始,循环的选择维度来划分数据,构建二叉树。

另外就是用什么值来分割也是个问题,kd-tree的第二个约束就是用当前选择划分维度的中位数来进行划分。

1.3.1对两个约束的思考

引入两个约束能够帮助我们构建平衡树,也就是叶节点距离根节点的距离差不多远,毕竟选择的中位数来进行划分,而且每个维度都“平等的”遍历过。但是问题就是这两个约束并不是必须要遵守的,我们可以灵活一点,因为找到中位数需要使用O(n)算法复杂度,排序之后直接选择中位数即便是使用堆排或快排复杂度也在O(nlog(n))左右。所以说,我们为了构建近似的平衡树,可以通过选择对一部分数据进行中位数的选择。

跑题一下,平衡树的优点就是他的空间复杂度比较低(时间复杂度都一样

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
kdtree是一种数据结构,主要用于在高维空间中进行最近邻搜索。在点云匹配中,我们可以利用kdtree来搜索目标点云中与源点云最相似的点。其原理如下: 1. 构建kdtree:将目标点云中的点按照某种规则(如在某一维度上的大小)进行排序,然后递归地将点分成子集,最终构建出一棵kdtree。在每个节点上,保存了该节点代表的子集的范围以及该节点代表的子集中所有点在每个维度上的平均值。 2. 搜索最近邻点:对于源点云中的每个点,利用kdtree搜索目标点云中与之最近的点。具体地,从根节点开始,递归地遍历kdtree,找到包含目标点云中最近的点的叶子节点。然后,从该叶子节点开始,向上遍历kdtree,直到找到一个节点,其子节点中的点与源点云中的点的距离小于当前最近距离。然后,继续向下遍历kdtree,直到找到叶子节点。在遍历过程中,保存当前最近距离以及对应的最近邻点。 3. 剪枝:在遍历kdtree时,可以根据当前节点的范围以及平均值,计算出该节点子节点中可能存在的最近距离。如果该最近距离小于当前最近距离,则可以将该子节点剪枝,不再进行遍历。 通过这种方式,可以高效地搜索目标点云中与源点云最相似的点。在点云匹配中,我们可以利用kdtree搜索一对点云中最近的点对,然后计算这对点对之间的距离,作为两个点云之间的距离度量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值