编辑距离优化--二维数组转一维数组

来源:互联网 发布:软件开发工程师月薪 编辑:程序博客网 时间:2024/05/16 19:39

之前的编辑距离小练习我一直是用二维数组去记录的,而经神学弟提醒改用了一维数组去优化,发现果然好了很多。

对比我之前的编辑距离小练的文章,这里再发一次优化后代码。

POJ3356 AGTC

如图是两次代码的提交对比:


发现时间减了不少,调用内存减得更多。。。所以优化成功。。。

#include<iostream>#include<string>#include<cstring>using namespace std;int dp[1001];//一维数组int main(){    int a,b,i,j,c,w,tmp;    string x,y;    while(cin>>a>>x>>b>>y)    {        for(i=0; i<=b; ++i)//初始化        {            dp[i]=i;        }        for(i=0; i<a; ++i)        {            w=dp[0];            dp[0]=i+1;            for(j=0; j<b; ++j)            {                tmp=dp[j+1];                if(x[i]==y[j])                {                    dp[j+1]=w;                }                else                {                    dp[j+1]=min(w,min(dp[j+1],dp[j]));                    dp[j+1]++;                }                w=tmp;            }        }        cout<<dp[b]<<endl;    }    return 0;}

HDU4323 Magic Number

提交结果如下图:


上面的为未优化,下面的为优化后。而且都是G++提交AC。。。之前的提交G++TLE,C++AC,而且耗时较多。主要我之前一直没加上判断长度。

代码一:加上了判断长度*,没有数组优化。

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include<cmath>using namespace std;int dp[1505][1505];char x[1505][1005],y[1005];int main(){    int a,b,i,j,c,t,k,l,p,s,n,m,cas=0,l1,l2[1505];    scanf("%d",&t);    while(t--)    {        cas++;        printf("Case #%d:\n",cas);        scanf("%d%d",&n,&m);        for(i=0; i<n; ++i)        {            scanf("%s",x[i]);            l2[i]=strlen(x[i]);        }        while(m--)        {            s=0;            scanf("%s%d",y,&k);            l1=strlen(y);            for(j=0; j<n; ++j)            {                if(abs(l1-l2[j])>k)//*判断长度                {                    continue;                }                //memset(dp,0,sizeof(dp));                for(l=0; l<=l2[j]; ++l)                {                    dp[l][0]=l;                }                for(l=0; l<=l1; ++l)                {                    dp[0][l]=l;                }                for(l=0; l<l2[j]; ++l)                {                    for(p=0; p<l1; ++p)                    {                        c=(x[j][l]!=y[p]);                        dp[l+1][p+1]=min(dp[l][p]+c,min(dp[l+1][p]+1,dp[l][p+1]+1));                    }                }                if(dp[l2[j]][l1]<=k)                {                    s++;                }            }            printf("%d\n",s);        }    }    return 0;}

代码二:加上了数组优化。

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include<cmath>using namespace std;int dp[11];//一维数组char x[1505][10],y[11];int main(){    int a,b,i,j,c,t,k,l,p,s,n,m,cas=0,l1,l2[1505],tmp,w,kk;    scanf("%d",&t);    while(t--)    {        cas++;        printf("Case #%d:\n",cas);        scanf("%d%d",&n,&m);        for(i=0; i<n; ++i)        {            scanf("%s",x[i]);            l2[i]=strlen(x[i]);        }        while(m--)        {            s=0;            scanf("%s%d",y,&kk);            l1=strlen(y);            for(j=0; j<n; ++j)            {                if(abs(l1-l2[j])>kk)/长度判断                {                    continue;                }                for(l=0; l<=l1; ++l)                {                    dp[l]=l;                }                for(l=0; l<l2[j]; ++l)                {                    w=dp[0];                    dp[0]=l+1;                    for(k=0; k<l1; ++k)                    {                        tmp=dp[k+1];                        if(x[j][l]==y[k])                        {                            dp[k+1]=w;                        }                        else                        {                            dp[k+1]=min(w,min(dp[k+1],dp[k]));                            dp[k+1]++;                        }                        w=tmp;                    }                }                if(dp[l1]<=kk)                {                    s++;                }            }            printf("%d\n",s);        }    }    return 0;}

两次对比,发现自己还是很水啊。。。。


原创粉丝点击