【问题标题】:How is Asymptotic Complexity Derived for Recursive Functions递归函数如何推导渐近复杂度
【发布时间】:2018-01-18 23:27:54
【问题描述】:

我没有在网站上找到一个通用的答案

举例

如果我有一些算法;说二进制搜索我如何推导(数学显示)它的复杂性是O(log(n))

但更一般地说,我如何推导出任何递归算法的渐近复杂度?

【问题讨论】:

  • 没有一般的答案。每个计算都取决于算法的性质。这样做的唯一“通用”方法是通过实验测量一系列不同输入的计算时间,并将数据拟合到已知的现有函数。
  • @meowgoesthedog 好的,二分搜索示例呢?
  • 我不能仅仅为了一个例子而发布答案。但是您可以为大多数递归算法构造一个递归关系。对于二分查找,每次搜索空间缩小50%,所以关系函数为T(n) = T(n/2) + C。如果你解决了这个问题,你应该得到O(log n)
  • @meowgoesthedog 啊,这就是我要弄清楚的递归函数,我已将标题更改为更相关,C 是什么?
  • 也可能将“任何算法的复杂性”更改为“任何递归算法”

标签: big-o complexity-theory binary-search theory asymptotic-complexity


【解决方案1】:

许多递归算法的时间复杂度可以用它自己来表示,就像算法一样。这称为递归关系,通常采用以下格式

T(N) = [sum of T(N_i) for recursive call i] + [sum of other work done in the function]

例如,二分搜索有一个非常简单的递归关系:对于每个递归调用 1) 搜索空间减半,以及 2) 完成的工作量是恒定的。因此关系的形式为T(N) = T(N / 2) + C。为了解决这个问题,反复替换它并找出一个模式:

T(N) = T(N / (2^1)) + C
     = T(N / (2^2)) + 2C
     = T(N / (2^3)) + 3C
     = ... 
     = T(N / (2^m)) + mC

当搜索空间只有一个元素时,即当N / (2^m) = 1 时,二分搜索终止。这对应于m = log2(N)T(N / (2^m)) = 0

因此时间复杂度为O(m) = O(log N)。 (日志的基数无关紧要,C 也不重要,因为它们都是乘法常数)

【讨论】:

    【解决方案2】:

    对于最常见的递归关系,您的答案是主定理。见:https://en.wikipedia.org/wiki/Master_theorem

    您还可以在 CRLS - 算法简介中找到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多