多赋值一次?.fjx

论 a = a + b 和 a += b 的区别继续讨论:

从上面的例子中我们看到,a = a + b 超时,a += b 却没有超时
那我们来分析一下原因:
TLE是超时,而两处代码除了赋值没有其他区别
那肯定是这处超时(好像有点废话
那为什么这里超时了呢:
两处都是一样的效果,那也就是a = a + b赋值多了一次
那又双叒叕是为什么呢?
推理一下:
a = a + b是绝对的赋值,其逻辑是:
a 加上 b,得到一个新的值,再将a赋值为这个新的值
a += b不完全是赋值,其逻辑是:
a 直接加上 b
由此可见,a += b少一个步骤,其时间复杂度肯定相对较小
所以建议大家再这种赋值的时候++--+=-=/=*=%=^=……等等

那也没差到这种地步啊

一个15ms,一个1.2s

@金杭东 相差这么多!

一个残酷的现实:
ab 都为 string 类型时,a = a + b 的时间复杂度为 O(\text{len}(a)+\text{len}(b)),而 a += b 的时间复杂度为 O(\text{len}(b))

2 个赞

其实你可以 for (char &ch : b) a.push_back(ch); 这样也是 \mathcal O(\text{len}(b))