KD-Tree实施

时间:2014-01-09 08:24:36

标签: data-structures tree machine-learning kdtree

我正在尝试编写自己的KD-Tree实现并最终实现kNN实现。我很难理解KD-Tree如何构建搜索树。

在维基百科上它说它找到值的中位数并将其用作树的根。

但是,如果有多个维度,你将如何计算中位数?

3 个答案:

答案 0 :(得分:2)

您没有在多个维度中找到中位数(实际上,多维数字没有有意义的顺序)。在kd树的每个级别,您都专注于一个维度。您可以根据此维度选择中位数,而忽略其他组件。

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

答案 1 :(得分:0)

查找中位数不是必需:来自维基百科:

  

另请注意,不需要选择中间点。在那里面   情况下,结果很简单,就是无法保证树   将是平衡的。一种简单的启发式方法,可以避免编码复杂   线性时间中位数发现算法,或使用O(n log n)类型   所有n个点,就是用sort来查找固定数的中位数   随机选择的点作为分裂平面。在实践中,   这种技术通常会产生很好的平衡树。

KD-Tree from wikipedia

答案 2 :(得分:0)

您可以根据一个维度简单地对点进行排序,然后选择 中位数为root,然后递归构造子树(与其他维度排序) 这是一个实现: https://github.com/tavaresdong/cs106l/blob/master/KDTree/src/KDTree.h