我是论坛的新手,所以我希望我做得对。
我正在努力搞清楚bigO的复杂性。特别是时间复杂。 我正在研究一个递归程序,每次递归调用自己两次。 例如:
计算(I,J)
边缘检查
x =(compute(i-1,j)+ compute(i,j-1))/ 2;
返回x;
我认为这是O(2^n)
时间,因为每次通话都会产生两次。它是否正确?
复杂性是否相同?
答案 0 :(得分:0)
我建议你使用int或var-args数组,比如compute(int ... val) 发送4参数2进行第一次操作,最后2次进行第二次操作,在此方法中执行。
从该方法返回两个操作的添加。
所以你会得到O(n)时间。
答案 1 :(得分:0)
时间为O(2^(m+n))
,空格为O(1)
。
时间复杂度:
O(m,1) = O(m-1, 1) + O(1,1) = O(m-2,1) + 2O(1,1) = ... = O(m)
O(m,2) = O(m,1) + O(m-1,2) = O(m) + O(m-1, 1) + O(m-2,2) = ... = O(m) + O(m-1) + ... + O(1) + O(1,2) = O(m^2)
O(m,3) = O(m,2) + O(m-1,3) = O(m^2) + O(m-1, 2) + O(m-2,3) = ... = O(m^2) + - O((m-1)^2) + ... + O(1^2) + O(1,3) = O(2^m)
O(m,4) = O(m,3) + O(m-1,4) = O(2^m) + O(m-1, 3) + O(m-3,4) = ... = O(2^m) + O(2^(m-1)) + ... + O(2^1) + O(1,4) = O(2^(m+1))
O(m,5) = O(m,4) + O(m-1,5) = O(2^(m+1)) + O(m-1, 4) + O(m-3,5) = ... = O(2^(m+1)) + O(2^(m)) + ... + O(2^3) + O(1,5) = O(2^(m+2))
O(m,n) = O(2^(m+n))
对于空间复杂性:
它不使用ex空间。它是O(1)
<强>优化强>
def compute(i,j):
result = [[0 for x in range(i)] for y in range(j)]
for x in rangex(i):
for y in xrange(j):
if x == 0 or y == 0:
result[x][y] = value(x,y); // compute(i,j) and (i,j) is edge
else:
result[x][y] = (result[x][y-1] + result[x-1][y]) / 2
return result[i-1][j-1]
这是O(m*n)
时间和O(m*n)
空格。