读书人

帮忙比较一下这两个程序的运行时间!解

发布时间: 2012-03-24 14:00:47 作者: rapoo

帮忙比较一下这两个程序的运行时间!!!!!
几乎是一样的程序,只是第二个用了vector,为什么就超时了,而没用vector的就没超时?vector影响有那么大吗?
http://acm.hdu.edu.cn/showproblem.php?pid=1024

C/C++ code
//这是网上的代码,引用一下,不侵权吧?呵呵…………#include<iostream>using namespace std;int f[1000003];int best[2][1000003];int N, M;int a[1000003];int sum[1000003];int main() {    while (scanf("%d%d", &M, &N) != EOF) {        int ans = -2000000000;        sum[0] = 0;        for (int i = 1; i <= N; i++) {            scanf("%d", &a[i]);            sum[i] = sum[i - 1] + a[i];        }        for (int i = 0; i <= N; i++) best[0][i] = 0;        int cur = 0;        for (int j = 1; j <= M; j++) {            for (int i = 0; i <= j - 1; i++) best[1 - cur][i] = -2000000000;            for (int i = j; i <= N; i++) {                if (j == i) f[i] = sum[i];                else f[i] = max(best[cur][i - 1], f[i - 1]) + a[i];                best[1 - cur][i] = max(best[1 - cur][i - 1], f[i]);                if (j == M) ans = max(ans, f[i]);            }            cur = 1 - cur;        }        printf("%d\n", ans);    }    return 0;}

C/C++ code
//几乎是上面的代码翻译过来的#include <iostream>#include <vector>using namespace std;int main(){    int m, n;    vector<int> s;    while(cin>>m>>n){        int temp, cur = 0;        int ans = -2000000000;        vector<int> sum(n+1,0);        s.push_back(0);        for(int i=1; i<=n; i++){            cin>>temp;            s.push_back(temp);            sum[i] = sum[i-1]+temp;        }        vector<int> v(n+1);        vector<vector<int> > a;        a.push_back(v);        a.push_back(v);        for(int i=1; i<=m; i++){            for(int k=0; k<i; k++)                a[1-cur][k] = -2000000000;            for(int j=i; j<=n; j++){                if(j==i) v[j] = sum[j];                else v[j] = max(a[cur][j-1], v[j-1])+s[j];                a[1-cur][j] = max(a[1-cur][j-1], v[j]);                if(i==m) ans = max(ans, v[j]);            }            cur = 1-cur;        }        cout<<ans<<endl;        s.clear();    }    return 0;}


[解决办法]
系统处理数组比vector要快很多吧
[解决办法]
vector 就是大小"可变"的数组。
在大小变动的过程中可能需要搬动,或者复制数组中的元素。
这当然是需要花费时间的。

[解决办法]
用vector等容器肯定不及数组来得效率。vector一个包装过的动态数组,用着简单,对系统却更加繁琐。
能直接用数组肯定直接用呗。
[解决办法]
不是!!!

第二个程序超时的原因是你用了cin, cout;而不是你用了vector
改成这样就能过了
C/C++ code
#include <iostream>#include <vector>using namespace std;int main(){    int m, n;    vector<int> s;    while(EOF != scanf("%d %d", &m, &n))    {        int temp, cur = 0;        int ans = -2000000000;        vector<int> sum(n+1,0);        s.push_back(0);        for(int i=1; i<=n; i++)        {            scanf("%d", &temp);            s.push_back(temp);            sum[i] = sum[i-1]+temp;        }        vector<int> v(n+1);        vector<vector<int> > a;        a.push_back(v);        a.push_back(v);        for(int i=1; i<=m; i++)        {            for(int k=0; k<i; k++)                a[1-cur][k] = -2000000000;            for(int j=i; j<=n; j++)            {                if(j==i)                     v[j] = sum[j];                else                     v[j] = max(a[cur][j-1], v[j-1])+s[j];                a[1-cur][j] = max(a[1-cur][j-1], v[j]);                if(i==m)                    ans = max(ans, v[j]);            }            cur = 1-cur;        }        printf("%d\n", ans);        s.clear();    }    return 0;} 


[解决办法]
在最不利的情况下,cin,cout与scanf,printf的效率可以会相差10倍左右
vector与普通的一维数组的效率一般只相差5%左右(前提是vector用得好)
非一维数组的效率差别可能会大一点
因为多维普通数组在内存中是连续存储的,而vector模拟的多维数组却不是连续存储的

以前看过一篇文章是这样说的,
至于是否正确,我就没有认真研究过了
[解决办法]
在最不利的情况下,cin,cout与scanf,printf的效率可以会相差10倍左右

可能会相差10倍左右

读书人网 >软件架构设计

热点推荐