【问题标题】:How to calculate the average time complexity of the nearest neighbor search using kd-tree?如何使用kd-tree计算最近邻搜索的平均时间复杂度?
【发布时间】:2014-03-26 07:14:24
【问题描述】:

我们知道kd-tree最近邻搜索的复杂度是O(logn)。但是如何计算呢?主要问题是回溯的平均时间复杂度。我曾尝试阅读论文“An Algorithm for Finding Best Matches in Logarithmic Expected Time”,但对我来说太复杂了。有谁知道一个简单的计算方法?

【问题讨论】:

  • 这个问题可能更适合Computer Science
  • 如果您是真正的程序员而不是黑客,这是一个有效的问题。

标签: algorithm time-complexity kdtree


【解决方案1】:

为了进行严格的分析,论文中的计算尽可能简单。

(注意这是成为一名真正的计算机科学家和软件工程师的代价。您必须努力学习数学。了解数学是区别那些认为可以编写可靠程序的人来自那些真正能做到的人。发明 kd-trees 的人 Jon Bentley 在高中时就这样做了。以此为灵感。)

如果您想要一个严格的粗略直观想法,这里有一个。

假设我们在 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)。

【讨论】:

  • 非常感谢您不仅对我的问题的回答,也非常感谢您对我的建议。他们都是我想要的。谢谢你:)
  • @Gene 我很难完全理解原始证明。既然您似乎知道并理解原始证明,我可以提请您注意follow-up question 吗?我在 CS.SE 上创建了一个新问题,因为评论似乎不合适。
  • @user1494080 你删除了你的问题吗?
猜你喜欢
  • 2011-05-24
  • 2015-03-17
  • 2012-06-11
  • 2017-03-31
  • 2016-10-14
  • 1970-01-01
  • 2012-06-27
  • 2015-04-16
  • 2019-04-02
相关资源
最近更新 更多