我目前正在尝试找到一个平衡的KD树的所有节点的K个最近邻居(其中K=2)。我的实现是代码维基百科文章的变体,可以相当快地找到任何节点的KNN,时间复杂度为O(log N)。问题在于我需要找到每个节点的KNN,如果我迭代每个节点并执行搜索,则时间复杂度达到O(N log N)左右。是否有更有效的方法来解决这个问题?
根据您的需求,您可能希望尝试近似技术。有关详细信息,请查看Arya and Mount在该主题上的工作。一篇关键论文在这里。BigO复杂度的详细信息位于他们的'98年论文中。
下面显示了该工作的图形说明:
来源: http://www.cs.umd.edu/~mount/ANN/Images/annspeckle.gif
我在具有数十万个元素的高维数据集上使用过他们的库。它比我找到的任何其他东西都要快。该库处理精确和近似搜索。该软件包包含一些CLI实用程序,您可以使用它们轻松地对数据集进行实验;甚至可视化kd树(见上文)。
FWIW:我使用了R绑定。
来自ANN手册:
"... Arya和Mount [AM93b]以及Arya等人[AMN+98]已经证明,如果用户愿意容忍搜索中出现的一些误差(返回的点可能不是最近邻,但与真实的最近邻相比没有显着差异),则可以在运行时间上获得显著的改进。 ANN是一个系统,既可以精确地回答最近邻查询,也可以近似地回答最近邻查询。"要搜索的术语是knn join。更准确地说,您可能想要进行自连接。
也许这些搜索结果可以帮助您:
我只看到过用于R*树的knn连接算法。然而,在我的实验中,它们未能超越重复查询。我可能错过了一些实现思路。但总的来说,为树连接适当地保存数据比单个knn查询要棘手得多。