algorithm what (n)
begin
if n = 1 then call A
else
begin
what (n-1);
call B(n)
end
end.
在上面的程序中,我被要求找出时间复杂度,其中过程A花费O(1)时间,过程B花费O(1 / n)。
我形成了递归关系 T(n)= T(n-1)+ O(1 / n)
求解它,我得到T(n)= O(log n),因为如果使用反向替换方法求解它,并且得到时间复杂度来计算谐波序列之和为O(lgn),我们将得到谐波序列。但是答案是O(n)。我无法弄清楚他们是如何得到答案的。在解释中,他们为递归关系增加了一个常数n。我不明白为什么我们应该将常数乘以n。请帮助我理解这一点。
答案 0 :(得分:1)
这可能是作者/审查员提出的一个技巧问题,目的是吸引您。您必须注意,每次对O(1)
的调用中所涉及的what
操作(将参数推入堆栈等)使O(1/n)
的{{1}}复杂性变得黯淡无光–至少渐近地发言。因此,实际时间复杂度为B
,它给出了正确的答案。