时间复杂度:简单的循环计算



我有一个简单的循环,如下所示:

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=01+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,这就是你看到的答案。

最新更新