【问题标题】:How do I calculate this code's time complexity? [duplicate]如何计算此代码的时间复杂度? [复制]
【发布时间】:2020-02-02 12:04:13
【问题描述】:

我正在努力计算这段代码中的时间复杂度。 目前只能写简单的代码... 只是想尝试复杂的!

public static int PATHWAY = 0;
public static int WALL = 1;
public static int MARKED = 2;

public static boolean find(int x, int y) {
    if(x == 7 && y == 7) return true;
    maze[x][y] = MARKED;
    if(x != 0 && maze[x-1][y] == PATHWAY && find(x-1, y)) return true;
    if(y != 0 && maze[x][y-1] == PATHWAY && find(x, y-1)) return true;
    if(x != 7 && maze[x+1][y] == PATHWAY && find(x+1, y)) return true;
    if(y != 7 && maze[x][y+1] == PATHWAY && find(x, y+1)) return true;
    return false;
}

【问题讨论】:

  • 我错了还是它永远不会收敛?

标签: java time complexity-theory


【解决方案1】:

基本上你可以计算分配和操作。 有一个

int assignments = 0;
int operations = 0;

你每次做一个都会增加。

这样做的另一种方法是监控时间,但这不是最可靠的方法。

您还可以计算/近似 Big-O,检查Big O, how do you calculate/approximate it?

【讨论】:

    【解决方案2】:

    好吧,在每个递归调用中,您都会访问二维数组中的单个单元格。

    由于你标记了访问过的单元格,你不能两次访问同一个单元格。

    因此,总的递归调用受二维数组长度的限制。

    除了递归调用之外,您在每次执行find() 方法时都会执行固定数量的工作。

    因此,如果N 是二维数组的行数,M 是二维数组的列数,则时间复杂度为 O(N*M)

    当然,根据你的停止条件if(x == 7 && y == 7) return true;,看起来你的二维数组的尺寸是8x8,可以看作是一个常数。这将使运行时间 O(1)。

    O(N*M) 是一般输入数组的复杂度。

    【讨论】:

      【解决方案3】:

      这并不难,它实际上使用 DFS 来寻找路径。 DFS的顺序是O(V+E),其中V是顶点数,E是边数。

      在这种情况下,您使用邻接矩阵来表示您的图形。所以在最坏的情况下,时间复杂度将是O(M*N),其中M 是行数,N 是列数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-19
        • 2019-09-27
        • 2021-06-23
        • 1970-01-01
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多