通过阅读网络上帖子: http://realazy.org/blog/2008/04/22/javascript-memoization/
写下学习心得如下:
“Memoization 原理非常简单,就是把函数的每次执行结果都放入一个散列表中,在接下来的执行中,在散列表中查找是否已经有相应执行过的值,如果有,直接返回该值,没有才 真正执行函数体的求值部分。很明显,找值,尤其是在散列中找值,比执行函数快多了。现代 JavaScript 的开发也已经大量使用这种技术。”
例如 fibonacci 函数;
可以写这样的函数:
Function F(n){
if (n == 0 || n == 1) return 1;
return F(n-1) + F(n-2);
}
F(5);
其计算过程如下:
F(5)=F(4)+F(3);
计算F(4) 计算F(4) ,记得计算F(3) 和F(2)
F(3)=F(2)+F(1); F(2)=F(1)+F(0);
F(1), F(0) 各计算一次得出结果1;F(2)才得出结果2; 但是接着又计算了F(1); 这样一来就重复计算了F(1) 到了蓝这一步时,又重复计算了F(2);…..
如此在数值变得更大时,重复执行函数的就更多…..
现有如下方式计算:
function kk(n){
if (n == 0 || n == 1) return 1;
return gg(n-1) + gg(n-2);
}
gg = function (){
var cache = {};
return function(c){
var key = c;
if (!(key in cache))
cache[key] = kk.call(null, c);
return cache[key];
}
}();
gg(4)
例如gg(2) 就不用再去循环计算…. 而直接返回 cache[2]为一个具体的数值;
gg(3) 就不用再去循环计算…. 而直接返回 cache[3]为一个具体的数值;
当gg(30)这样的算式时,效果就非常明显,比F(30)块1000倍。
找值,尤其是在散列中找值,比执行函数快多了。
分享到:
相关推荐
JavaScript Memoization 是一种优化技术,通过存储函数的中间结果,避免重复计算,从而提高性能。在JavaScript中,由于其动态类型和对象的特性,实现Memoization非常简单且高效。 在 Fibonacci 数列的例子中,原始...
在学习JavaScript面向对象编程时,Memoization是一种值得掌握的技术,它用于提高函数的执行效率。Memoization的核心思想是缓存函数的执行结果,以避免重复计算,特别是对于那些计算成本高或耗时长的函数,这种技术尤...
这个库的主要功能是提供JavaScript的备忘录化(memoization)功能,帮助优化代码性能。 **描述分析:** “memoizerific,快速,小,高效的javascript memoization lib到memoize js函数”表明memoizerific库具有轻量...
例如,使用异步调用、memoization 技术和重构函数等方法可以提高 JavaScript 的运行速度。 本文讨论了如何提升 JavaScript 的运行速度的方法,包括避免嵌套循环、使用异步调用、memoization 技术、重构函数和防止...
本文提供了两种解决 JavaScript 中递归问题的方法,包括 Memoization 技术和将递归算法转换为迭代算法。这些方法可以帮助开发者提高 JavaScript 的运行速度,解决递归问题,提高 Web 应用程序的性能。 知识点: 1....
这种特性使得函数可以封装私有变量,实现数据隐藏,同时为函数式编程提供了记忆化(memoization)等高级技术的基础。 纯函数是函数式编程的另一个关键要素。纯函数是指给定相同的输入,总是返回相同的输出,并且...
Javascript 中的记忆一个小示例,通过 javascript 展示了“记忆化”的全部内容。 记忆???!!!??? 嗯,它是一种保存/缓存与参数有关的函数结果的方法——在未来,这有助于防止使用相同的参数执行相同的函数,...
6.9使用缓存计算(Memoization)来提高应用程序性能 6.10使用匿名函数包装全局变量 第7章处理事件 7.0简介 7.1检测页面何时完成载入 7.2使用Event对象捕获鼠标点击事件的位置 7.3创建一个通用的、可...
3. 缓存和记忆化(Memoization):利用闭包的特性,可以实现函数缓存。当函数需要处理耗时计算时,可以将结果保存在闭包内部,当下次遇到相同的输入时,直接从缓存中返回结果,无需重新计算。 4. 高阶函数:闭包...
除了基础功能,Lodash还包含了一些高级特性,如延迟计算(lazy evaluation)和函数记忆(memoization),这些可以帮助优化性能,尤其是在处理大数据集时。例如,函数记忆能记住先前计算的结果,避免重复计算,提升...
使用迭代方式替代递归,采用 memoization 技术优化递归,斐波那契数列的递归算法优化。 4. 过多的 DOM 调用 在 Web 开发中,JavaScript 的一个很重要的作用就是对 DOM 进行操作。但是对 DOM 的操作是非常昂贵的,...
避免重复计算和过度渲染,使用函数记忆化(memoization)技术来存储先前计算的结果,可以减少不必要的计算。此外,避免使用过于复杂的嵌套循环,尽可能使用更简洁的数据结构和算法。 在DOM操作上,批量处理比单个...
Memoization Chapter 5. Inheritance Section 5.1. Pseudoclassical Section 5.2. Object Specifiers Section 5.3. Prototypal Section 5.4. Functional Section 5.5. Parts Chapter 6. Arrays Section 6.1...
2. **记忆化**:闭包可以用于缓存计算结果,提高性能,例如在函数式编程中的memoization技术。 3. **事件处理**:在事件监听器中,闭包可以保留事件触发时的上下文,确保回调函数能够正确操作相关变量。 4. **异步...
4. **缓存和 memoization**:不可变数据使得缓存计算结果变得更加简单,因为可以基于输入值的哈希来确定是否需要重新计算。 5. **调试**:由于每次修改都会生成新的数据结构,因此可以通过比较不同版本来追踪代码中...
3. **缓存结果**:对于重复计算的情况,可以使用记忆化(memoization)技术来存储之前计算过的值,避免重复计算。 4. **考虑尾递归优化**:在支持尾递归优化的JavaScript环境中(如使用`--harmony_tailcalls`标志的...
标题为“javascript 精粹笔记”的这份文档显然是一份针对JavaScript语言的学习和应用技巧的集合。JavaScript是一种广泛应用于Web前端开发的脚本语言,随着互联网技术的发展,JavaScript的应用越来越广泛,不仅限于...
JavaScript和TypeScript的轻量级,高效的元组和值对象实现。 快速提醒一下什么是元组(使用Python): ( 1 , 2 , 3 ) == ( 1 , 2 , 3 ) # → True 类似JavaScript版本如下所示: '[1,2,3]' === '[1,2,3]' ; // → ...