k-d树(Kd trees)

前言

在学习了平衡二叉查找树、红黑树等等之后,今天我们再来学习一个新的数据结构——kd树,kd树是一种分割k维数据空间的数据结构,主要应用于多维空间关键数据的搜索,下面就让我们来详细看看这种算法。

kd树

kd树也是二叉树,是用于分割多维空间的数据结构,所以其每一个节点是一个多维坐标。

先来看看kd树的构造:

在构造1维BST树时,一个1维数据根据其与树的根结点和中间结点进行大小比较的结果来决定是划分到左子树还是右子树,同理,我们也可以按照这样的方式,将一个K维数据与Kd-tree的根结点和中间结点进行比较,只不过不是对K维数据进行整体的比较,而是选择某一个维度Di,然后比较两个K维数在该维度Di上的大小关系,即每次选择一个维度Di来对K维数据进行划分,相当于用一个垂直于该维度Di的超平面将K维数据空间一分为二,平面一边的所有K维数据在Di维度上的值小于平面另一边的所有K维数据对应维度上的值。也就是说,我们每选择一个维度进行如上的划分,就会将K维数据空间划分为两个部分,如果我们继续分别对这两个子K维空间进行如上的划分,又会得到新的子空间,对新的子空间又继续划分,重复以上过程直到每个子空间都不能再划分为止。以上就是构造Kd-Tree的过程,上述过程中涉及到两个重要步骤:

1. 划分时以选中维度的中位数来划分,小的为左节点,大的为右节点。

2. 选择维度的方法有最大方差法或顺序遍历法,这里采用顺序遍历法,即对于点(x1, x2, x3, x4 ....),第一次按x1的维度来切分,第二次按照x2的维度来切分,切刀最后一个维度之后又回到x1的维度。

来看看一个二维的例子:

这是一个有13个点的二维图

首先先以 x 坐标进行切分,我们选出 x 坐标的中位点,获取最根部节点的坐标(7, 2)

之后,左右两边再按照 y 轴的排序进行切分,中位点记载于左右枝的节点。左边区域按(5, 4)上下分割,右边区域按(9,6)上下分割。

在不断按照上面的步骤进行切分和构造,得到最后结果:

k-d树上的最邻近查找算法

  这里先以一个简单的实例来描述最邻近查找的基本思路。

  星号表示要查询的点(2.1,3.1)。通过二叉搜索(即按照切分方法不断寻找星号点在树中的位置),顺着搜索路径很快就能该点的邻近点,也就是叶子节点(2,3)。而找到的叶子节点并不一定就是最邻近的,最邻近肯定距离查询点更近,应该位于以查询点为圆心且通过叶子节点的圆域内。为了找到真正的最近邻,还需要进行'回溯'操作:算法沿搜索路径反向查找是否有距离查询点更近的数据点。此例中先从(7,2)点开始进行二叉查找,然后到达(5,4),最后到达(2,3),此时搜索路径中的节点为(7,2)->(5,4)->(2,3).首先以(2,3)作为当前最近邻点,计算其到查询点(2.1,3.1)的距离为0.1414,然后回溯到其父节点(5,4),并判断在该父节点的其他子节点空间中是否有距离查询点更近的数据点。以(2.1,3.1)为圆心,以0.1414为半径画圆,如图4所示。发现该圆并不和超平面y = 4交割,因此不用进入(5,4)节点右子空间中去搜索。若是该圆与y = 4有交割,则说明节点的另一半子空间中或许存在距离更小的点,所以要搜索另一半子空间。

 

  再回溯到(7,2),以(2.1,3.1)为圆心,以0.1414为半径的圆更不会与x = 7超平面交割,因此不用进入(7,2)右子空间进行查找。至此,搜索路径中的节点已经全部回溯完,结束整个搜索,返回最近邻点(2,3),最近距离为0.1414。

       另一个例子如查找点为(2,4.5)。同样先进行二叉查找,先从(7,2)查找到(5,4)节点,在进行查找时是由y = 4为分割超平面的,由于查找点为y值为4.5,因此进入右子空间查找到(4,7),形成搜索路径(7,2)->(5,4)->(4,7),取(4,7)为当前最近邻点,计算其与目标查找点的距离为3.202。然后回溯到(5,4)。以(2,4.5)为圆心,以3.041为半径作圆,如图5所示。可见该圆和y = 4超平面交割,所以需要进入(5,4)左子空间进行查找。此时需将(2,3)节点加入搜索路径中得(7,2)->(2,3)。回溯至(2,3)叶子节点,(2,3)距离(2,4.5)比(5,4)要近,所以最近邻点更新为(2,3),最近距离更新为1.5。回溯至(7,2),以(2,4.5)为圆心1.5为半径作圆,并不和x = 7分割超平面交割,如图6所示。至此,搜索路径回溯完。返回最近邻点(2,3),最近距离1.5。

总结

kd树是用于高维空间中的快速最近邻和近似最近邻查找的一种数据结构。在计算机科学里,k-d树( k-维的缩写)是在k欧几里德空间组织的数据结构。k-d树可以使用在多种应用场合,如多维键值搜索(例:范围搜寻及最邻近搜索)。k-d树是空间二分树Binary space partitioning )的一种特殊情况。

 

 

最后强烈推荐Coursera上普林斯顿大学的算法课点击打开链接

 

 

以上内容纯属个人学习总结,不代表任何团体或单位。若有理解不到之处请见谅!

  • 19
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值