K-D树在维基百科上定义是将K维空间中的点进行分割的数据结构,D是dimensional(维度)的缩写,K-D树是BSP(Binary Space Partitioning)的一种。
维基百科的解释很正式(看的迷迷糊糊)。简单的说,K-D树就是二分查找树在K维空间的泛化(更迷糊了😂)。
1、K维空间的二分查找树
之前的一篇文章中有讲过二分查找树(BST)这样基础的数据结构,它是基于二分查找的思想实现 O ( l o g 2 N ) O(log_2N) O(log2N)的插入和查找速度。
如果把BST中的所有元素看成一维线段上的所有点,从树的根节点开始每个节点都会把线段分成两段。
所以BST本质上就是一维K-D树(或者叫做1-D树)
现在将树中的元素推广到二维平面上的点,树的每一层按照维度轮流划分。比如,奇数层按x轴划分,偶数层按y轴划分,这样就得到一棵二维K-D树(2-d树)
同样我们可以将元素推广到三维空间中的点,那样我们可以得到一棵3d-tree。
理论上k-d树可以继续到4维,5维… 作为一个三维空间里的生物,就没法用图来展示这样的元素了😅
这里有一个二维K-D树的模拟程序能帮助我们更好的理解K-D树: