我发现的例子,如阶乘计算来解释记忆化 。 这些都是有用的,但是我正在寻找一个更深入的了解。
我想知道,如果有人可以描述这种技术的实际应用程序,以及为什么他们用它来代替递归或任何其他的他们感到使用记忆化可以帮助他们优化。
我发现的例子,如阶乘计算来解释记忆化 。 这些都是有用的,但是我正在寻找一个更深入的了解。
我想知道,如果有人可以描述这种技术的实际应用程序,以及为什么他们用它来代替递归或任何其他的他们感到使用记忆化可以帮助他们优化。
记忆化不仅仅是缓存更具体一点。
想想使用选择,就像你可能会使用jQuery寻找的DOM元素。 比方说, $('.some-selector')
在这种情况下,我调用该函数$
,告诉它找到我,有CSS选择器“一些,选择”所有元素。 比方说,该文件是大的,我需要调用$('.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;
}
此链接进入更多细节,甚至包括通用memoize
,可以用于任何其它功能JS功能。
你可以使用记忆化,各种缓存。 例如,你可以缓存一些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);
});
}
}
如果你愿意,你可以删除这一点,因为我真的不能回答你的问题(也就是给你使用记忆化的一个例子),但我想指出的是,记忆化是为了解决一个完全不同的类型递归问题。 记忆化存储方法调用的输出,使得导出未来相同的方法调用(相同的参数和对象的绑定)的结果是一个查找,而不是计算。 递归是一种类型的功能的算法。 这意味着,他们并不反对,因为你可以memoize的递归函数的输出。