1.赋予T(0)=1, T(n)=T([2n/3])+c
(在这种情况下2n/3
为下限)。什么是T(n)
的大Θ?这只是log(n)(base 3/2)
。请告诉我如何获得结果。
2.给出代码
void mystery(int n) {
if(n < 2)
return;
else {
int i = 0;
for(i = 1; i <= 8; i += 2) {
mystery(n/3);
}
int count = 0;
for(i = 1; i < n*n; i++) {
count = count + 1;
}
}
}
根据主定理,big-O界限是n ^ 2。但我的结果是log(n)* n ^ 2(基数3)。我不确定我的结果,实际上我真的不知道如何处理递归函数的运行时。它只是简单的日志功能?
或者如果在此代码中T(n)=4*T(n/3)+n^2
会怎么样?
干杯。
答案 0 :(得分:1)
对于(1),递推求解为c log 3/2 n + c。要看到这一点,您可以使用迭代方法展开重复的几个术语并找出模式:
T(n)= T(2n / 3)+ c
= T(4n / 9)+ 2c
= T(8n / 27)+ 3c
= T((2/3) k n)+ kc
假设T(1)= c并且求解k的选择使得括号内的表达式等于1,我们得到
1 =(2/3) k n
(3/2) k = n
k = log 3/2
将这个k选择插入上面的表达式得出最终结果。
对于(2),您具有递归关系
T(n)= 4T(n / 3)+ n 2
使用a = 4,b = 3和d = 2的主定理,我们看到log b a = log3 4&lt; d,所以这解决了O(n 2 )。这是一种看待这个的方法。在顶层,你做 2 工作。在下面的那一层,你有四个调用,每个调用n 2 / 9工作,所以你做4n 2 / 9工作,少于顶层。下面的层执行16次调用,每次执行n 2 / 81工作总共16n 2 / 81工作,再次比上面的层工作多。总的来说,每一层的工作量都比它上面的层少得多,因此顶层最终会渐渐地支配所有其他层。
答案 1 :(得分:0)
让我们做一些复杂性分析,我们会发现T(n)
的渐近行为取决于递归的常量。
鉴于T(n) = A T(n*p) + C
,A,C>0
和p<1
,我们首先尝试证明T(n)=O(n log n)
。我们尝试找到D
,以便足够大n
T(n) <= D(n * log(n))
这会产生
A * D(n*p * log(n*p)) + C <= D*(n * log(n))
查看更高阶的术语,结果为
A*D*p <= D
因此,如果A*p <= 1
有效,则 T(n)=O(n log n)
。
在特殊情况下A<=1
我们可以做得更好,并证明 T(n)=O(log n)
:
T(n) <= D log(n)
产量
A * D(log(n*p)) + C <= D*(log(n))
查看更高阶的术语,结果为
A * D * log(n) + C + A * D *log(p) <= D * log(n)
从D
和n
开始,A<=1
和log(p)<0
足够大。
否则,如果A*p>1
,让我们找到q
的最小值T(n)=O(n^q)
。我们尝试找到最小q
,以便存在D
T(n) <= D n^q
这会产生
A * D p^q n^q + C <= D*n^q
查看更高阶的术语,结果为
A*D*p^q <= D
满足此要求的最小q
由
A*p^q = 1
因此,我们对 T(n)=O(n^q)
q = - log(A) / log(p)
得出结论。
现在,给定T(n) = A T(n*p) + B n^a + C
,A,B,C>0
和p<1
,尝试为某些T(n)=O(n^q)
证明q
。我们尝试找到最小q>=a
,以便对某些D>0
,
T(n) <= D n^q
这会产生
A * D n^q p^q + B n^a + C <= D n^q
尝试q==a
,只有在
ADp^a + B <= D
即。如果 T(n)=O(n^a)
,则 Ap^a < 1
。
否则我们会像以前一样到达Ap^q = 1
,这意味着 T(n)=O(n^q)
q = - log(A) / log(p)
。