[英]Finding time complexity of recursive function
我正在嘗試使用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;
}
}
如果將遞歸調用更改為
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)。
盡管這似乎很容易計算,但是線性遞歸深度通常不是一個好主意(除了在識別和支持尾遞歸的語言中),因為堆棧大小通常比堆空間要受限制-您可能很容易碰到堆棧溢出異常。
因此,通常情況下,除非我錯過了一些重要的問題,否則通常只有兩個嵌套循環(用於行和列)。 代碼中正在進行的處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.