繁体   English   中英

使用 KD 树(即平衡二叉树)进行 1-NN(最近邻)搜索的时间复杂度在什么范围内?

[英]The time complexity for a 1-NN (nearest neighbor) search using a KD tree (i.e. balanced binary tree) is in what range?

使用 KD 树(即平衡二叉树)进行 1-NN 搜索的时间复杂度在什么范围内? 假设数据集中有 N 个点

这里有提示,但还是想不通: https://www.coursera.org/lecture/ml-clustering-and-retrieval/complexity-of-nn-search-with-kd-trees-BkZTg

A) O(N2) - O(N3)

B) O(log N) - O(N)

C) O(N logN) - O(N2)

D) 以上都不是

TLDR。 使用 kd-tree 找到最近邻居的最佳和平均情况将是 O(log₂(N))。 但最坏的情况可能更接近 O(N)。 因此答案是B) O(log N) - O(N)

假设 kd-tree 已经建立,树的每一层通常会在一个给定维度上分叉整个点范围。 就像二叉树一样。 因此,如果树是完美平衡的,并且每个叶节点仅包含一个点,那么在树的底部将有大约 N 个叶子,其高度为 log2(N) 级。 因此,要在树中找到原点总是 log2(N)。

但是您不是在寻找原始点,而是在寻找它最近的邻居。 所以这就是复杂的地方。 实际上,您的叶节点不只包含一个点。 它们包含一些合理数量的点(~ log₂(N) 或一些小数字,如“10”),这些点被认为在同一个盒子或“集群”中。

因此,当您找到初始点时,您可以立即对叶节点集群中的其他点进行距离计算,以找到最近邻的初始候选。 因此,最高概率是最近邻居在同一个集群中,其在相邻叶节点集群之一中的概率较小。 当您递归树时,您必须根据每个节点的维度和中点值来决定是否需要递归另一个子节点。 但是如果你已经找到了最近的邻居,你可能不会在树上做太多的递归。

但理论上有可能,点集的初始分叉将原始点与其最近邻点分开。 在一些疯狂的点布局中,你最终不得不对树中的大多数点进行距离计算。 因此,O(N)。 尝试制作一个二维点图并自己创建这个场景。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM