在一个循环里进行多个操作,和在多个循环里进行一个操作,在时间复杂度上,有区别吗?

2019-08-20 08:10:01 +08:00
 OpenSSH

如果是在同一个循环里,复杂度是 O(n)

但是如果分开多个循环,复杂度是不是还是 O(n)?

int a = 1000;
while(a > 0) {
    // 操作 1
    // 操作 2
    // 操作 3
    a--;
}

如果把这 3 个操作,分别写在 3 个循环里,在时间复杂度上,是一样的吧?

2970 次点击
所在节点    问与答
27 条回复
tigerfyj
2019-08-20 08:14:27 +08:00
多做了 2000 次 a--,不算什么事吧。更多还是要考虑可读性哪种更好。
OpenSSH
2019-08-20 08:20:38 +08:00
@tigerfyj #1 所以其实是一样的是吧?影响可以忽略不计。
hauibojek
2019-08-20 08:43:54 +08:00
不太了解算法,感觉不一样。时间复杂度和遍历次数有关
ranleng
2019-08-20 08:47:12 +08:00
执行次数
一个是 n
一个是 3n

所以时间复杂度都是 o ( n )
(应该没说错
passerbytiny
2019-08-20 08:47:31 +08:00
首先,下面两端代码是牛头不对马嘴的毫不相干的两段代码。
while(a > 0) {
// 操作 1
// 操作 2
// 操作 3
a--;
}

while(a > 0) {
// 操作 1
a--;
}
while(a > 0) {
// 操作 2
a--;
}
while(a > 0) {
// 操作 3
a--;
}
ebingtel
2019-08-20 08:52:27 +08:00
对于这个效果不太明显,换成遍历链表之类的试试
mogami95
2019-08-20 08:54:24 +08:00
取决于伪代码 a--的实际成本
taaaang
2019-08-20 08:56:56 +08:00
遍历本身是有开销的
msg7086
2019-08-20 08:57:19 +08:00
复杂度是性能的增长量级描述,循环方式没有关系的。
OpenSSH
2019-08-20 08:57:42 +08:00
@passerbytiny #5 请问然后呢?

@ebingtel #6 对,如果是链表,肯定会比数组更耗时间。
20015jjw
2019-08-20 09:00:14 +08:00
带一句可能没关系的
loop unrolling
taogen
2019-08-20 09:07:09 +08:00
算法复杂度一样,性能差距可以忽略。一定要分出胜负的话,我觉得一个循环更优,毕竟少了两个 a--操作。🐶
Building
2019-08-20 09:13:38 +08:00
没有区别。
churchmice
2019-08-20 09:24:01 +08:00
@taogen 还要考虑缓存命中率
everydiao
2019-08-20 09:25:01 +08:00
没有区别
pkookp8
2019-08-20 09:27:39 +08:00
楼主又没问效率
算法上,o(3n)等于 o(n)
x7395759
2019-08-20 09:40:09 +08:00
o(3n) = o(n)
wdf86
2019-08-20 09:56:47 +08:00
记得《深入理解计算机系统》里有一节讲的循环展开,可以参考下
Raymon111111
2019-08-20 09:59:06 +08:00
算法复杂度上讲没区别
Aruforce
2019-08-20 11:05:03 +08:00
@mogami95 #7
1K 操作 1+1k 操作 2+1k 操作 3+1Ka-- < 1K 操作 1+1k 操作 2+1k 操作 3+3Ka--
差了 2Ka-- 呢... 这还用考虑什么....

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/593353

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX