从爬楼算法联想到js中的缓存方案

在leetcode上看到一个高赞的解题思路 leetcode.cn/problems/cl...

java 复制代码
public int climbStairs(int n) {
    
    int result = 0;
    
    switch(n){
        case 1: result = 1; break;
        case 2: result = 2; break;
        case 3: result = 3; break;
        case 4: result = 5; break;
        case 5: result = 8; break;
        case 6: result = 13; break;
        case 7: result = 21; break;
        case 8: result = 34; break;
        case 9: result = 55; break;
        case 10: result = 89; break;
        case 11: result = 144; break;
        case 12: result = 233; break;
        case 13: result = 377; break;
        case 14: result = 610; break;
        case 15: result = 987; break;
        case 16: result = 1597; break;
        case 17: result = 2584; break;
        case 18: result = 4181; break;
        case 19: result = 6765; break;
        case 20: result = 10946; break;
        case 21: result = 17711; break;
        case 22: result = 28657; break;
        case 23: result = 46368; break;
        case 24: result = 75025; break;
        case 25: result = 121393; break;
        case 26: result = 196418; break;
        case 27: result = 317811; break;
        case 28: result = 514229; break;
        case 29: result = 832040; break;
        case 30: result = 1346269; break;
        case 31: result = 2178309; break;
        case 32: result = 3524578; break;
        case 33: result = 5702887; break;
        case 34: result = 9227465; break;
        case 35: result = 14930352; break;
        case 36: result = 24157817; break;
        case 37: result = 39088169; break;
        case 38: result = 63245986; break;
        case 39: result = 102334155; break;
        case 40: result = 165580141; break;
        case 41: result = 267914296; break;
        case 42: result = 433494437; break;
        case 43: result = 701408733; break;
        case 44: result = 1134903170; break;
        case 45: result = 1836311903; break;
    }
    return result;
}

Memoize

memoize 是一种缓存JavaScript函数结果来加速代码速度的技术,同cache类似,但不相同,cache可以是任何缓存技术,比如http缓存,数据库缓存等,但memoize只是在JavaScript中缓存返回值。

什么时候适用

  1. 用于一个高强度运算的函数上,相同参数返回的结果不会变化
  2. 占用内存比运算内存划得来,使用频率高

怎么使用

当一个函数运算耗费非常昂贵的计算资源时,而且会重复调用的,考虑使用memoize是非常不错的提升性能的方法。

js 复制代码
/** 模拟耗时的方法 */
const add = function(n) {
  for(var i = 0;i < 10000000000;i++) {
    n++;
  }
  return n;
};

const memoizedMethod = function(method) {
  const memoizes = [];
  return function(n) {
    if(n in memoizes) {
      return memoizes[n];
    } else {
      memoizes[n] = method(n);
      return memoizes[n];
    }        
  }
}
const addMemoized = memoizedMethod(add);
addMemoized(2);  // 时间较长
addMemoized(2);  // 立即获取结果
addMemoized(2);  // 立即获取结果

实现方法

把函数的参数和值缓存到对象中,在调用函数前前判断缓存中是否存在结果,如果没有,就执行函数。但是如果缓存中存在结果,立即返回结果,节省了大量的计算资源。

关于react有一个装饰器,可以非常方便的使用他提供的一些现成的方法,其中包括了memoize的实现

点此传送→lodash-decorators

react hook中也提供了一个useMemo用于实现memoize 点此传送→useMemo

同样的思想在useCallback也得到了体现。

长度较短的有限集合的解,可直接返回值,自己学习算法最终的目的还是为了更好地解决问题。 警醒自己不要沉迷于算法的精妙而忽视实际情况,上了很好的一课。

相关推荐
子春一12 小时前
Flutter for OpenHarmony:构建一个 Flutter 天气卡片组件,深入解析动态 UI、响应式布局与语义化设计
javascript·flutter·ui
雨季66612 小时前
Flutter 三端应用实战:OpenHarmony “极简文本行数统计器”
开发语言·前端·flutter·ui·交互
MAHATMA玛哈特科技12 小时前
以曲求直:校平技术中的反直觉哲学
前端·数据库·制造·校平机·矫平机·液压矫平机
C澒12 小时前
前端技术核心领域与实践方向
前端·系统架构
Remember_99312 小时前
Java 单例模式深度解析:设计原理、实现范式与企业级应用场景
java·开发语言·javascript·单例模式·ecmascript
写代码的【黑咖啡】12 小时前
Python 中的自然语言处理利器:NLTK
前端·javascript·easyui
Swift社区12 小时前
Nginx 反向代理配置 React 前端与 Python 后端
前端·nginx·react.js
可问春风_ren13 小时前
Vue3 入门详解:从基础到实战
开发语言·前端·javascript·vue.js·前端框架·ecmascript·edge浏览器
摘星编程13 小时前
用React Native开发OpenHarmony应用:NativeStack原生导航
javascript·react native·react.js
一起养小猫13 小时前
Flutter for OpenHarmony 实战:从零开发一款五子棋游戏
android·前端·javascript·flutter·游戏·harmonyos