资讯专栏INFORMATION COLUMN

函数记忆

jokester / 1696人阅读

摘要:函数可以将先前操作的结果记录在某个对象里,从而避免无谓的重复运算。这种优化被称为记忆。在看看斐波那契数列的栗子使用了函数记忆,调用次数从次减少到了次。

函数可以将先前操作的结果记录在某个对象里,从而避免无谓的重复运算。这种优化被称为记忆。

最近读javascript语言精粹这本书函数章节的时候,里面有个记忆函数的优化,书中给的栗子是斐波那契数列执行的时候减少调用次数的优化,那么这种优化能在哪些场景使用呢?

在看书中的栗子之前,我们先看一个栗子:

var memorize = function(f,hasher){
    var memoize = function(name){
        var cache = memoize.cache;
        var key = "" + (hasher ? hasher.apply(this,arguments):name)
        if(!cache[key]){
            cache[key] = f.apply(this,arguments);
        }
        return cache[key];
    }
    memoize.cache = {};
    return memoize;
}

function add(a,b){
    return a+b;
}

var memorizedAdd = memorize(add,function(){
    var args = Array.prototype.slice.call(arguments);
    return JSON.stringify(args);
});


console.time("使用函数记忆执行时间");
for(var i = 0; i < 10000;i++){
    memorizedAdd(1,2);
}
console.timeEnd("使用函数记忆执行时间");


console.time("原生调用执行时间");
for(var i = 0; i < 10000;i++){
    add(1,2);
}
console.timeEnd("原生调用执行时间");

//使用函数记忆执行时间: 15.49462890625ms
//原生调用执行时间: 0.962890625ms

上面的memoize方法来自underscore源码,这说明函数记忆并不是万能的。

在看看斐波那契数列的栗子:

var count = 0;
var fibonacci = function(n){
    count++;
    return n< 2 ? n : fibonacci(n-1) + fibonacci(n-2);
}
for(var i = 0; i <= 10;i++){
 fibonacci(i);
}
console.log(count);//453

fibonacci = memorize(fibonacci);
for(var i = 0; i <= 10;i++){
 fibonacci(i);
}
console.log(count);//12

使用了函数记忆,调用次数从453次减少到了12次。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/90440.html

相关文章

  • SPA 路由记忆

    摘要:路由记忆名词解释在中后台系统开发中,访问任何页面时,认证是永远绕不过的槛。这个过程,暂且称之为路由记忆,前面例子中的登录页面称之为记忆节点。 SPA 路由记忆 名词解释 在中后台系统开发中,访问任何页面时,认证是永远绕不过的槛。以登录为例,如果检测出当前用户未登录,会强制跳转到登录页面提示用户进行登录。登录完成后,系统需要跳转至用户原先想访问的页面。这个过程,暂且称之为路由记忆,前面例...

    starsfun 评论0 收藏0
  • 深度解析LSTM神经网络的设计原理

    摘要:而从数学上看的话,更是短时记忆了,因为梯度流经的时候,经历的是的连环相乘的路径在输入输出门关闭前,显然如前边的数学证明中所述,这样会发生梯度爆炸和 引人入胜的开篇:想要搞清楚LSTM中的每个公式的每个细节为什么是这样子设计吗?想知道simple RNN是如何一步步的走向了LSTM吗?觉得LSTM的工作机制看不透?恭喜你打开了正确的文章! 前方核弹级高能预警!本文信息量非常大,文章长且思维连贯...

    jay_tian 评论0 收藏0
  • JavaScript专题之函数记忆

    摘要:专题系列第十七篇,讲解函数记忆与菲波那切数列的实现定义函数记忆是指将上次的计算结果缓存起来,当下次调用时,如果遇到相同的参数,就直接返回缓存中的数据。 JavaScript 专题系列第十七篇,讲解函数记忆与菲波那切数列的实现 定义 函数记忆是指将上次的计算结果缓存起来,当下次调用时,如果遇到相同的参数,就直接返回缓存中的数据。 举个例子: function add(a, b) { ...

    RobinTang 评论0 收藏0
  • 函数式编程之记忆 js

    函数式编程之记忆是一种时间换空间的方法,用牺牲空间的复杂度来换取时间的复杂度 字符串连接 function f() { var s = arguments.length + Array.prototype.join.call(arguments); console.log(s); }; 这里使用的是Array.prototype.join方法进行字符串连接返回的是连接的结果 接下来,写一个...

    DC_er 评论0 收藏0
  • LSTM入门必读:从基础知识到工作方式详解

    摘要:意味着完全保持,意味着完全丢弃。卡比兽写这篇博文的时间我本可以抓一百只,请看下面的漫画。神经网络神经网络会以的概率判定输入图片中的卡比兽正在淋浴,以的概率判定卡比兽正在喝水,以的概率判定卡比兽正在遭遇袭击。最终结果是卡比兽正在遭遇袭击 我第一次学习 LSTM 的时候,它就吸引了我的眼球。事实证明 LSTM 是对神经网络的一个相当简单的扩展,而且在最近几年里深度学习所实现的惊人成就背后都有它们...

    alanoddsoff 评论0 收藏0

发表评论

0条评论

jokester

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<