为什么这个唯一路径问题的回溯解是 O(2^max(m,n))?

Why this backtracking solution for Unique Path problem is O(2^max(m,n))?

这是来自 LeetCode 的唯一路径问题 https://leetcode.com/problems/unique-paths/

There is a robot on an m x n grid. The robot is initially located at the top-left corner (i.e., grid[0][0]). The robot tries to move to the bottom-right corner (i.e., grid[m - 1][n - 1]). The robot can only move either down or right at any point in time.

Given the two integers m and n, return the number of possible unique paths that the robot can take to reach the bottom-right corner.

这是来自 tutorialcup 的回溯解决方案 https://www.tutorialcup.com/leetcode-solutions/unique-paths-leetcode-solution.htm

import java.util.*;
import java.lang.*;
import java.io.*;
class Solution {
   public static int uniquePaths(int m, int n) {
       if(m == 1 || n == 1)
           return 1;
       return uniquePaths(m-1, n) + uniquePaths(m, n-1);
   }
   
   public static void main(String[] args){
     System.out.print(uniquePaths(2,2));
   }
}

wbesite 中提到的最差时间复杂度为 O(2^max(m,n))。我觉得不对。

我认为有m*n种可能性,每递归一步减一

T(mn) = T(mn-1) + T(mn-1)
     = 2 * T(mn-1)
     = 2^mn

所以最坏的时间复杂度是 O(2^mn)。让我知道我的计算是否正确或是否遗漏了什么

I think there is m*n possibilities which is reduced by one in each recursive step.

不,它在每一步中都会减少 nm。所以:

T(mn) = T(m(n-1)) + T((m-1)n) + 1

这反映了您的递归调用:两个参数(传递给递归调用)的乘积表示剩余问题的大小 space。

为了计算时间复杂度,添加常数项很重要,因为函数的每次调用代表 work/time。

此外,使用这种表示法,相同但来自不同网格大小的产品之间的区别就消失了。您应该将 2 个维度分开:

T(m, n) = T(m, n-1) + T(m-1, n) + 1
T(m, 1) = 1
T(1, n) = 1

基本情况表示只剩下 1 列或 1 行的情况,然后机器人只能在一个方向上移动——通过一条路径。