K-D树概念学习

kd-tree 

kd-tree(k-dimensional树的简称),是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。
主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索)。
K-D树是二进制空间分割树的特殊的情况。

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

结构简介
    k-d树是每个节点都为k维点的二叉树。所有非叶子节点可以视作用一个超平面把空间分割成两个半空间。节点左边的子树代表在超平面左边的点,节点右边的子树代表在超平面右边的点。选择超平面的方法如下:每个节点都与k维中垂直于超平面的那一维有关。因此,如果选择按照x轴划分,所有x值小于指定值的节点都会出现在左子树,所有x值大于指定值的节点都会出现在右子树。这样,超平面可以用该x值来确定,其法线为x轴的单位向量。

结构运算

    1 创建k-d树
    有很多种方法可以选择轴垂直分割面( axis-aligned splitting planes ),所以有很多种创建k-d树的方法。 
    最典型的方法如下:

    .随着树的深度轮流选择轴当作分割面。(例如:在三维空间中根节点是 x 轴垂直分割面,其子节点皆为 y 轴垂直分割面,其孙节点皆为 z 轴垂直分割面,其曾孙节点则皆为 x 轴垂直分割面,依此类推。)
    .点由垂直分割面之轴座标的中位数区分并放入子树

    这个方法产生一个平衡的k-d树。每个叶节点的高度都十分接近。然而,平衡的树不一定对每个应用都是最佳的。

    2 最邻近搜索
    最邻近搜索用来找出在树中与输入点最接近的点。
    k-d树最邻近搜索的过程如下:
    1) 从根节点开始,递归的往下移。往左还是往右的决定方法与插入元素的方法一样(如果输入点在分区面的左边则进入左子节点,在右边则进入右子节点)。
    2) 一旦移动到叶节点,将该节点当作"当前最佳点"。
    3) 解开递归,并对每个经过的节点运行下列步骤:
        a.如果当前所在点比当前最佳点更靠近输入点,则将其变为当前最佳点。
        b.检查另一边子树有没有更近的点,如果有则从该节点往下找。
    4)当根节点搜索完毕后完成最邻近搜索。

    3 处理高维数据
    维数灾难让大部分的搜索算法在高维情况下都显得花哨且不实用。 同样的,在高维空间中,k-d树叶并不能做很高效的最邻近搜索。一般的准则是:在k维情况下,数据点数目N应当远远大于 时,k-d树的最邻近搜索才可以很好地发挥其作用。不然的话,大部分的点都会被查询,最终算法效率也不会比全体查询一遍要好到哪里去。另外,如果只是需要一个足够快,且不必最优的结果,那么可以考虑使用近似邻近查询的方法。

猜你喜欢

转载自blog.csdn.net/bcbobo21cn/article/details/132844113
今日推荐