当我们必须计算循环的复杂性时说FOR循环(表示需要运行n次),我们是否还要在FOR循环条件失败并且它中断时计算迭代次数?
以下是一个例子:
i
和n
是正整数
for(i=0;i<n;i++)
{
//some code. All are constant expressions and there are no break statements.
}
现在内部代码将运行0到n-1次,这是n次。当i = n时,循环中断,但只有在检查for循环条件后才会发生这种情况。这个最后的检查应该计算时间复杂度,因为如果它被计算,那么FOR循环实际上将运行n + 1次?我不确定我在这里是否有意义。我想应该算一算。我仍然需要一些明确的答案。请提出建议!
答案 0 :(得分:3)
如果你真的需要确切,请介绍一些常量。让a
成为检查循环条件一次和b
时间来运行循环中所有命令的时间。循环将在以下总时间内运行:
a(n+1) + bn = (a+b)n + a
由于其他答案所解释的原因,你很少需要这么精确。当n
比a
大得多时,a
一次与大局无关。这就是为什么我们放弃所有低阶项和常量并说:
(a+b)n + a ∈ Θ(n)
答案 1 :(得分:1)
计算函数计算复杂性的要点是确定该函数是否会随着 n 的增加而扩展,而不是为的特定值运行多少次ñ。例如,当 n 为1时,你的循环可以非常快地运行,但是如果n突然是1000,它会在(大约)1000x原始时间内运行,还是你看起来要高得多? / p>
你给的那个for循环总会运行 - 最坏的情况 - n 次。无论 n 是100还是10 ^ 30,循环都将涉及 n 次迭代。考虑到更大的图景,对该循环的额外比较是无关紧要的;如果你正在处理10 ^ 30次迭代,那么一次额外的迭代就不会有任何区别。
答案 2 :(得分:1)
如前所述,时间复杂度是渐近的 - 这意味着如果你有一个从1到n的循环
你在循环中做了多少操作并不重要 - 只要它们是最终的,复杂性将是O(n)
,因为O(10000n) = O(n)
答案 3 :(得分:0)