Data structures KD树的实现

Data structures KD树的实现,data-structures,tree,machine-learning,kdtree,Data Structures,Tree,Machine Learning,Kdtree,我正试图编写自己的KD树实现,并最终实现kNN。我很难理解KD树是如何构造搜索树的 在维基百科上,它说它找到了这些值的中间值,并将其作为树的根 然而,当有许多维度时,你将如何计算中间值?不需要找到中间值:来自维基百科: 还请注意,不需要选择中间点。因为 在这种情况下,结果只是无法保证树 将保持平衡。一种简单的启发式方法,可以避免编写复杂的代码 线性时间中值查找算法,或使用O(n logn)排序 所有n个点,都是用排序法找到一个固定数目的中值 随机选择用作拆分平面的点。实际上,, 这种技术通常会产

我正试图编写自己的KD树实现,并最终实现kNN。我很难理解KD树是如何构造搜索树的

在维基百科上,它说它找到了这些值的中间值,并将其作为树的根

然而,当有许多维度时,你将如何计算中间值?

不需要找到中间值:来自维基百科:

还请注意,不需要选择中间点。因为 在这种情况下,结果只是无法保证树 将保持平衡。一种简单的启发式方法,可以避免编写复杂的代码 线性时间中值查找算法,或使用O(n logn)排序 所有n个点,都是用排序法找到一个固定数目的中值 随机选择用作拆分平面的点。实际上,, 这种技术通常会产生非常平衡的树


在多个维度中找不到中位数(事实上,多维数字没有有意义的顺序)。在kd树的每一级,您都将重点放在一个维度上。您可以基于此尺寸选择中间带,而忽略其他组件


请注意,您可以使用中位数以外的许多标准,具体取决于您想要执行的操作。同样,选择一个好的方案来决定每个节点的维度也是一门艺术,尽管实际上每个方案都是正确的。

您只需根据一个维度对点进行排序,然后选择 中位数作为根,然后递归构造子树(使用其他维度排序) 下面是一个实现: