我在为以下代码计算Big O时遇到问题。我永远不是最聪明的饼干。 有人可以解释一下吗。由于嵌套循环,我的猜测是O(N ^ 2),但我知道它还有更多。
static inline int f1 (int a, int b)
{
for (int c = 0; c < b; c++)
{
a -= n;
}
return a;
}
int f2 (int n)
{
int r = n * n * n;
for (double i = n; i >= 0; i -= 2)
{
r = f1(r, i);
}
return r;
}
答案 0 :(得分:3)
首先,请注意f1的运行时纯粹依赖于第二个参数,该参数控制循环迭代的次数。因此,它的运行时间在第二个参数中是线性的。
接下来,注意f2中的循环运行n / 2次,i取值0,2,4,6,...,n。由于i是f1的第二个参数,因此运行时由
给出0 + 2+ 4+ ... + n
= 2(0 + 1+ 2+ .. + n)
=2Θ(n ^ 2)
=Θ(n ^ 2)
所以运行时间是Θ(n ^ 2)。请注意,几乎所有其他内容都会分散注意力,误导您。纯粹关注控制迭代和循环的变量会显示出您需要关注的实际逻辑。
希望这有帮助!
答案 1 :(得分:1)
请尝试以避免不惜一切代价浮动/加倍作为循环计数器,因为它们不准确。使用size_t或任何其他int类型。此外,就我可以从你的代码中告诉你,无论如何你将我从double转换为int,所以那里不需要那个双倍。
您的循环可以这样写:
int r = n * n * n;
for (double i = n; i >= 0; i -= 2)
{
for (int c = 0; c < i; c++)
{
r -= n;
}
}
外环:O(n / 2) - 它在每个步骤“跳跃”2个单位=&gt;操作次数为n / 2
内循环:O(n / 2) - 从技术上讲,它迭代到i,但是因为我的最大值是n / 2而内循环是1乘1 =&gt;复杂性是相同的n / 2
整体复杂度:O((n / 2)^ 2)
<强>更新强>
正如其他人所说,是的,你可以折叠常数部分(在这种情况下为“/ 2”),但在我看来,它比我最初发布的更清晰。希望也有帮助。
答案 2 :(得分:0)
从数学上讲,你可以像下面那样正式着手:
其中op是在f1()
中执行的常量时间 op 次数。
我可以为op'
添加f2()
或类似内容,但这似乎没必要。
要计算操作次数,比如T(10),只需让op = 1
。