问题:
找出这个函数的复杂性(大theta):
s <-- 0;
i = 2;
while (i <= n^2) do
for j <-- i to 2i[ln(i)] do
s <-- s + i - j;
end
i <-- i + 2;
end
return (s);
我得到了大的theta(n ^ 2(ln(n)),因为for循环将运行2i [ln(i)] - i次,这将是ci [ln(i)]时间。然后我乘以它由n ^ 2,因为这是while循环的大致时间。
我用不同的方式解决了它并得到了大的theta(n ^ 4)。
我不确定我的任何一个答案是否正确,这是基于我对如何在循环依赖与独立时解决这些问题的困惑。
答案 0 :(得分:0)
最强大的解决方案是为2*(2i)*ln(i) - 2i + 1
求和2 <= i <= n^2/2
。我们有:
1 + 2 + ... + floor(n^2/2) = O(n^4)
鉴于:
1*ln(1) + ... + floor(n^2/2)*ln(floor(n^2/2)) = O(n^4*ln(n))
(不必考虑常数4
。)
事实上,你甚至可以使用comparison with an integral渐近地得到一个与你的和相等的表达式。
因此时间复杂度为O(n^4*ln(n))-O(n^4)+O(n) = O(n^4*ln(n))
。
没有MathJax编写数学是一种痛苦,here is a more detailed proof。