如何使用kd-tree计算最近邻搜索的平均时间复杂度?

时间:2014-03-22 11:32:01

标签: algorithm time-complexity kdtree

我们知道kd-tree最近邻搜索的复杂性是O(logn)。但是如何计算呢?主要问题是回溯的平均时间复杂度。我试图阅读论文"一种在对数预期时间内找到最佳匹配的算法",但这对我来说太复杂了。有谁知道一种简单的计算方法吗?

1 个答案:

答案 0 :(得分:3)

本文中的计算尽可能简单,以进行严格的分析。

(NB这是真正的计算机科学家和软件工程师的代价。你必须努力学习数学。知道数学是分离那些思考的人可以写出可靠的程序那些发明了kd-trees的人Jon Bentley在高中的时候就是这样做的。以此为灵感。)

如果你想要一个粗略直观的想法严谨,这里就是一个。

假设我们在2d工作。由2d树表示的几何区域的大小是关键。

在一般情况下,一个点将域划分为2个大致相等大小的矩形。 3分为4. 7分为8分。等等。通常,N个点导致N-1大致相等大小的矩形。

不难看出,如果域是1x1,这些部分的边长是平均O(sqrt(1 / N))。

搜索最近邻居时,将树下移到包含搜索点的矩形。执行此操作后,您已使用O(log N)努力在正确的R = O(sqrt(1 / N))内找到一个点。这只是您发现的叶子中包含的一个点。

但是这个矩形不是唯一必须搜索的矩形。您仍然必须查看包含距离搜索点不超过距离R的所有其他点,并在每次找到更近点时对R进行精炼。

幸运的是,R上的O(sqrt(1 / N))限制提供了对其他矩形的平均数量的紧密限制。在一般情况下,它大约为8,因为每个大小相等的矩形不超过8个邻居。

因此,搜索的总工作量是O(8 log n)= O(log n)。

同样,我重申这是一个严格的分析,但它应该让你感觉为什么算法在平均情况下是O(log N)。