【发布时间】:2011-03-06 22:39:16
【问题描述】:
我正在研究一种包含三个部分的算法。第一种是递归方法,它将单词以最小的代价包装到特定的长度。第二种是一种算法,它是递归方法的动态实现。最后一个是问题的贪心算法。我已经编写了贪婪的代码,但我在递归解决方案上苦苦挣扎。我不太确定我的递归方法到底在哪里遇到了问题,但我知道它应该类似于 Knuth-Plass 算法。递归算法应该具有阶乘运行时间,并且更多地用于帮助动态解决方案。如果有人有 Knuth-Plass 实现的链接或者可以在我的代码中发现一些巨大的东西,我们将不胜感激。
递归算法:
public static ArrayList<String> recursive(ArrayList<String> input, int size) {
if(input.size() <= 1)
return input;
ArrayList<String> temp1 = input;
ArrayList<String> temp2 = input;
for(int i = 0; i < input.size(); i++) {
if(input.size() - 1 >= size)
break;
else {
for(int j = 0; j < input.size(); j++) {
temp1.set(j, temp1.get(j) + " " + temp1.get(j + 1));
temp1.remove(j + 1);
if(totalPenalty(blankChars(temp1, size)) < totalPenalty(blankChars(temp2, size))) {
input = recursive(temp1, size);
} else {
input = recursive(temp2, size);
}
}
}
}
return input;
}
totalPenalty() 和 blankChars 返回每行末尾的罚款金额。
编辑:我仍然没有看到任何直接的解决方案。任何帮助将不胜感激。
【问题讨论】:
-
你为什么明确希望它是递归的?如果可以避免,递归是低效的编程。您最终可能会耗尽堆栈空间。
-
这是为了让我得到一个动态编程解决方案。基本上我正在尝试递归(糟糕的 big-O,但有助于转换为动态)>动态(更快且始终正确)>贪婪(并不总是正确)。如果这有意义的话。
-
@Chris Dennett:更准确地说,这种递归效率低下,因为:a)它是 Java b)无论如何都没有可以消除的尾调用。然而,即使在这种情况下,如果我们能保证输入相当小,递归也可以帮助我们更清楚地表达算法。
-
@hoha:谢谢你的澄清。
-
我必须承认我无法理解它应该如何工作。既然你不想使用 Knuth 的方法,你可以用伪代码或算法描述来更新问题文本吗?
标签: java algorithm recursion word-wrap