2016-04-22 65 views
0

我试图使用Big-Oh表示法来查找这个函数的总体时间复杂度,函数checkElements()被递归地调用,其驻留在percolates()的内部。非常感谢查找递归函数的时间复杂度

public static boolean percolates(boolean[][] open) { 
    size = open.length; 
    uf = new WeightedQuickUnionUF((size * size) + 2); 
    for (int i = 0; i < open.length; i++) {//connect all top row elements to virtual top node. 
     uf.union(0, i); 
    } 

    for (int j = 0; j < open.length; j++) {//connect all bottom row elements to bottom virtual node 
     uf.union((size * size) + 1, (size * size) - j); 

    } 
    int row = 0; // current row of grid 
    int column = 0;// current column of grid 
    int ufid = 1; // current id of union find array 
    checkElements(column, row, open, ufid); 
    boolean systemPerculates = uf.connected(0, (size * size) + 1); 
    System.out.println("Does the system percoloates :" + systemPerculates); 
    return systemPerculates; 
} 

//search elements in the grid 
public static void checkElements(int column, int row, boolean open[][], int ufid) { 
    if (open[row][column]) { 
     if (column - 1 >= 0 && open[row][column - 1]) { //check adjacent left 
      uf.union(ufid, ufid - 1); 

     } 
     if (column + 1 < size && open[row][column + 1]) {//check adjacent right 
      uf.union(ufid, ufid + 1); 

     } 
     if (row - 1 >= 0 && open[row - 1][column]) {//check adjacent top 
      uf.union(ufid, ufid - size); 

     } 
     if (row + 1 < size && open[row + 1][column]) {//check adjacent bottom 
      uf.union(ufid, ufid + size); 

     } 
    } 
    if (column + 1 < size) {  //go to next column 
     ufid++; 
     column++; 
     checkElements(column, row, open, ufid); 
    } else if (column + 1 == size && row + 1 < open.length) { //go to next row 
     ufid++; 
     row++; 
     column = 0; 
     checkElements(column, row, open, ufid); 
    } else { 
     return; 
    } 

} 
+0

递归在哪里? –

+0

方法checkElements() –

回答

1

这可能是更容易,如果你改变了递归调用

if (column + 1 < size) {  //go to next column 
    checkElements(column + 1, row, open, ufid + 1); 
} else if (column + 1 == size && row + 1 < open.length) { //go to next row 
    checkElements(0, row + 1, open, ufid + 1); 
} else { 
    return; 
} 

你正在做的最多只有一个递归调用在checkElements,并且每次调用似乎减少所考虑的输入跟随一个,你只做一个合作在每一步中处理量都很大,所以运行时应该是O(n)。

虽然这似乎很容易计算,但线性递归深度通常不是一个好主意(除了识别和支持尾递归的语言之外),因为堆栈大小通常比堆空间更有限 - 您可能很容易遇到堆栈溢出异常。

因此,通常情况下,只有两个嵌套循环(用于行和列),除非我错过了重要的东西。代码中正在进行的处理。

+0

我怎样才能找到相同的代码的下界或大的theta? –

+0

我认为它是完全相同的界限 - 似乎没有任何会缩短运行时间的特殊输入 - 在任何情况下,所有单元格似乎都会被遍历。 –