首页 文章

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

提问于
浏览
2

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

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

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

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

1 回答

  • 2

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

    也就是说, DP[0] "calls" DP[2] 例如, DP[1] 也是如此 . 在第二次调用 DP[2] 时,没有必要再次计算它,您只需返回memoized值 .

    这也使得验证该算法的多项式上界变得容易 . 由于每个 DP[i] 将执行O(n)操作,并且它们有 n ,因此整体算法为O(n ^ 2),当然假设 badness(i, j) 是O(1) .

相关问题