在开始之前,这不是一个问题,询问memoization和动态编程之间的区别,也不是哪一个更好,而只是一个简单的问题,询问它们处理缓存查找的方式之间的细微差别。 / p>
DP使用自下而上的方法,而memoization使用自上而下。因此,对于DP,您首先要构建一个缓存计算表,然后将这些缓存值提供给更大的计算,以避免冗余的递归或迭代函数调用。 Memoization或多或少只是将每个函数调用的结果缓存到散列或数组(可能是数组)中,然后在函数调用中提供结果(它只是跳过函数体内发生的任何事情)。
我的问题是我在这里说的是对的吗?两种方法看起来相似,与记忆相比,只有DP更难,内存效率更高。通过memoization,你的程序仍然必须触发每个函数调用,即使它被缓存,并且这些函数调用中的每一个都可以快速反馈堆栈,而在DP中它将检查函数中的数组表并且只调用递归/迭代函数,如果找不到它。
我在这里纠正吗?或者我错过了什么?
答案 0 :(得分:1)
好吧,我认为你基本上限制了“memoization”,这实际上只是存储以前计算结果而不是重新计算它们的任何技术。因此,存储所有结果直到先前的高 n 的斐波那契计算都是记忆,但是存储先前计算的子问题的DP算法也是如此。
(参见Wikipedia article。)
答案 1 :(得分:1)
动态编程和记忆不是相互排斥的,也不是不同的方法。 Memo-ization只是“记住”函数调用的结果及其所有相关上下文(参数,调用实例等)。动态编程使用memo-ization来实现仅计算给定子问题的结果一次的目标。
来自Wikipedia:
动态编程方法只寻求解决每个子问题 一次,从而减少计算次数:一旦解决了 给定子问题已被计算,它被存储或“备忘”: 下次需要相同的解决方案时,只需查阅即可。这个 当重复子问题的数量时,方法特别有用 作为输入大小的函数,指数增长。