Kd-Trees
kd-tree(k-dimensional-tree),是一种分割k维数据空间的数据结构。主要应用于多维空间关键数据的搜索。下面介绍了如何使用kd-tree实现2维的范围搜索和最近邻搜索。
kd-tree有很多的应用场景,例如网络设计、电路设计、数据库查询。在范围搜索和最近邻搜索中,普通的遍历搜索查询算法复杂度为O(N),而kd-tree的复杂度为O(logN)。
kd-tree数据结构
下面介绍kd-tree在2维情况下的数据结构,即每个节点由2维数据(x坐标和y坐标)构成。
2d-tree建立在二叉树的基础之上,普通二叉树的左节点小于父节点,右节点大于父节点。而2d-tree则分为两种情况,一层节点由X坐标区分,下一层节点则由Y坐标区分,依次交替。
由X坐标区分时左节点在父节点的左边,右节点在父节点的右边;由Y坐标区分时左节点在父节点的下面,右节点在父节点的上面。
构造2d-tree
在构造2d-tree时,如下图所示,
- 根节点使用X坐标,将平面分为左右两边;
- 插入节点2,2与1比较,在1的右边,因此插入1的右节点,使用Y坐标分割平面;
- 插入节点3,3与1比较,在1的左边,插入1的左节点,使用Y坐标分割平面;
- 插入节点4,4在1比较,在1的左边,与3比较,在3的下面,插入3的左节点,使用X坐标分割平面;
- 插入节点5,5在1比较,在1的左边,与3比较,在3的下面,与4比较,在4的左边,插入4的左节点,使用Y坐标分割平面;
- ……
Java实现
public boolean insert(Node node) {
if (this.equals(node))
return false;
if (this.compareTo(node) > 0) {
if (this.left != null)
return thi