Time complexity 二维矩阵中DFS的时间复杂度(移动为4路,每次在当前节点完成DFS时,我们都重置访问标志)

Time complexity 二维矩阵中DFS的时间复杂度(移动为4路,每次在当前节点完成DFS时,我们都重置访问标志),time-complexity,depth-first-search,space-complexity,Time Complexity,Depth First Search,Space Complexity,给定一个有L,R,U,D的方向矩阵,在任何点上,你都可以移动到写在单元[i,j]上的方向。我们必须告诉你从[0,0]到[N-1,M-1]的最小修改次数 Example :- R R D L L L U U R Answer is 1, we can modify cell [1, 2] from L To D. (以下)DFS解决方案的时间复杂度是多少?请注意,我们是如何在每次浏览节点时重置访问标志的。 是4^(m*n)吗?请在回答问题时说明扣除额。谢谢 //

给定一个有L,R,U,D的方向矩阵,在任何点上,你都可以移动到写在单元[i,j]上的方向。我们必须告诉你从[0,0]到[N-1,M-1]的最小修改次数

    Example :-
    R R D
    L L L
    U U R

Answer is 1, we can modify cell [1, 2] from L To D.
(以下)DFS解决方案的时间复杂度是多少?请注意,我们是如何在每次浏览节点时重置访问标志的。 是4^(m*n)吗?请在回答问题时说明扣除额。谢谢

// minimumModification(arr, 0, 0, new boolean[arr.length][arr[0].length])       
private static int minimumModification(char[][] arr, int i, int j, boolean[][] visited)
{
    if(i<0 || j<0 || i>=arr.length || j>= arr[0].length || visited[i][j])
        return max;

    if(i == arr.length-1 && j == arr[0].length-1)
        return 0;

    visited[i][j] = true;
    int min = max;

    int right = minimumModification(arr, i, j+1, visited);
    int left = minimumModification(arr, i, j-1, visited);
    int down = minimumModification(arr, i+1, j, visited);
    int up = minimumModification(arr, i-1, j, visited);

    if(right != max && arr[i][j] != 'R')
        right++;
    if(left != max && arr[i][j] != 'L')
        left++;
    if(down != max && arr[i][j] != 'D')
        down++;
    if(up != max && arr[i][j] != 'U')
        up++;

    min = Math.min(min, right);
    min = Math.min(min, left);
    min = Math.min(min, down);
    min = Math.min(min, up);

    visited[i][j] = false;
    return min;
}

static final int max = Integer.MAX_VALUE;
//最小修改(arr,0,0,新布尔值[arr.length][arr[0].length])
私有静态int最小修改(char[]arr、int i、int j、boolean[]
{
如果(i=arr[0]。长度| |访问[i][j])
返回最大值;
如果(i==arr.length-1&&j==arr[0].length-1)
返回0;
访问[i][j]=真实;
int最小值=最大值;
int right=最小修改(arr,i,j+1,已访问);
int left=最小修改(arr、i、j-1、访问);
int down=最小修改(arr,i+1,j,已访问);
int up=最小修改(arr、i-1、j、访问);
如果(右!=max&&arr[i][j]!='R')
右++;
如果(左)!=max&&arr[i][j]!='L')
左++;
如果(向下!=max&&arr[i][j]!=D')
down++;
如果(向上!=max&&arr[i][j]!=U')
up++;
min=Math.min(min,右);
min=数学最小值(min,左);
最小=数学最小值(最小值,向下);
min=数学.min(min,向上);
访问[i][j]=错误;
返回最小值;
}
静态最终int max=整数.max_值;

问题来源:Leetcode

该算法基本上是通过尝试从网格左上角到右下角的每一条可能路径来工作的,其中每条路径不允许访问网格中的某个单元格多次。所以复杂度应该是O(SARW(m,n)),其中SARW(m,n)是网格上从左上角开始到右下角结束的数量。根据Wolfram MathWorld,这些被称为;讨论了一个事实,即没有精确的计算公式是已知的,但没有给出任何关于渐近行为的信息


据我所知,增长的顺序也不得而知。声称其体积应为指数(即m*n),但在该指数的基础上没有给出上限,也没有给出下限,除非基数大于1。对于正方形的情况(m=n),具有精确的数字;我计算了这个序列中的数字所隐含的指数基数,发现它在增加,但速度越来越慢,所以它可能在1.7或1.8左右趋于平稳。这将导致复杂性约为0(1.8^(mn)),但这是一个基于经验数据的估计值,可能会有很大的偏差。

该算法基本上是通过尝试从网格左上到右下的每一条可能路径来工作的,其中每条路径不允许访问网格中的一个单元格多次。所以复杂度应该是O(SARW(m,n)),其中SARW(m,n)是网格上从左上角开始到右下角结束的数量。根据Wolfram MathWorld,这些被称为;讨论了一个事实,即没有精确的计算公式是已知的,但没有给出任何关于渐近行为的信息

据我所知,增长的顺序也不得而知。声称其体积应为指数(即m*n),但在该指数的基础上没有给出上限,也没有给出下限,除非基数大于1。对于正方形的情况(m=n),具有精确的数字;我计算了这个序列中的数字所隐含的指数基数,发现它在增加,但速度越来越慢,所以它可能在1.7或1.8左右趋于平稳。这将导致复杂性约为O(1.8^(mn)),但这是一个基于经验数据的估计值,可能远远不够