`
caii
  • 浏览: 6320 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

JavaScript Memoization

阅读更多
通过阅读网络上帖子: 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 是一种优化技术,通过存储函数的中间结果,避免重复计算,从而提高性能。在JavaScript中,由于其动态类型和对象的特性,实现Memoization非常简单且高效。 在 Fibonacci 数列的例子中,原始...

    Javascript Memoization 缓存函数使用说明

    在学习JavaScript面向对象编程时,Memoization是一种值得掌握的技术,它用于提高函数的执行效率。Memoization的核心思想是缓存函数的执行结果,以避免重复计算,特别是对于那些计算成本高或耗时长的函数,这种技术尤...

    前端开源库-memoizerific

    这个库的主要功能是提供JavaScript的备忘录化(memoization)功能,帮助优化代码性能。 **描述分析:** “memoizerific,快速,小,高效的javascript memoization lib到memoize js函数”表明memoizerific库具有轻量...

    如何提升JavaScript的运行速度(函数篇).doc

    例如,使用异步调用、memoization 技术和重构函数等方法可以提高 JavaScript 的运行速度。 本文讨论了如何提升 JavaScript 的运行速度的方法,包括避免嵌套循环、使用异步调用、memoization 技术、重构函数和防止...

    如何提升JavaScript的运行速度(递归篇)

    本文提供了两种解决 JavaScript 中递归问题的方法,包括 Memoization 技术和将递归算法转换为迭代算法。这些方法可以帮助开发者提高 JavaScript 的运行速度,解决递归问题,提高 Web 应用程序的性能。 知识点: 1....

    JavaScript的函数式编程基础指南

    这种特性使得函数可以封装私有变量,实现数据隐藏,同时为函数式编程提供了记忆化(memoization)等高级技术的基础。 纯函数是函数式编程的另一个关键要素。纯函数是指给定相同的输入,总是返回相同的输出,并且...

    Memoization-in-[removed]一个小示例,在 javascript 中展示了“记忆”的全部内容

    Javascript 中的记忆一个小示例,通过 javascript 展示了“记忆化”的全部内容。 记忆???!!!??? 嗯,它是一种保存/缓存与参数有关的函数结果的方法——在未来,这有助于防止使用相同的参数执行相同的函数,...

    JavaScript经典实例

     6.9使用缓存计算(Memoization)来提高应用程序性能  6.10使用匿名函数包装全局变量  第7章处理事件  7.0简介  7.1检测页面何时完成载入  7.2使用Event对象捕获鼠标点击事件的位置  7.3创建一个通用的、可...

    基于javascript 闭包基础分享

    3. 缓存和记忆化(Memoization):利用闭包的特性,可以实现函数缓存。当函数需要处理耗时计算时,可以将结果保存在闭包内部,当下次遇到相同的输入时,直接从缓存中返回结果,无需重新计算。 4. 高阶函数:闭包...

    一个现代JavaScript实用程序库,提供模块化性能额外.zip

    除了基础功能,Lodash还包含了一些高级特性,如延迟计算(lazy evaluation)和函数记忆(memoization),这些可以帮助优化性能,尤其是在处理大数据集时。例如,函数记忆能记住先前计算的结果,避免重复计算,提升...

    JavaScript优化方法.doc

    使用迭代方式替代递归,采用 memoization 技术优化递归,斐波那契数列的递归算法优化。 4. 过多的 DOM 调用 在 Web 开发中,JavaScript 的一个很重要的作用就是对 DOM 进行操作。但是对 DOM 的操作是非常昂贵的,...

    JavaScript性能优化的小知识总结共23页.pdf

    避免重复计算和过度渲染,使用函数记忆化(memoization)技术来存储先前计算的结果,可以减少不必要的计算。此外,避免使用过于复杂的嵌套循环,尽可能使用更简洁的数据结构和算法。 在DOM操作上,批量处理比单个...

    javascript语言精粹(中英文版)

    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...

    JavaScript闭包深入理解.pdf

    2. **记忆化**:闭包可以用于缓存计算结果,提高性能,例如在函数式编程中的memoization技术。 3. **事件处理**:在事件监听器中,闭包可以保留事件触发时的上下文,确保回调函数能够正确操作相关变量。 4. **异步...

    JavaScript数据结构的不可变操作

    4. **缓存和 memoization**:不可变数据使得缓存计算结果变得更加简单,因为可以基于输入值的哈希来确定是否需要重新计算。 5. **调试**:由于每次修改都会生成新的数据结构,因此可以通过比较不同版本来追踪代码中...

    javascript中递归函数用法注意点

    3. **缓存结果**:对于重复计算的情况,可以使用记忆化(memoization)技术来存储之前计算过的值,避免重复计算。 4. **考虑尾递归优化**:在支持尾递归优化的JavaScript环境中(如使用`--harmony_tailcalls`标志的...

    javascript 精粹笔记

    标题为“javascript 精粹笔记”的这份文档显然是一份针对JavaScript语言的学习和应用技巧的集合。JavaScript是一种广泛应用于Web前端开发的脚本语言,随着互联网技术的发展,JavaScript的应用越来越广泛,不仅限于...

    tuplerone:JavaScript的元组和值对象

    JavaScript和TypeScript的轻量级,高效的元组和值对象实现。 快速提醒一下什么是元组(使用Python): ( 1 , 2 , 3 ) == ( 1 , 2 , 3 ) # → True 类似JavaScript版本如下所示: '[1,2,3]' === '[1,2,3]' ; // → ...

Global site tag (gtag.js) - Google Analytics