编辑非常大输入的距离动态编程
Edit Distance Dynamic Programing for very large input
我正在解决众所周知的编辑距离动态编程问题。实际上,这个问题是给两个字符串string1和string2的,考虑到删除、插入和替换字符的成本,我必须以最小的成本将string1转换为string2。对于DP,我必须使用二维数组。对于较小的字符串(大小<=10000),我的代码可以工作,但对于较大的输入(大小>=100000),编译器会说"数组大小太大"。如果必须使用动态编程(输入大小=100000)来解决此问题,请告诉我应该如何处理此错误。这是我的密码。
#include <iostream>
#include <cstdio>
#include <stdlib.h>
#include <algorithm>
#include <map>
#include <queue>
#include <iomanip>
#include <string>
#include <math.h>
#include <limits>
#include <map>
#include <float.h>
#include <limits.h>
#include <string.h>
using namespace std;
#define rep(i,a,N) for(int i=a;i<N;++i)
int DP[10000][10000],delete_cost,add_cost,replace_cost;
string first,second;
int Min(int x,int y,int z){
int min=x<y?x:y;
min=min<z?min:z;
return min;
}
int Transform(int i,int j){
if(DP[i][j]!=-1){
//printf("DP is setn");
return DP[i][j];
}
if(i==first.size())
return (second.size()-j)*add_cost;
if(j==second.size())
return (first.size()-i)*delete_cost;
if(first.at(i)!=second.at(j)){
int add,del,rep;
add=Transform(i,j+1)+add_cost;
del=Transform(i+1,j)+delete_cost;
rep=Transform(i+1,j+1)+replace_cost;
return DP[i][j]=Min(add,del,rep);
}
else
return DP[i][j]=Transform(i+1,j+1);
}
int main(){
int T,a,b,k,ans;
scanf("%d",&T);
while(T--){
memset(DP,-1,sizeof(DP));
cin>>first;
cin>>second;
scanf("%d %d %d",&a,&b,&k);
add_cost=a;
delete_cost=b;
replace_cost=k;
//ans=Transform(0,0);
//if(ans<=k)
printf("%dn",ans );
//else
// printf("%dn",-1);
}
return 0;
}
没错,因为32位整数的100000 * 100000
数组占用40 GB的内存。你需要使用不同的算法。如果您只需要计算某个最大k
的编辑距离,则有一个经典算法的修改版本,它只使用O(n * (2k + 1))
存储(其中n
是字符串长度),因为它只使用动态编程矩阵的中间2k + 1
对角线。
相关文章:
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- C++中的动态铸造故障
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 控制允许动态运行c++的并发操作数
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 输出没有重复元素的动态数组(收缩数组)C++
- C++为线程工作动态地分割例程
- 正在插入动态数组
- 在c++中使用动态分配的问题
- C++中的动态对象与非动态对象
- 如何在动态数组上使用搜索函数
- 视觉studo 2019中的漫画和静态/动态绑定
- 从C++中的数字输入动态创建矩阵
- 如何从QToolBox中动态创建的QLineEdit中获取文本
- 编辑非常大输入的距离动态编程