这种文本理由的动态编程解决方案只是暴力吗?

时间:2016-01-05 22:46:45

标签: algorithm dynamic-programming

我无法理解麻省理工学院开放课件讲座here中指定的文本对齐问题的动态编程解决方案。该讲座的一些注释是here,注释的第3页就是我所指的。

我认为动态编程意味着你会记住一些计算,这样你就不需要重新计算,从而节省你的时间,但是在演讲中给出的算法中,我没有看到任何用途memoization,只是一大堆深度递归调用,即主要功能是:

DP[i] = min(badness (i, j) + DP[j] for j in range (i + 1, n + 1))
DP[n] = 0

其中badness是一个函数,用于确定从行长度中减去单词长度后未使用空间量。对我来说,这个算法似乎计算了所有可能的"不良"计算并选择最小的一个,这对我来说似乎是蛮力。动态编程通常通过记忆过去的计算给我们带来什么好处,所以我们不必重新计算?

1 个答案:

答案 0 :(得分:2)

如果您记住结果,则不必多次计算每个DP[i]

DP[0]"来电"例如DP[2],但DP[1]也是如此。在第二次调用DP[2]时,再次计算它是不必要的,您只需返回记忆值即可。

这也可以轻松验证此算法的多项式上限。由于每个DP[i]将执行O(n)操作,并且有n个,因此整体算法为O(n ^ 2),当然假设badness(i, j)为O (1)。