对时间复杂度的误解?

Misunderstanding of time complexity?

我的问题
我目前正在学习时间复杂度,我看到了以下示例来解决时间复杂度:

sum=0
for j=1 to 12
    add = add + figures[j]
average = add/12
print average

for x=12 to n-1{
 total = total - figures[x-11] + figures[x+1]
 average=total/12
 print average 
}

我的回答:时间复杂度=n Explanation/Thought 过程: 第一个循环执行 12 次,第二个循环执行 n-12 次。我相信时间复杂度是 'n' 因为 n-12+12=n 并且循环没有嵌套。

老师的回答:时间复杂度=2n 我不确定为什么。任何帮助理解都会很棒!

此外,是否有一种方法可以帮助实现其他常见的复杂性?

例如:

  1. n
  2. logn
  3. n 日志 n
  4. n2(二的幂)
  5. n3(三的幂)
  6. 2n(n 的幂)

是的,他的回答是正确的。时间复杂度为2n.

在此示例中,for 循环将为某个值 n 运行。无论是 运行s 从 1 到 12 还是 1 到 1000 都没有关系,因为无论 n 是什么值,for 循环都会在达到其限制 n 后结束执行。

他的回答中的 2,时间复杂度 = 2n,是因为有两个 for 循环将在这个示例执行完毕后执行。

检查此 article。它提供了一些非常直接的解释

有一次我和我的教授就这个话题进行了一次非常有趣的讨论。我在一家非常酷的公司工作,该公司使用 beowulf 集群进行热建模。非常非常计算密集。我的教授说,如果我可以从 4n^22n^2 取一个函数,我的老板会不高兴的。但如果我能把它从 4n^2 提高到 4n 他会很高兴。我举手说,如果我能将时间缩短一半,我的老板会非常非常高兴。她说不,他只会对一个数量级的改进感到满意——相同数量级的线性改进是无关紧要的。

那天我给老板打了电话。他说如果我能把 运行 时间减半,他会带我回家,给我双倍的工资,并请我吃一年的牛排晚餐。

有时知道系数是什么很重要。其他时候则不然。所以你是绝对正确的,在处理这些代码片段的复杂性顺序时,4n10000nn 都是相同的 - 它们是 O(n).

顺便说一句,他可能使用 2n 而不是 n 因为在第二个循环中有两次查找,而第一个循环(运行 是一个常数次)只有 1 次查找。

所以如果他说 "Time complexity is 2n" 他是对的。如果他说 "Time complexity is O(2n)" 他是不正确的 - O(...) 意味着非常具体的东西,并且没有系数。