Java 使用递归实现编辑距离方法会导致对象堆错误 private static int editDistance(ArrayList s1,ArrayList s2){ 如果(s1.size()==0){ 返回s2.size(); } else if(s2.size()==0){ 返回s1.size(); } 否则{ 字符串temp1=s1.remove(s1.size()-1); 字符串temp2=s2.remove(s2.size()-1); if(temp1.等于(temp2)){ 返回editDistance((ArrayList)s1.clone(),(ArrayList)s2.clone(); }否则{ s1.添加(临时1); int first=editDistance((ArrayList)s1.clone(),(ArrayList)s2.clone())+1; s2.添加(临时2); s1.移除(s1.尺寸()-1); int second=editDistance((ArrayList)s1.clone(),(ArrayList)s2.clone())+1; s2.移除(s2.大小()-1); int third=editDistance((ArrayList)s1.clone(),(ArrayList)s2.clone())+1; 如果(首先
在方法的每次递归调用之前,您Java 使用递归实现编辑距离方法会导致对象堆错误 private static int editDistance(ArrayList s1,ArrayList s2){ 如果(s1.size()==0){ 返回s2.size(); } else if(s2.size()==0){ 返回s1.size(); } 否则{ 字符串temp1=s1.remove(s1.size()-1); 字符串temp2=s2.remove(s2.size()-1); if(temp1.等于(temp2)){ 返回editDistance((ArrayList)s1.clone(),(ArrayList)s2.clone(); }否则{ s1.添加(临时1); int first=editDistance((ArrayList)s1.clone(),(ArrayList)s2.clone())+1; s2.添加(临时2); s1.移除(s1.尺寸()-1); int second=editDistance((ArrayList)s1.clone(),(ArrayList)s2.clone())+1; s2.移除(s2.大小()-1); int third=editDistance((ArrayList)s1.clone(),(ArrayList)s2.clone())+1; 如果(首先,java,recursion,heap,dynamic-programming,edit-distance,Java,Recursion,Heap,Dynamic Programming,Edit Distance,在方法的每次递归调用之前,您clone()每个ArrayList实例。这本质上意味着您将获得整个列表及其每次调用的内容的另一个副本-它可以轻松地为大递归深度添加大量内存 你应该考虑使用而不是克隆(),甚至向方法中添加参数,以便将索引向下传递到一组初始列表对象。乍一看,我会说您的递归不会终止这是由于克隆列表。最好传递两个索引,并在每次递归调用中适当地增加它们。@Jochen我已经测试了lists的长度很小,例如10,它可以工作。无法为对象堆保留足够的空间表明您没有内存不足-但您尝试保留足够的空间。
clone()
每个ArrayList
实例。这本质上意味着您将获得整个列表及其每次调用的内容的另一个副本-它可以轻松地为大递归深度添加大量内存
你应该考虑使用而不是<代码>克隆(),甚至向方法中添加参数,以便将索引向下传递到一组初始
列表
对象。乍一看,我会说您的递归不会终止这是由于克隆列表。最好传递两个索引,并在每次递归调用中适当地增加它们。@Jochen我已经测试了lists的长度很小,例如10,它可以工作。无法为对象堆保留足够的空间
表明您没有内存不足-但您尝试保留足够的空间。您有什么环境?是嵌入式系统吗?@khachik好主意!我会试试。无论是否克隆列表,这种递归解决方案似乎都不可行不管怎样,都会导致相同的堆错误。我想我会使用动态编程技术。
private static int editDistance(ArrayList<String> s1, ArrayList<String> s2) {
if (s1.size()==0) {
return s2.size();
}
else if (s2.size()==0) {
return s1.size();
}
else {
String temp1 = s1.remove(s1.size()-1);
String temp2 = s2.remove(s2.size()-1);
if (temp1.equals(temp2)) {
return editDistance((ArrayList<String>)s1.clone(),(ArrayList<String>)s2.clone());
} else {
s1.add(temp1);
int first = editDistance((ArrayList<String>)s1.clone(),(ArrayList<String>)s2.clone())+1;
s2.add(temp2);
s1.remove(s1.size()-1);
int second = editDistance((ArrayList<String>)s1.clone(),(ArrayList<String>)s2.clone())+1;
s2.remove(s2.size()-1);
int third = editDistance((ArrayList<String>)s1.clone(),(ArrayList<String>)s2.clone())+1;
if (first <= second && first <= third ) {
return first;
} else if (second <= first && second <= third) {
return second;
} else {
return third;
}
}
}
}