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

2019 年 8 月 20 日
 OpenSSH

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

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

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

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

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

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

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

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

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

https://study.congcong.us/t/593353

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

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

© 2021 V2EX