我有一个简单的循环,如下所示:
for (int i = 0; i < n; i++) {
// constant time operation
}
很容易看出它具有O(n(时间复杂性,但如果我们计算它,为什么它是2*n + 2 + c*n
(给定答案(而不是(1+ (n+1) + 2*n + c*n) = (3+c)*n + 2
?我把i++
看作两个操作:加法和赋值;因此,它应该是2*n
,并且常数运算被执行n
次,所以它是c*n
。
2*n
(n
比较(i<n
(+n
递增(i++
(== 2*n
2
(分配用i=0
1
+1
用于分配i
(== 2
c*n
(n
恒定时间操作(== c*n
据我所知,递增/递减被视为一个单独的操作。这是有意义的,因为在汇编中,您可以用一行汇编代码执行增量或减量。此外,大多数汇编代码行直接转换为单个二进制指令。因此,递增/递减实际上是一种恒定的时间操作。
因此,我们有n个来自递增的运算。我们还将循环体运行n次,循环体执行一个恒定时间运算,因此我们有一个额外的c*n运算。当我们第一次进入循环时,会有一个额外的赋值操作。这产生了另一个操作。最后,在循环运行第n次之后,循环再次检查循环的条件。这意味着循环执行n+1个比较。
把这些加起来,我们得到n+c*n+1+(n+1(=2*n+c*n+2,这就是你看到的答案。