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

Algorithm 如何计算DFS算法的时间复杂度?,algorithm,Algorithm,像下面的函数一样,如何计算其时间复杂度?我想应该是O(m*n) int唯一路径(int m,int n){ 如果(m

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

int唯一路径(int m,int n){
如果(m<1 | n<1)返回0;
如果(m==1&&n==1)返回1;
返回唯一路径(m-1,n)+唯一路径(m,n-1);
}

您可以使用递归函数
T(m,n)=T(m-1,n)+T(m,n-1)
对时间复杂度进行建模,其中
T(1,1)=1
T(m,n)=0
只要
min(m,n)递归树:
为了用m=m和n=n表示问题,让我们将其写成
。如果我们尝试绘制此问题的递归树:

  • 从根本上说,我们有一个问题:
  • 然后,根中断为两个问题:
  • 如果我们继续沿着递归树往下走,我们将到达叶子,这将是

树的深度: 但是,这棵树的最大可能深度是多少?它是1(M+N)。此外,每个节点
最多可以断开2条路径,即<代码>


从树推断复杂性: 那么,可能的最大叶子数是多少?(提示:2(M+N))

因为每个节点都会分解成两个节点,在每一层上,叶子的数量会乘以2,从根的1开始

  • 所以,从根开始,可能的总叶数=2(M+N-1)
  • 乘和除2得到(1/2)*2(M+N)
  • 去掉常量值(1/2)使我们的复杂性为2(M+N)

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



1最长路径将从
开始,然后首先转到
。然后它将从那里转到
。那么,可能的最长路径长度=M+N.

那么,有多少条唯一的路径?@OliverCharlesworth这有关系吗?从数学的角度来看,它应该是组合(m+n,n)当然很重要-你访问了所有这些,对吗?@OliverCharlesworth好的,我明白了…在现实世界中,你可以记住
uniquepath(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);
}