如何计算此代码的时间复杂度?

时间:2019-10-04 07:07:43

标签: java time complexity-theory

我正在用这段代码来计算时间复杂度。 目前只能使用简单的代码... 只想尝试复杂的一个!

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;
}

3 个答案:

答案 0 :(得分:0)

基本上,您可以计算分配和操作。 拥有

Product

每次执行一次都会递增。

执行此操作的另一种方法是监视时间,但这不是最可靠的时间。

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

答案 1 :(得分:0)

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

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

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

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

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

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

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

答案 2 :(得分:0)

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

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