会员登录 - 用户注册 - 设为首页 - 加入收藏 - 网站地图 动态规划:使用备忘录来改进Javascript函数!

动态规划:使用备忘录来改进Javascript函数

时间:2025-11-05 15:55:00 来源:益强数据堂 作者:数据库 阅读:863次

译者 | 卢鑫旺

审校 | 梁策 孙淑娟

动态规划已出现了十多年。动态根据维基百科,规划它既是使用数一种数学优化方法,也是备忘一种计算机编程方法。一个问题要真正应用动态规划,录改必须具有两个关键属性:最优结构和重叠子结构。动态本文不会细讲动态规划,规划而是使用数将关注重叠子结构如何成为动态规划的关键属性之一。由于这关系到接下来的备忘存储解决方案问题,所以对它的录改讨论非常重要。

本文将介绍什么是动态备忘录,备忘录对Javascript开发人员来说具有哪些价值,规划以及如何使用它来改进Javascript函数,使用数从而对备忘录本身以及备忘录对优化应用程序的备忘意义有一个深入了解。

在本文中,录改我们将讨论以下几个主题:

什么是备忘录备忘录的主要概念函数使用备忘录和不用备忘录的比较备忘录的意义什么是备忘录?

备忘录是缓存的一种形式,是一种方便进入和后续使用的值存储方法。免费源码下载备忘录是将已解决问题的结果记录下来,这样下次需要再次执行相同操作时,就不必重新计算了。不过,一个函数要使用备忘录,需要满足一定条件:它必须是引用透明的,即只有在调用函数的效果与用函数的返回值替换函数调用的效果完全相同的情况下才可以使用。

在Ruby、C++、Python等大多数编程语言中都有备忘录,这些语言中甚至有很多库可以简化。在本文中,我们将重点关注Javascript。编程语言或许不同,但其中的概念和思想是一致的。

备忘录的概念

备忘录需要理解以下两个概念:

1.引用透明2.查找表1.引用透明

如果一个表达式可以在不改变程序行为的情况下被其对应的值替换(反之亦然),那么它就被称为引用透明。这要求表达式必须是纯的服务器托管,即对于相同的输入,表达式的值必须相同,并且它的求值必须没有副作用。非引用透明的表达式称为引用不透明。

有了上面的解释,我们可以很快地把它和备忘录的行为联系起来,这个概念让我们可以写出一个带备忘录的函数。

2.查找表

查找表(LUT)是一个数组,它用更为简单的数组索引操作取代运行时计算。该过程被称为“直接寻址”,LUT与哈希表的不同之处在于它检索的是一个值。

比较函数使用备忘录和不用备忘录

以经典的斐波那契数列定义为例:

1.function Fibo(n) {  

2.    if (n < 2) {  

3.        return n;  

4.    }  

5.    return Fibo(n - 1) + Fibo(n - 2);  

6.} 

你可能预料到了,一旦开始使用大于20的数字,这个过程就会变得非常缓慢。而当你处理35左右的数字时,计算机估计也撑不住了。

解决方法是b2b信息网记录调用函数的返回结果1.var IterMemoFib = function() {  

2.    var cache = [1, 1];  

3.    var fib = function(n) {  

4.        if (n >= cache.length) {  

5.            for (var i = cache.length; i <= n; i++) {  

6.                cache[i] = cache[i - 2] + cache[i - 1];  

7.            }  

8.        }  

9.        return cache[n];  

10.    }  

11.  

12.    return fib;  

13.}(); 

这部分有点麻烦,也不完全可读,或者你也可以让计算机来协助完成:

1.Fib = Fib.memoize();  

由于技术(浏览器安全策略)限制,备忘录函数的参数只能是数组或标量值,不能是对象。

下面的代码扩展了Function对象以添加备忘录功能。如果函数是一个方法,则可以将对象传递给memoize()。

1.Function.prototype.memoize = function () {  

2. var pad = {};  

3. var self = this;  

4. var obj = arguments.length > 0 ? arguments[i] : null;  

5.   

6. var memoizedFn = function () {  

7.   // Copy the arguments object into an array: allows it to be used as  

8.   // a cache key.  

9.   var args = [];  

10.   for (var i = 0; i < arguments.length; i++) {  

11.     args[i] = arguments[i];  

12.   }  

13.   

14.   // Evaluate the memoized function if it hasnt been evaluated with  

15.   // these arguments before.  

16.   if (!(args in pad)) {  

17.     pad[args] = self.apply(obj, arguments);  

18.   }  

19.   

20.   return pad[args];  

21. };  

22.   

23. memoizedFn.unmemoize = function () {  

24.   return self;  

25. };  

26.   

27. return memoizedFn;  

28.};  

29.   

30.Function.prototype.unmemoize = function () {  

31. alert("Attempt to unmemoize an unmemoized function.");  

32. return null;  

33.};  备忘录的意义“记住”与某组特定输入相对应的结果备忘录降低了函数的时间成本以换取空间成本备忘录更不依赖机器结论:什么是备忘录?

在本文中,我们讨论了备忘录以及它的两个主要概念:引用透明和查找表。此外,我们还探讨了它对Javascript代码的重要性,同时比较了未使用备忘录的代码和使用备忘录的代码之间的区别,并对缓存值所用的技术进行了一定了解。

以下是一些可使用备忘录的Javascript库,如有需要可供参考:

https://developer.yahoo.com/yui/3/cache/

https://github.com/planttheidea/micro-memoize

https://github.com/caiogondim/fast-memoize.js

https://lodash.com/docs/4.17.15#memoize

译者介绍

卢鑫旺,社区编辑,半路出家的九零后程序员。做过前端页面,写过业务接口,搞过爬虫,研究过JS,有幸接触Golang,参与微服务架构转型。目前主写Java,负责公司可定制化低代码平台的数据引擎层设计开发工作。

原文标题:​​Dynamic Programming: Using Memoization to Improve Your Javascript Functions​​,作者:Ignatius Sani

(责任编辑:域名)

上一篇:PPA仓库是专为Ubuntu用户设计的软件仓库,使用起来比其他第三方软件更容易,但是当你添加一个新的PPA仓库时,你就需要将陈旧的PPA仓库移除,具体该怎么做呢?下面随小编一起来了解下Ubuntu下如何删除PPA仓库吧。个人软件包档案(PPA)是Ubuntu独有的解决方案,允许独立开发者和贡献者构建、贡献任何定制的软件包来作为通过启动面板的第三方APT仓库。假如你是Ubuntu用户,有可能你已经增加一些流行的第三方PPA仓库到你的Ubuntu系统。假如你需要删除掉已经预先配置好的PPA仓库,下面将教你怎么做。假如你想增加一个叫“ppa:webapps/preview”第三方PPA仓库到你的系统中,如下:代码如下:$ sudo add-apt-repository ppa:webapps/preview假如你想要 单独地删除某个PPA仓库,运行下面的命令:代码如下:$ sudo add-apt-repository --remove ppa:someppa/ppa注意,上述命令不会同时删除任何已经安装或更新的软件包。假如你想要完整的删除一个PPA仓库并包括来自这个PPA安装或更新过的软件包,你需要ppa-purge命令。首先要安装ppa-purge软件包:代码如下:$ sudo apt-get install ppa-purge然后使用如下命令删除PPA仓库和与之相关的软件包:代码如下:$ sudo ppa-purge ppa:webapps/preview特别滴,在发行版更新后,当你分辨和清除已损坏的PPA仓库时这个方法特别有用!上面就是Ubuntu下删除PPA仓库的方法介绍了,本文主要是通过ppa-purge命令来删除PPA仓库,简单而又实用,且能够完整的删除PPA仓库。
下一篇:密码错误后自锁多久?解析密码错误自动锁定功能的作用与设置(密码错误自动锁定的时间设置和安全保护)
最新内容
推荐内容
  • 不是我不明白,这世界变化快!微软面向 Linux 平台推出了 Visual Studio 2015!昔日的对头,如今正走向融合。这么喜大普奔的事,我准备挑战一下微软重量级软件在 Linux 平台上的安装。然没想到哇。根本没有我想象中的挑战性。看完你就知道了。软件名称:Visual Studio 2015 旗舰版 官方最新版软件大小:1.69MB更新时间:2014-11-171、百度 “Visual Studio Downloads”这一溜关键词,在搜索结果中打开 Visual Studio 的主页。2、可以看到页面上有三个磁贴状方块,最右边的是 Visual Studio Code,我们点击它里面的“下载”。3、进入下载页面,页面上地址栏下方的黄色条带里提示有更新的版本,当然,大家要更新的。先点那个黄条里的 New features,看看有啥新鲜东西。4、各种改进,包括文件管理、编辑器选项、JavaScript 支持升级、Git 增强等等。那还等什么,点击上方黄条上的 Update,去下载升级版吧。5、在接下来的页面,我们点击 Updating on Linux 一节里的链接,开始下载。有两个链接,分别是 64 位的和 32 位的,根据自己的情况选择。6、下载完成之后,点击下载管理器里的“在文件夹中显示”,导航到刚才下载的软件包所在的文件夹。7、在软件包上右键——>提取到此处,开始解压软件包。8、解压完成,进入与软件压缩包同名的文件夹,在一个名为 Code 的可执行文件上双击。9、DUANG!Linux 平台上的微软重量级软件一下出现在眼前。原来,Visual Studio Code 是不开源的,我刚开始想象的软件编译呀,软件包依赖呀等挑战,从开始就不存在好嘛。现在,各位年轻的码农,一切就看你们的了。10、假如和我一样觉得无从下手,好吧,附送免费视频培训,我的名字叫雷锋。
  • 2021 年的前端趋势:Serverless 快速试用
  • Nginx服务器的六种负载均衡策略详解
  • OAuth2授权服务器Keycloak宣布不再适配Spring Boot和Spring Security
  • ubuntu系统网络配置ubuntu系统默认root用户是不能登录的,密码也是空的。为方便大家使用,脚本网站特为大家准备了一篇图文并茂的不得不承认,Ubuntu系统的网络设置是楼主见过的最简洁明了的。假如你用过Win7,再和Ubuntu一比,相形见绌。那么,本文就介绍一下Ubuntu系统下的网络设置吧(楼主的大本Acer用的是linux deepin 11.06)。一.有线连接二.无线连接三.移动宽带四.VPN五.DSL这个可是重点喔,有些有线连接需要DSL(也就是ADSL)进行拨号上网。不过,筒子们放心,设置也是非常简单。只需新建,输入你的账户和密码就行了。连接时,先连有线,然后再点击设置好的DSL就行了。上述就是五种基本的网络设置方法,当然,某些学校等机构用的是锐捷客户端进行连接,使用Mentohust(终端客户端)或者Birl(图形客户端)就行了。筒子们自行搜索下载,推荐使用Birl。以下是下载链接https://launchpad.net/~linux-deepin-team/+archive/linux-deepin/+sourcepub/1958093/+listing-archive-extra
  • 在 Linux 服务器中创建假桌面运行模拟浏览器有头模式