我找到了诸如因子计算之类的例子来解释memoization。这些都很有帮助,但我正在寻求更深入的了解。
我想知道是否有人可以描述这种技术的真实世界应用以及为什么他们使用它而不是递归或者其他任何他们使用记忆的感觉可能有助于他们优化。
答案 0 :(得分:7)
记忆比缓存更具体。
考虑使用选择器在DOM中搜索元素,就像使用jQuery一样。说,$('.some-selector')
。在这个上下文中,我正在调用函数$
,告诉它为我找到所有具有CSS选择器'.some-selector'的元素。假设文档很大,我需要多次调用$('.some-selector')
。
您可以假设每次调用$('.some-selector')
都会返回相同的结果,因此,每次调用它时进行实际处理都是浪费精力。因此,$
可以使用参数(在本例中为“.some-selector”)作为某些查找表或字典中的键。第一次使用该参数调用函数时,它会正常处理,结果将使用参数作为键放在字典中,并返回结果。后续调用将发现该键在字典中具有表示已经计算的结果的值,因此它只返回那些先前的结果。最终效果是您不会浪费时间查找您已经知道的结果。
一个粗略的JavaScript示例:
var _dictionary = {};
function $(selector) {
if (_dictionary[selector]) return _dictionary[selector]; // lookup the results of the selector and return them if they exist
// otherwise, execute the function's logic normally
// TODO: search logic
var results = doSearch();
_dictionary[selector] = results;
return results;
}
This link更详细,甚至还包括一个可用于任何其他函数的通用memoize
JS函数。
答案 1 :(得分:2)
您可以使用memoization进行各种缓存。例如,您可以缓存某些ajax调用的结果。
示例:
var cache = new Array()
function memoized_ajax(url, callback) (
if (cache[url]) {
callback(cache[url]); // we already know the result for this url
}
else {
$.ajax({
url: url,
success: function(data) {
cache[url] = data; // we will remember result for this url
callback(data);
});
}
}
答案 2 :(得分:1)
如果你愿意,你可以删除它,因为我无法真正回答你的问题(这是给你一个使用memoization的例子),但我想指出memoization是为了解决一个完全不同类型的问题而不是递归。 Memoization 存储方法调用的输出,以便导出未来相同方法调用(相同参数和对象绑定)的结果是查找而不是计算。递归是一种函数算法。这意味着它们不会被反对,因为您可以记住递归函数的输出。