kd-Tree

http://blog.csdn.net/ysqjyjy/article/details/50060893

http://www.cnblogs.com/eyeszjwang/articles/2429382.html

 

k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构。主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索)

 

在介绍Kd-tree的相关算法前,我们先回顾一下二叉查找树(Binary Search Tree)的相关概念和算法。

 

二叉查找树(Binary Search Tree,BST),是具有如下性质的二叉树(来自wiki):

 

1)若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值;

 

2)若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值;

 

3)它的左、右子树也分别为二叉排序树;

 

将一个1维数据集用一棵BST树存储后,当我们想要查询某个数据是否位于该数据集合中时,只需要将查询数据与结点值进行比较然后选择对应的子树继续往下查找即可,查找的平均时间复杂度为:O(logN),最坏的情况下是O(N)。

 

如 果我们要处理的对象集合是一个K维空间中的数据集,那么是否也可以构建一棵类似于1维空间中的二叉查找树呢?答案是肯定的,只不过推广到K维空间后,创建 二叉树和查询二叉树的算法会有一些相应的变化(后面会介绍到两者的区别),这就是下面我们要介绍的Kd-tree算法。

 

如 果一个K维数据集合的分布像木条一样,那就是说明这K维数据在木条较长方向代表的维度上,这些数据的分布散得比较开,数学上来说,就是这些数据在该维度上 的方差(invariance)比较大,换句话说,正因为这些数据在该维度上分散的比较开,我们就更容易在这个维度上将它们划分开,因此,这就引出了我们 选择维度的另一种方法:最大方差法(max invarince),即每次我们选择维度进行划分时,都选择具有最大方差维度。

给 定一个数组,怎样才能得到两个子数组,这两个数组包含的元素个数差不多且其中一个子数组中的元素值都小于另一个子数组呢?方法很简单,找到数组中的中值 (即中位数,median),然后将数组中所有元素与中值进行比较,就可以得到上述两个子数组。同样,在维度i上进行划分时,pivot就选择该维度i上 所有数据的中值,这样得到的两个子集合数据个数就基本相同了。

 

 

posted @ 2016-10-17 16:13  banana16314  阅读(128)  评论(0编辑  收藏  举报