很多时候我处理这类代码:
vector<int>prev,cur;
for(i=1;i<n;i++){
//do some operation on cur based on prev vector
prev = cur;
cur.clear();
}
是否有时间复杂度改进的范围?因为clear的时间复杂度就其元素而言是线性的(称为容器析构函数),是否有任何方法可以通过任何其他方法在O(1)或更短的时间内执行此操作?我应该使用指向矢量的指针然后更改指针以执行
prev = cur
答案 0 :(得分:1)
1)你当前的做法需要一个元素的副本(即O(n))和cur的清除(原则上O(n)调用析构函数,但这不应该是性能问题基本类型,例如示例中的int
。
2)swap()
在他的评论中推荐的 bhzad.nouri 交换了两个向量的元素。从性能的角度来看,你可以想象这有点像交换指针。无论如何真正实现,交换都是在恒定时间内完成的。在交换之后,您仍然拥有cur
中的数据,因此您可能需要clear()
它。
3)指向矢量的指针看起来很难看。矢量交换在性能方面取得了相同的结果,而且更加优雅!
答案 1 :(得分:0)
我的建议是在swap上使用移动语义:
for(i=1;i<n;i++){
//do some operation on cur based on prev vector
prev = std::move(cur);
cur.clear();
}