如何计算DFS算法的时间复杂度?

时间:2016-04-03 13:52:11

标签: algorithm

与下面的函数一样,如何计算其时间复杂度?我认为应该是O(m * n)......

int uniquePaths(int m, int n) {
    if (m < 1 || n < 1) return 0;     
    if (m == 1 && n == 1) return 1;      
    return uniquePaths(m - 1, n) + uniquePaths(m, n - 1);
}

2 个答案:

答案 0 :(得分:2)

您可以使用递归函数T(m,n) = T(m-1, n) + T(m, n-1)建模时间复杂度,T(1,1)=1T(m,n)=0只要min(m,n)<1

看起来像T(m,n)=(m+n choose m)。要查看此注释,recurrence for the binomial coefficients (m+n choose n) = (m+n-1 choose m) + (m+n-1 choose m-1)以及T(m,n) = T(m-1, n) + T(m,n-1)完全相同。

因此T(m,n) = O((m+n)^n / n!)。 (有many other bounds。)

答案 1 :(得分:1)

递归树:

要表示m = M且n = N的问题,请将其写为 <M, N> 。如果我们尝试绘制此问题的递归树:

  • 从根本上说,我们遇到了一个问题: <M, N>
  • 然后,root断了两个问题: <M-1, N> <M, N-1>
  • 并且,如果我们继续沿着这个递归树,我们将到达叶子,这将是 <0, 0>
<树2的深度:

但是,这棵树的最大深度是多少?它的 1 (M + N)。此外,每个节点<M, N>最多可以分为2个路径,即。 <M-1, N><M, N-1>

从树中推断复杂性:

那么,可能的最大叶数是多少? (提示:2 (M + N)

好吧,因为每个节点都会断开两个节点,所以每个级别的叶子数量都会乘以2,从根节点开始。

  • 因此,从根开始,总叶数可能= 2 (M + N - 1)
  • 乘以除以2得到我们,(1/2)* 2 (M + N)
  • 摆脱常数值(1/2)给出了复杂性= 2 (M + N)

因此,算法的复杂性可以上限为 O(2 (m + n))。

1 最长的路径将从<M, N>开始,首先转到<0, N>。然后从那里开始<0, 0>。因此,最长的路径长度= M + N.