在解决算法问题的时候,空间换时间是最容易看的到,也容易达到效果的一种手段,那么下面就来总结一下有哪些情况可以用来空间换时间。
1.双重循环。
复杂度是O(N)*O(M)
for(auto i:vector1)
for(auto j:vector2)
if(j==i)
...
这种情况就可以把vector1里的数存到一个unordered_set里,这样遍历一次vector2,只需要O(N)的时间即可实现先相同的效果。
2.二维数组
比如经典的矩形面积问题,如果枚举所有二维数组的面积,复杂度是o(N^2)*(M^2)
for(int i=0;i<n;++i){
for(int j=i+1;i<n;++j){
for(int p=0;p<m;++p){
for(int q=p+1;q<m;++q){
caculate(i,j,m,q);
}
}
}
}
但要是提前把从上角到任何一个点的矩形面积求出来保存在O(M)*O(N)的二维数组里,caculate操作就能早O(1)时间内完成。当然这题还能再优化,但我想表明的是,空间换时间是来的最快的。
3.vector装整数
vector是一种随机数组,它最神奇的地方是下标也可以用来表示信息。所以在遇到使用vector<int>给整肃装箱然后求证书中特定值的时候,不妨不用无顺序的push_back(i);改用vector[i]++;
vector work(100000,0);
for(int i=0;i<n;++i){
vector[i]++;
}
这样做的坏处是增大了vector的内存占用,但好处是里面的数据天然有序,因为用的是下标来表示所指数据的。