这是根据我写的k-d树和蛮力的维度执行速度的图表。 指针集的数量固定为1 M(1,000,000),Query测量的速度为1000次。 k - d树的增加是巨大的,但蛮力不是。 我想知道为什么会出现这些结果以及如何改进它们。
答案 0 :(得分:0)
一些想法:
性能可能很大程度上取决于数据的特征。例如,数据点是均匀分布,聚类还是以其他方式排列?
此外,您正在执行的查询类型是什么?一种解释是您正在使用窗口查询返回整个点集或其大部分。在这种情况下,蛮力总是会更快。
KD-Tree实施中是否存在缺陷?
通常,已知kD-Tree在高维度下不能很好地扩展。因此,例如在机器学习中,维度通常会降低到10到20左右。但是,除非你在GPU上做暴力,否则KD-Tree应该更快。
如果您正在寻找具有高维度(插入/窗口查询)更好扩展的结构,请查看R*Trees或PH-Tree(后者是自我广告,目前仅限于60个尺寸,但本周将发布高调版本)。对于k最近邻搜索,请查看CoverTrees或BallTrees。如果您使用的是Java,可以查看my repo中的实现。我还实现了R*Tree here。