缓存和记忆化有什么区别?


114

我想知道caching和之间的实际区别memoization是什么。
正如我所看到的,两者都涉及通过存储数据来避免重复调用函数来获取数据

两者的核心区别是什么?


我想知道您是否可以说“内存是缓存”和“数组是稀疏数组”。换句话说,您只存储“按需”内容,而不枚举每种可能的输入组合。
Sridhar Sarnobat

Answers:


110

备注是缓存的一种特殊形式,它涉及根据函数的参数缓存函数的返回值

缓存是一个更笼统的术语。例如,HTTP缓存是缓存,而不是备注。

维基百科

尽管与缓存有关,但是记忆是指此优化的特定情况,将其与诸如缓存或页面替换之类的缓存形式区分开。


2
但您始终可以将缓存与功能一起使用的部分放在一边,并将其称为“存储”。尽管不同之处在于您可以控制函数中的缓存策略,但是记忆化是较高的顺序,发生在我猜想的函数之外。
尼古拉斯

为什么HTTP缓存不具有记忆性?也是基于参数(所请求资源的URL)的。
topo恢复莫妮卡

@topomorto:由于功能If-Match和到期。记住只对纯函数有意义,而HTTP很少。
Slaks

@nicolas,不是,我想。我认为在记忆中,术语“功能”是在纯/数学意义上使用的。从给定地址下载网页不能视为功能,因为页面可能会发生更改。
阿列克谢

@Alexey是不是同样的说法适用于缓存?所有这些策略都依赖于提供相同结果的相同函数调用,也没有上游副作用。
nicolas

47

正如我所看到的,“记忆”是“缓存确定性函数的结果”,在给定相同功能和输入的情况下,可以随时对其进行复制。

“缓存”基本上包括任何输出缓存策略,无论源值在给定时间是否可再现。实际上,缓存还用于指代输入缓存策略,例如磁盘或内存上的写缓存。因此,这是一个更笼统的术语。


您确定函数必须是确定性的吗?
Gherman

4
@德语,是的,记忆取决于确定性。经典示例是递归算法,例如斐波那契数列或阶乘。记住的功能不是重新计算直到基本情况,而是通过将较早的结果重新用于已计算的值来使其短路。显然,这取决于始终产生相同输出的相同输入,这就是确定性的定义。另一方面,在理解结果可能与“刷新”值不匹配的情况下,缓存经常用于不确定性(例如随机或加时间戳)的过程。
harpo

6

我认为缓存通常用于存储IO操作的结果,或存储从外部传入的任何数据(文件,网络,数据库查询)的结果。术语记忆通常用于存储您自己的计算结果,例如在动态编程的情况下。


1

记忆化是缓存确定性函数结果的一种特殊形式。这意味着将结果缓存在函数外部不是备忘录,因为在计算新结果时该函数将不得不更改缓存(不在缓存中),因此不再是(纯)函数。备注通常意味着将缓存作为附加参数传递(在辅助函数中)。记忆将优化需要针对单个访问多次计算值的功能。缓存将优化使用相同参数多次调用的函数。换句话说,无论缓存是否只会优化循环访问,记忆化都会优化首次访问。


0

我想在其他一些很好的答案中补充一点,即记忆也称为制表。我认为,对于那些了解记忆和缓存的人来说,知道该术语也很重要。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.