对时间复杂度的误解?
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
我不确定为什么。任何帮助理解都会很棒!
此外,是否有一种方法可以帮助实现其他常见的复杂性?
例如:
- n
- logn
- n 日志 n
- n2(二的幂)
- n3(三的幂)
- 2n(n 的幂)
是的,他的回答是正确的。时间复杂度为2n.
在此示例中,for 循环将为某个值 n 运行。无论是 运行s 从 1 到 12 还是 1 到 1000 都没有关系,因为无论 n 是什么值,for 循环都会在达到其限制 n 后结束执行。
他的回答中的 2,时间复杂度 = 2n,是因为有两个 for 循环将在这个示例执行完毕后执行。
检查此 article。它提供了一些非常直接的解释
有一次我和我的教授就这个话题进行了一次非常有趣的讨论。我在一家非常酷的公司工作,该公司使用 beowulf 集群进行热建模。非常非常计算密集。我的教授说,如果我可以从 4n^2
到 2n^2
取一个函数,我的老板会不高兴的。但如果我能把它从 4n^2
提高到 4n
他会很高兴。我举手说,如果我能将时间缩短一半,我的老板会非常非常高兴。她说不,他只会对一个数量级的改进感到满意——相同数量级的线性改进是无关紧要的。
那天我给老板打了电话。他说如果我能把 运行 时间减半,他会带我回家,给我双倍的工资,并请我吃一年的牛排晚餐。
有时知道系数是什么很重要。其他时候则不然。所以你是绝对正确的,在处理这些代码片段的复杂性顺序时,4n
或 10000n
或 n
都是相同的 - 它们是 O(n)
.
顺便说一句,他可能使用 2n
而不是 n
因为在第二个循环中有两次查找,而第一个循环(运行 是一个常数次)只有 1 次查找。
所以如果他说 "Time complexity is 2n" 他是对的。如果他说 "Time complexity is O(2n)" 他是不正确的 - O(...) 意味着非常具体的东西,并且没有系数。
我的问题
我目前正在学习时间复杂度,我看到了以下示例来解决时间复杂度:
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 我不确定为什么。任何帮助理解都会很棒!
此外,是否有一种方法可以帮助实现其他常见的复杂性?
例如:
- n
- logn
- n 日志 n
- n2(二的幂)
- n3(三的幂)
- 2n(n 的幂)
是的,他的回答是正确的。时间复杂度为2n.
在此示例中,for 循环将为某个值 n 运行。无论是 运行s 从 1 到 12 还是 1 到 1000 都没有关系,因为无论 n 是什么值,for 循环都会在达到其限制 n 后结束执行。
他的回答中的 2,时间复杂度 = 2n,是因为有两个 for 循环将在这个示例执行完毕后执行。
检查此 article。它提供了一些非常直接的解释
有一次我和我的教授就这个话题进行了一次非常有趣的讨论。我在一家非常酷的公司工作,该公司使用 beowulf 集群进行热建模。非常非常计算密集。我的教授说,如果我可以从 4n^2
到 2n^2
取一个函数,我的老板会不高兴的。但如果我能把它从 4n^2
提高到 4n
他会很高兴。我举手说,如果我能将时间缩短一半,我的老板会非常非常高兴。她说不,他只会对一个数量级的改进感到满意——相同数量级的线性改进是无关紧要的。
那天我给老板打了电话。他说如果我能把 运行 时间减半,他会带我回家,给我双倍的工资,并请我吃一年的牛排晚餐。
有时知道系数是什么很重要。其他时候则不然。所以你是绝对正确的,在处理这些代码片段的复杂性顺序时,4n
或 10000n
或 n
都是相同的 - 它们是 O(n)
.
顺便说一句,他可能使用 2n
而不是 n
因为在第二个循环中有两次查找,而第一个循环(运行 是一个常数次)只有 1 次查找。
所以如果他说 "Time complexity is 2n" 他是对的。如果他说 "Time complexity is O(2n)" 他是不正确的 - O(...) 意味着非常具体的东西,并且没有系数。