美文网首页
Memoize算法

Memoize算法

作者: zdxhxh | 来源:发表于2019-09-29 16:04 被阅读0次

在计算机领域,记忆(Memoization)是主要用于加速程序的一种优化技术,它使得函数避免重复演算已被处理过得输入,而返回缓存得结果。
by wikipedia

Memozation的原理是把函数的每次执行结果存入一个对象中,在接下来的执行中,在对象中查找是否已经有相应执行的值,如果有,则直接返回该值,没有才执行函数体的求值部分,在对象中找值得速度比在函数中快。

另外,Memozation只适用于确定性算法

let memoize = (fn)=> { 
  let cache = []
  return funciton(key) { 
    if(!cache[key]) { 
      cache[key] = fn.apply(this,arguments)
    }
    return cache[key]
  }
}

Underscore.js是一个很精干的库,压缩后只有4KB。它提供了几十种函数式编程的方法,弥补了标准库的不足,大大方便了JavaScript的编程。MVC框架Backbone.js就将这个库作为自己的工具库。除了可以在浏览器环境使用,Underscore.js还可以用于Node.js。

Underscor.js定义了一个下划线(_)对象,函数库的所有方法都属于这个对象。这些方法大致上可以分成:集合(collection)、数组(array)、函数(function)、对象(object)和工具(utility)五大类。

_.memoize = function(func,hasher) { 
  var memoize = function(key) { 
    // 将存储对象的引用拿出来,以方便使用
    var cache = memoize.cache
    // 如果有hash算法,使用hash算法对key进行计算
    var address = '' + (hasher?hasher.apply(this,arguments):key)
    if(!_.has(cache,address)) { 
      cache[address] = func.apply(this,arguments)
    }
    return cache[address]
  }
  // 给memoize 挂载一个map
  memoize.cache = {} 
  // 返回该柯里化函数,此处有闭包
  return memoize
}

可以应用于一般算法,但能不能应用于递归呢?以下是斐波那契算法

var conunt = 0  // 记录fibonacci计算次数
var fibonacci = functioin(n) { 
  count++;
  return n<2 ?n:fibonacci(n-2) + functioin(n-1)
}
for(var i=0;i<=10;i++) { 
  console.log(`i:${i}+fibonacci(i)`)
}
fibonacci = memoize(fibonacci);

for(var i = 0; i<= 10; i++) {
    console.log(`i: ${i}, ` + fibonacci(i));
}
console.log(count); // 12次数 运算次数明显减少

相关文章

  • Memoize算法

    在计算机领域,记忆(Memoization)是主要用于加速程序的一种优化技术,它使得函数避免重复演算已被处理过得输...

  • react 计算优化

    memoizationimport memoize from 'memoize-one';getFullName ...

  • lodash的memoize 和 memoize-one有啥区别

    lodash的memoize 默认的情况下,memoize 只会根据形参的的一个参数进行缓存 再次相同参数 这看起...

  • 手写lodash中flowRight,curry,memoize

    手写flowRight 手写curry函数 手写memoize函数

  • lodash memoize

    以下代码都来自于4.17.11-es分支

  • 你可能不知道的递归

    递归 尾递归 CPS trampoline memoize 缓存 本文使用 JavaScript 进行描述。本文简...

  • JavaScript:memoize全局函数

    基本概念 简单讲就是把函数的计算结果缓存起来。这个对于计算量大的递归调用,可以加快速度。比如阶乘,斐波那契数组数组...

  • Promise + memoize 高级模式

    请求中常会遇见这样的情况:适合结果不变且多次调用的函数或复杂的计算函数,如购物车计算数据不变有不变的安全性,变有变...

  • js—记忆函数 memoize

    应用场景:在切换select下拉框进行接口请求搜索的时候,如果频繁切换会给后台造成很大的压力,所以需要前端用记忆函...

  • Protobuf,Jar冲突导致的请求异常

    项目中使用了Grpc和阿里云日志访问RPC接口突然显示,没有权限访问AbstractMessage.memoize...

网友评论

      本文标题:Memoize算法

      本文链接:https://www.haomeiwen.com/subject/smviuctx.html