【问题标题】:How to solve: T(n) = T(n - 1) + n如何求解:T(n) = T(n - 1) + n
【发布时间】:2011-02-14 17:29:51
【问题描述】:

我已经解决了以下问题:

T(n) = T(n - 1) + n = O(n^2)

现在当我解决这个问题时,我发现界限非常松散。是我做错了什么还是就是这样?

【问题讨论】:

  • 我投票结束这个问题,因为它是一个数学问题,而不是一个编程问题。

标签: algorithm big-o recurrence


【解决方案1】:

您还需要一个循环关系的基本案例。

T(1) = c
T(n) = T(n-1) + n

要解决这个问题,您可以先猜测一个解决方案,然后使用归纳法证明它有效。

T(n) = (n + 1) * n / 2 + c - 1

首先是基本情况。当 n = 1 时,这将根据需要给出 c。

对于其他 n:

  T(n)
= (n + 1) * n / 2 + c - 1
= ((n - 1) + 2) * n / 2 + c - 1
= ((n - 1) * n / 2) + (2 * n / 2) + c - 1
= (n * (n - 1) / 2) + c - 1) + (2 * n / 2)
= T(n - 1) + n

所以解决方案有效。

首先要进行猜测,请注意,当 c = 1 时,您的重复关系会生成 triangular numbers

T(1) = 1:

*

T(2) = 3:

*
**

T(3) = 6:

*
**
***

T(4) = 10:

*
**
***
****

etc..

直观地说,三角形大约是正方形的一半,在 Big-O 表示法中,可以忽略常数,因此 O(n^2) 是预期的结果。

【讨论】:

  • 你能告诉我你是如何得到答案中的第三个等式的吗?你应用了什么数学技术?
  • @Tony:这是一个“猜测”。实际上,这是因为我知道三角数的公式——我实际上并没有猜到,我已经知道了。通常更容易“猜测”正确答案并证明它是正确的,而不是从第一原理中推导出来。这是解决递归关系的标准技术。
  • @Tony:有根据的猜测的技术术语是“ansatz”。请参阅:en.wikipedia.org/wiki/Ansatz。维基百科中有一些关于使用猜测来解决递归关系的信息:en.wikipedia.org/wiki/Recurrence_relation。那里还列出了解决递归关系的其他可能方法。
  • 从 O(n^2) 可以更容易地猜出精确解是二次多项式 ax^2+bx+c 并求解 a、b 和 c。 Knuth、Oren、Patashnik 所著的《具体数学》一书中详细描述了如何解决这些问题。
【解决方案2】:

这样想:
在递归的每个“迭代”中,您都做 O(n) 的工作。
每次迭代都有 n-1 个工作要做,直到 n = 基本情况。 (我假设基本情况是 O(n) 工作)
因此,假设基本情况是与 n 无关的常数,则递归有 O(n) 次迭代。
如果您有 n 次 O(n) 迭代,则 O(n)*O(n) = O(n^2)。
你的分析是正确的。如果您想了解有关这种解决递归方法的更多信息,请查看递归树。与其他方法相比,它们非常直观。

【讨论】:

  • 我对这一切的数学思考太多了,忘记了我们正在处理递归这一事实。也许这就是我不太明白的原因。对于上面我得到了 T(n)
  • 不太明白你在问什么,上面有很多
  • @Tony:不,这是不正确的。对于小的 n,T(n) 可以大于 2n。
【解决方案3】:

这个解决方案非常简单。你必须展开递归:

T(n) = T(n-1) + n = T(n-2) + (n - 1) + n = 
= T(n-3) + (n-2) + (n-1) + n = ... =
= T(0) + 1 + 2 + ... + (n-1) + n 

这里有算术级数,总和是1/2*n*(n-1)。从技术上讲,您在这里缺少边界条件,但是对于任何恒定的边界条件,您都会看到递归是 O(n^2)

【讨论】:

    【解决方案4】:

    看起来不错,但取决于基本情况 T(1)。假设您将执行 n 步以使 T(n) 变为 T(0),并且每次 n 项在 0 和 n 之间的任何地方,平均 n/2 所以 n * n/2 = (n^2)/2 = O(n^2)。

    【讨论】:

      猜你喜欢
      • 2013-01-10
      • 2017-10-03
      • 2011-08-03
      • 2016-03-12
      • 2019-04-15
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      相关资源
      最近更新 更多