Kd-Tree算法原理和开源实现代码
一、Kd-tree Kd-Tree,即K-dimensional tree,是一棵二叉树,树中存储的是一些K维数据。在一个K维数据集合上构建一棵Kd-Tree代表了对该K维数据集合构成的K维空间的一个划分,即树中的每个结点就对应了一个K维的超矩形区域(Hyperrectangle)。 在介绍Kd-tree的相关算法前,我们先回顾一下二叉查找树(Binary Search Tree)的相关概念和算法。 二叉查找树(Binary Search Tree,BST),是具有如下性质的二叉树(来自wiki): 1)若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值; 2)若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值; 3)它的左、右子树也分别为二叉排序树; 例如,图1中是一棵二叉查找树,其满足BST的性质。 图1 二叉查找树(来源:Wiki) 给定一个1维数据集合,怎样构建一棵BST树呢?根据BST的性质就可以创建,即将数据点一个一个插入到BST树中,插入后的树仍然是BST树,即根结点的左子树中所有结点的值均小于根结点的值,而根结点的右子树中所有结点的值均大于根结点的值。 将一个1维数据集用一棵BST树存储后,当我们想要查询某个数据是否位于该数据集合中时,只需要将查询数据与结点值进行比较然后选择对应的子树继续往下查找即可,查找的平均时间复杂度为:O(logN)