论空间换时间

在解决算法问题的时候,空间换时间是最容易看的到,也容易达到效果的一种手段,那么下面就来总结一下有哪些情况可以用来空间换时间。
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的内存占用,但好处是里面的数据天然有序,因为用的是下标来表示所指数据的。

猜你喜欢

转载自blog.csdn.net/qq_36946274/article/details/80947447