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

Time complexity 时间复杂度:简单的循环计算,time-complexity,Time Complexity,我有这样一个简单的循环: for (int i = 0; i < n; i++) { // constant time operation } for(int i=0;i

我有这样一个简单的循环:

for (int i = 0; i < n; i++) {
  // constant time operation
}
for(int i=0;i
很容易看出它的时间复杂度是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
比较(
i据我所知,递增/递减被视为一个单独的操作。这是有意义的,因为在汇编中,您可以使用一行汇编代码执行递增或递减。此外,大多数汇编代码行直接转换为一条二进制指令。因此,递增/递减实际上是一个常量t输入法操作

因此,我们有n个递增操作。我们还运行循环体n次,循环体执行常数时间操作,因此我们有一个额外的c*n操作。当我们第一次进入循环时,有一个额外的赋值操作。这会产生另一个操作。最后,在循环运行n次之后第次,循环再次检查循环的条件。这意味着循环执行n+1比较


把这些加起来,我们有n+c*n+1+(n+1)=2*n+c*n+2,这就是你所看到的答案。

从我所知,递增/递减被视为一个单独的操作。这是有意义的,因为在汇编中,你可以用一行汇编代码执行递增或递减。此外,大多数汇编代码行直接转换为一条二进制指令。因此,我递增/递减实际上是一种恒定时间操作

因此,我们有n个递增操作。我们还运行循环体n次,循环体执行常数时间操作,因此我们有一个额外的c*n操作。当我们第一次进入循环时,有一个额外的赋值操作。这会产生另一个操作。最后,在循环运行n次之后第次,循环再次检查循环的条件。这意味着循环执行n+1比较

把这些加起来,我们有n+c*n+1+(n+1)=2*n+c*n+2,这就是你看到的答案

2
c*n