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