Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >什么是 JavaScript 记忆化(Memoization)?

什么是 JavaScript 记忆化(Memoization)?

作者头像
zz_jesse
发布于 2024-07-31 04:11:53
发布于 2024-07-31 04:11:53
20500
代码可运行
举报
文章被收录于专栏:前端技术江湖前端技术江湖
运行总次数:0
代码可运行
什么是 Memoization?

Memoization(记忆化)是一种优化技术,主要用于加速计算机程序。它通过存储耗时函数的计算结果,在相同输入再次传递时,直接返回缓存的结果,从而避免重复计算。

为什么需要 Memoization?

让我们通过一个简单的例子来了解 Memoization 的必要性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function square(num) {
  return num * num;
}

console.log(square(2)); // 返回 4
console.log(square(9999999999999999)); // 这是一项耗时的计算
console.log(square(9999999999999999)); // 我们是否应该为相同的输入重新计算?

上面的函数对于较小的数字输入计算非常快,但如果输入是一个非常大的数字,如 9999999999999999,调用 square(9999999999999999) 两次将会是一项耗时的计算,我们可以通过 Memoization 避免这种重复计算。

如何将上述函数转换为 Memoized 函数?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function square(n) {
  return n * n;
}

function memoizedSquare() {
  let cache = {};
  return function optimizedSquare(num) {
    if (num in cache) {
      console.log('从缓存中返回结果');
      return cache[num];
    } else {
      console.log('计算平方');
      const result = square(num);
      cache[num] = result;
      return result;
    }
  };
}

const memoSquare = memoizedSquare();
console.log(memoSquare(9999999999999999));
console.log(memoSquare(9999999999999999));

// 输出:
// "计算平方"
// 1e+32

// "从缓存中返回结果"
// 1e+32

在这个例子中,我们创建了一个 memoizedSquare() 函数,该函数利用 JavaScript 的闭包和对象来实现缓存机制。我们检查输入数字是否已在缓存中,如果在则返回缓存结果,否则进行计算并将结果存储在缓存中。这种方法可以帮助我们避免不必要的耗时计算。

改进的可重用 Memoize 函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function memoize(callback) {
  let cache = {};
  return function(...args) {
    const key = args.toString();
    if (key in cache) {
      console.log('从缓存中返回结果');
      return cache[key];
    } else {
      console.log('计算结果');
      const result = callback(...args);
      cache[key] = result;
      return result;
    }
  };
}

function multiply(a, b) {
  return a * b;
}

const memoMultiplication = memoize(multiply);
console.log(memoMultiplication(10, 10));
console.log(memoMultiplication(10, 10));

// 输出:
// "计算结果"
// 100
// "从缓存中返回结果"
// 100

这个通用的 memoize 函数可以应用于任何需要缓存的函数。我们通过传递回调函数实现缓存机制,并在函数调用时检查缓存以决定是返回缓存结果还是重新计算。

Memoization 技术的潜在缺点

  1. 增加内存使用:由于 Memoization 需要缓存函数调用的结果,这可能会增加程序的内存使用,特别是当缓存变大时。使用 Memoization 时需要小心管理内存。
  2. 缓存失效:如果 Memoized 函数的输入随时间变化(例如缓存的网络请求结果每次返回不同的数据),需要谨慎管理缓存以确保其始终是最新的。有时管理缓存可能比值得计算要麻烦。
  3. 增加代码复杂度:Memoization 会增加代码的复杂度,特别是在需要处理边缘情况或优化缓存大小以提高性能时。需要权衡 Memoization 带来的性能提升与其增加的复杂度及潜在的 bug。

结束

总之,Memoization 是一种强大的技术,可以提高 JavaScript 代码的性能,但并非适用于所有场景。在使用 Memoization 之前,请仔细考虑其潜在的好处和缺点,确定它是否适合你的应用程序。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端技术江湖 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
DQN系列(3): 优先级经验回放(Prioritized Experience Replay)论文阅读、原理及实现
通常情况下,在使用“经验”回放的算法中,通常从缓冲池中采用“均匀采样(Uniformly sampling)”,虽然这种方法在DQN算法中取得了不错的效果并登顶Nature,但其缺点仍然值得探讨,本文提出了一种 “优先级经验回放(prioritized experience reolay)” 技术去解决采样问题,并将这种方法应用在DQN中实现了state-of-the-art的水平。
深度强化学习实验室
2020/05/27
4.9K0
强化学习(八)价值函数的近似表示与Deep Q-Learning
    在强化学习系列的前七篇里,我们主要讨论的都是规模比较小的强化学习问题求解算法。今天开始我们步入深度强化学习。这一篇关注于价值函数的近似表示和Deep Q-Learning算法。
刘建平Pinard
2018/10/11
1.4K0
强化学习(八)价值函数的近似表示与Deep Q-Learning
【SSL-RL】基于好奇心驱动的自监督探索机制(ICM算法)
Intrinsic Curiosity Module (ICM) 是一种用于强化学习的内在奖励机制,旨在解决传统强化学习中在稀疏奖励场景下,智能体难以学习有效策略的问题。该算法由 Deepak Pathak 等人在论文《Curiosity-driven Exploration by Self-supervised Prediction》中提出。ICM 是通过引入“好奇心”作为一种内在动机,帮助智能体在缺乏外部奖励的情况下探索环境并获取经验,从而提高强化学习的效率。
不去幼儿园
2024/12/03
1950
【SSL-RL】基于好奇心驱动的自监督探索机制(ICM算法)
强化学习反馈稀疏问题-HindSight Experience Replay原理及实现!
在强化学习中,反馈稀疏是一个比较常见同时令人头疼的问题。因为我们大部分情况下都无法得到有效的反馈,模型难以得到有效的学习。为了解决反馈稀疏的问题,一种常用的做法是为Agent增加一些内在的目标使反馈变的不再稀疏。
石晓文
2018/12/27
2K0
Win10环境下使用WSL安装OpenAI/gym +TensorFlow用强化学习DQN打砖块(Breakout Game)
我们的目标是在Windows 10系统上具体实现DeepMind论文中强化学习算法Q-learning Network(DQN)的训练过程。
大鹅
2021/06/15
1.5K0
Win10环境下使用WSL安装OpenAI/gym +TensorFlow用强化学习DQN打砖块(Breakout Game)
用一个小游戏入门深度强化学习
今天我们来用深度强化学习算法 deep Q-learning 玩 CartPole 游戏。
杨熹
2018/10/09
1.4K0
用一个小游戏入门深度强化学习
强化学习/增强学习/再励学习介绍 | 深度学习 | 干货分享 | 解读技术
Deepmind团队在17年12月5日发布的最新Alpha Zero中,非常重要的一种方法就是强化学习(reinforcement learning),又称再励学习、评价学习,是一种重要的机器学习方法,靠自身的经历进行学习。通过这种方式,RLS在行动-评价的环境中获得知识,改进行动方案以适应环境。正因为可以在小数据量的情况下靠自身的行动获得经验,所以Alpha Zero可以通过自我对弈进行学习提高。深度学习的一种分类方式:监督学习、无监督学习、半监督学习、强化学习。
用户7623498
2020/08/04
1.5K0
强化学习/增强学习/再励学习介绍 | 深度学习 | 干货分享 | 解读技术
【RL Base】强化学习核心算法:深度Q网络(DQN)算法
深度Q网络(DQN)是深度强化学习的核心算法之一,由Google DeepMind在2015年的论文《Playing Atari with Deep Reinforcement Learning》中提出。DQN通过结合深度学习和强化学习,利用神经网络近似Q值函数,在高维、连续状态空间的环境中表现出了强大的能力。
不去幼儿园
2024/12/03
3140
【RL Base】强化学习核心算法:深度Q网络(DQN)算法
7个流行的强化学习算法及代码实现
来源:Deephub Imba 本文约4500字,建议阅读5分钟 本文介绍了流行的强化学习算法的发展和改进。 目前流行的强化学习算法包括 Q-learning、SARSA、DDPG、A2C、PPO、DQN 和 TRPO。这些算法已被用于在游戏、机器人和决策制定等各种应用中,并且这些流行的算法还在不断发展和改进,本文我们将对其做一个简单的介绍。 1、Q-learning Q-learning:Q-learning 是一种无模型、非策略的强化学习算法。它使用 Bellman 方程估计最佳动作值函数,该方程
数据派THU
2023/04/18
6300
7个流行的强化学习算法及代码实现
MADQN:多代理合作强化学习
处理单一任务是强化学习的基础,它的目标是在不确定的环境中采取最佳行动,产生相对于任务的最大长期回报。但是在多代理强化学习中,因为存在多个代理,所以代理之间的关系可以是合作的,也可以是对抗,或者两者的混合。多代理的强化学习引入了更多的复杂性,每个代理的状态不仅包括对自身的观察,还包括对其他代理位置及其活动的观察。
deephub
2024/03/20
3480
MADQN:多代理合作强化学习
【强化学习】DQN 在运筹学中的应用
前段时间给出了 Q-Learning 在排班调度中的应用,现在给出 DQN 的实现。
阿泽 Crz
2020/11/09
9970
OpenAI Gym 中级教程——强化学习实践项目
通过这个实际项目,我们演示了如何在 OpenAI Gym 中使用深度 Q 网络(DQN)来解决经典的 CartPole 问题。我们创建了一个简单的 DQN 模型,实现了经验回放缓冲区,并进行了训练。这个项目为初学者提供了一个实践的起点,同时展示了在强化学习任务中使用 TensorFlow 和 OpenAI Gym 的基本步骤。希望这篇博客能够帮助你更好地理解和应用强化学习算法。
Echo_Wish
2024/02/03
2820
强化学习第十三篇:使用深度学习解决迷宫问题,完整步骤和代码
前面强化学习推送到第十二篇,迷宫问题已使用Q-learning解决过,今天使用另一种方法:深度Q网络,简称DQN网络解决。
double
2024/04/11
1.6K0
强化学习第十三篇:使用深度学习解决迷宫问题,完整步骤和代码
强化学习算法总结(一)——从零到DQN变体
中对应价值最大的动作的Q值进行更新,注意这里只是更新,并不会真的执行这个价值最大的动作。这里的更新策略(评估策略)与我们的行为策略(
CristianoC
2021/04/16
2.7K0
强化学习算法总结(一)——从零到DQN变体
【RL】基于迁移学习的强化学习(RL-TL)算法
基于迁移学习的强化学习(Reinforcement Learning with Transfer Learning,简称 RL-TL)是将迁移学习(Transfer Learning)的概念应用于强化学习(Reinforcement Learning,简称 RL)中的一种方法。其核心思想是在强化学习的环境中,利用已有的经验或在其他任务中学到的知识来提升学习效率和表现。这样可以减少从零开始学习的时间和样本需求,尤其在数据稀缺或任务复杂的场景中。
不去幼儿园
2024/12/03
1550
【RL】基于迁移学习的强化学习(RL-TL)算法
【强化学习】Double DQN(Double Deep Q-Network)算法
强化学习中的深度Q网络(DQN)是一种将深度学习与Q学习结合的算法,它通过神经网络逼近Q函数以解决复杂的高维状态问题。然而,DQN存在过估计问题(Overestimation Bias),即在更新Q值时,由于同时使用同一个网络选择动作和计算目标Q值,可能导致Q值的估计偏高。
不去幼儿园
2025/01/08
1.5K0
【强化学习】Double DQN(Double Deep Q-Network)算法
强化学习Double DQN方法玩雅达利Breakout游戏完整实现代码与评估pytorch
Breakout是一款经典的雅达利游戏,也就是我们所熟知的“打砖块”。玩家需要左右移动在屏幕下方的短平板子将一颗不断弹跳的小球反弹回屏幕上方,使其将一块块矩形砖块组成的六行砖块墙面打碎,并防止小球从屏幕底部掉落。在Atari 2600版本的Breakout中,玩家共有5次小球掉落机会,一旦用完就标志游戏结束,每打掉一块砖块得1分,全部打掉则游戏胜利结束。
Ranlychan
2024/01/10
1K0
强化学习(九)Deep Q-Learning进阶之Nature DQN
    在强化学习(八)价值函数的近似表示与Deep Q-Learning中,我们讲到了Deep Q-Learning(NIPS 2013)的算法和代码,在这个算法基础上,有很多Deep Q-Learning(以下简称DQN)的改进版,今天我们来讨论DQN的第一个改进版Nature DQN(NIPS 2015)。
刘建平Pinard
2018/10/11
1.2K0
【机器学习】突出强化学习中智能体通过与环境交互不断成长,其决策能力逐步进化提升,展现强化学习核心特点与动态过程。
在强化学习中,智能体是能够感知环境并采取行动的实体,而环境则是智能体所处的外部世界,智能体与环境之间通过交互来实现学习过程。例如,在一个简单的迷宫游戏中,智能体可以是一个试图找到出口的虚拟角色,而迷宫及其内部的障碍物、出口等构成了环境。
逆向-落叶
2024/12/25
2470
【机器学习】突出强化学习中智能体通过与环境交互不断成长,其决策能力逐步进化提升,展现强化学习核心特点与动态过程。
使用Python实现深度学习模型:强化学习与深度Q网络(DQN)
深度Q网络(Deep Q-Network,DQN)是结合深度学习与强化学习的一种方法,用于解决复杂的决策问题。本文将详细介绍如何使用Python实现DQN,主要包括以下几个方面:
Echo_Wish
2024/06/27
9030
使用Python实现深度学习模型:强化学习与深度Q网络(DQN)
推荐阅读
DQN系列(3): 优先级经验回放(Prioritized Experience Replay)论文阅读、原理及实现
4.9K0
强化学习(八)价值函数的近似表示与Deep Q-Learning
1.4K0
【SSL-RL】基于好奇心驱动的自监督探索机制(ICM算法)
1950
强化学习反馈稀疏问题-HindSight Experience Replay原理及实现!
2K0
Win10环境下使用WSL安装OpenAI/gym +TensorFlow用强化学习DQN打砖块(Breakout Game)
1.5K0
用一个小游戏入门深度强化学习
1.4K0
强化学习/增强学习/再励学习介绍 | 深度学习 | 干货分享 | 解读技术
1.5K0
【RL Base】强化学习核心算法:深度Q网络(DQN)算法
3140
7个流行的强化学习算法及代码实现
6300
MADQN:多代理合作强化学习
3480
【强化学习】DQN 在运筹学中的应用
9970
OpenAI Gym 中级教程——强化学习实践项目
2820
强化学习第十三篇:使用深度学习解决迷宫问题,完整步骤和代码
1.6K0
强化学习算法总结(一)——从零到DQN变体
2.7K0
【RL】基于迁移学习的强化学习(RL-TL)算法
1550
【强化学习】Double DQN(Double Deep Q-Network)算法
1.5K0
强化学习Double DQN方法玩雅达利Breakout游戏完整实现代码与评估pytorch
1K0
强化学习(九)Deep Q-Learning进阶之Nature DQN
1.2K0
【机器学习】突出强化学习中智能体通过与环境交互不断成长,其决策能力逐步进化提升,展现强化学习核心特点与动态过程。
2470
使用Python实现深度学习模型:强化学习与深度Q网络(DQN)
9030
相关推荐
DQN系列(3): 优先级经验回放(Prioritized Experience Replay)论文阅读、原理及实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验