编辑距离优化--二维数组转一维数组
来源:互联网 发布:软件开发工程师月薪 编辑:程序博客网 时间: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;}
两次对比,发现自己还是很水啊。。。。
- 编辑距离优化--二维数组转一维数组
- 编辑距离问题+滚动数组优化
- 二维数组转一维数组
- numpy计算两二维数组距离
- 51Nod 编辑距离 DP+滚动数组
- php ------ 二维数组转一维数组
- php二维数组转一维数组
- Java 二维数组转一维数组
- js二维数组转一维数组
- php经度 纬度距离计算 , php 二维数组排序
- BZOJ3594 二维树状数组优化DP
- [BZOJ3594]二维树状数组优化DP
- 二维数组
- 二维数组
- 二维数组
- 二维数组
- 二维数组
- 二维数组
- 用户体验分类
- Android的Touch事件处理机制介绍
- CC2530串口
- 2013.7.22
- RIP、OSPF、BGP认识
- 编辑距离优化--二维数组转一维数组
- More Effective C++:自增和自减
- Sprite Kit编程指南(1)-深入Sprite Kit
- LU分解求线型方程
- 启用Spring quartz定时器,导致tomcat服务器自动停止
- Linux学习笔记二
- linux硬链接与软链接
- Lagrange插值求解线性方程
- Android中的Handler总结