加速程序计算优化技术---记忆

 加速程序计算优化技术---记忆

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

在JS的对象和数组要实现这种优化是非常方便的。

下面用一个经典递归函数----斐波那契数列

var conut=0;

var fibonaccii = function (n)

{     conut++;

console.log("conut:" + conut);

return n< 2 ? n : fibonaccii(n-1) + fibonaccii(n-2);

};

function test() {

for (var i= 0; i <= 10; i += 1) {

console.log(i+":" + fibonaccii(i));

}

}

这样工作是可行的;但是效率非常低。我算了一下:

函数被调用了453次,我们调用了11次;所以,它自身递归调用442次,有很多是已经被刚刚计算过了;如果我们让函数具有记忆功能,就可以显著提高极少计算量,提高效率。

var count = 0;

var fibonaccii = function () {

var memo =[0,1];

var fib =function (n) {

count++;

console.log("count:" + count);

varresult = memo[n];

if(typeofresult !== ‘number‘) {

result= fib(n-1) + fib(n-2);

memo[n]= result;

}

returnresult;

};

returnfib;

}();

function test() {

for (var i= 0; i <= 10; i += 1) {

console.log(i+":" + fibonaccii(i));

}

}

test();

这个函数返回同样的结果,但是很明显,仅仅被调用了29次,我们自己调用了11次;也就只用了18次去取之前存储的结果;

当然,我们可以推而广之,编写一个函数来帮助,我们构造带记忆功能的函数,memoizer函数取得一个初始的memo数组和formua函数;它返回一个管理memo存储和在需要时调用fromula的函数recur;我们把这个函数recur函数和它的参数传递给formula函数

var memoizer = function (memo, formula) {

var recur= function (n) {

varresult = memo[n];

if(typeofresult !== ‘number‘) {

result= formula(recur, n);

memo[n]= result;

}

returnresult;

}

returnrecur;

};

现在,我们可以使用memoizer函数来定义fibonaccii函数,提供其初始的memo数组和formula函数;

var fibonaccii = memoizer([0,1],function (recur, n)) {

returnrecur(n - 1) + recur(n - 2);

});

通过这种设计方案,产生另一个函数的函数,极大地减少了我们工作量,例如,我们要产生一个记忆的阶乘函数,我们可以这样

var factorial = memoizer([0, 1], function (recur, n)){

returnn*recur(n - 1);

}

只需要提供基本的阶乘公式就可以了。

时间: 2024-10-07 04:41:00

加速程序计算优化技术---记忆的相关文章

JVM优化技术

1.语言无关的经典优化技术之一:公共子表达式消除 公共子表达式消除是一个普遍应用于各种编译器的经典优化技术,它的含义是:如果一个表达式E已经被计算过了,并且从先前的计算到现在E中所有变量的值都没有发生变化,那么E的这次出现就成为了公共子表达式,对于这种表达式,没有必要花时间再对它进行计算,只需要直接用前面计算过的表达式结果替代E就可以了, 举个例子简单说明它的优化过程,假设有如下代码 int d = (c*b)*12 + a +(a+b*c) 如果这段代码交给javac编译器则不会进行任何优化,

程序的优化(PHP)

有些小细节往往容易被人忽视.有时候常常说优化代码优化代码,但是实际操作的时候,最容易被忽视的如下所示: echo 比 print 快. 使用echo的多重参数代替字符串连接. 在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替. 对global变量,应该用完就unset()掉. 用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会. 函数代替正则表达式完成相同功能. 当执行变量$i的递增或递减时,$i+

【原创】PHP程序员的技术成长规划

PHP程序员的技术成长规划 作者:黑夜路人(2014/10/15) 按照了解的很多PHP/LNMP程序员的发展轨迹,结合个人经验体会,抽象出很多程序员对未来的迷漫,特别对技术学习的盲目和慌乱,简单梳理了这个每个阶段PHP程序员的技术要求,来帮助很多PHP程序做对照设定学习成长目标. 本文按照目前主流技术做了一个基本的梳理,整个是假设PHP程序员不是基础非常扎实的情况进行的设定,并且所有设定都非常具体明确清晰,可能会让人觉得不适,请理解仅代表一家之言.(未来技术变化不在讨论范围) 第一阶段:基础阶

PHP 程序员的技术成长规划

按照了解的很多PHP/LNMP程序员的发展轨迹,结合个人经验体会,抽象出很多程序员对未来的迷漫,特别对技术学习的盲目和慌乱,简单梳理了这个每个阶段PHP程序员的技术要求,来帮助很多PHP程序做对照设定学习成长目标. 本文按照目前主流技术做了一个基本的梳理,整个是假设PHP程序员不是基础非常扎实的情况进行的设定,并且所有设定都非常具体明确清晰,可能会让人觉得不适,请理解仅代表一家之言.(未来技术变化不在讨论范围) 第一阶段:基础阶段(基础PHP程序员) 重点:把LNMP搞熟练(核心是安装配置基本操

PHP程序员的技术成长规划

PHP程序员的技术成长规划 作者:黑夜路人(2014/10/15) 按照了解的很多PHP/LNMP程序员的发展轨迹,结合个人经验体会,抽象出很多程序员对未来的迷漫,特别对技术学习的盲目和慌乱,简单梳理了这个每个阶段PHP程序员的技术要求,来帮助很多PHP程序做对照设定学习成长目标. 本文按照目前主流技术做了一个基本的梳理,整个是假设PHP程序员不是基础非常扎实的情况进行的设定,并且所有设定都非常具体明确清晰,可能会让人觉得不适,请理解仅代表一家之言.(未来技术变化不在讨论范围) 第一阶段:基础阶

Java程序性能优化——设计优化

原文出自:http://blog.csdn.net/anxpp/article/details/51914119,转载请注明出处,谢谢! 1.前言 OK,之前写了一篇文章:"23种设计模式介绍以及在Java中的应用"详细介绍了如何将设计模式应用到Java编程中,而本文旨在介绍如何利用他们优化我们的程序,使其性能更佳. 设计模式的详细介绍请参照上面链接中的文章,不是本文的重点. 而Java程序的性能优化,不一定就仅仅是以提高系统性能为目的的,还可能是以用户体验.系统可维护性等为目的. 2

静态资源文件自动压缩并替换成压缩版本(大型网站优化技术)

原文:静态资源文件自动压缩并替换成压缩版本(大型网站优化技术) 这一次,我总结和分享一项大型网站优化技术,那就是在项目中自动压缩静态资源文件(css.js),并让网站自动加载压缩后的资源文件.当然,这项技术在雅虎35条前端优化建议里也有记载,但它那只是给出一个理论的方案而已,并且采用的是外部压缩工具去压缩,而在我的项目中,是直接通过自己的程序自动化去压缩所有css.js文件,然后让页面直接加载所压缩后的资源,接下来直接进入主题. 本次实验使用的是PHP脚本语言,版本是PHP5.6,是在LINUX

C++ 应用程序性能优化

C++ 应用程序性能优化 C++ 应用程序性能优化 [email protected] 1. Introduction 对于几何造型内核OpenCASCADE,由于会涉及到大量的数值算法,如矩阵相关计算,微积分,Newton迭代法解方程,以及非线性优化的一些算法,如BFGS,FRPR,PSO等等用于多元函数的极值求解,所以这些数值算法的性能直接影响系统的性能.软件的性能优化是计算机软件开发过程中需要一直关注的重要因素,因此有必要学习下C++应用程序性能优化的方法. 在网上寻找相关资料时,发现这方

(转)PHP程序员的技术成长规划

(转)PHP程序员的技术成长规划 作者:黑夜路人(2014/10/15) 按照了解的很多PHP/LNMP程序员的发展轨迹,结合个人经验体会,抽象出很多程序员对未来的迷漫,特别对技术学习的盲目和慌乱,简单梳理了这个每个阶段PHP程序员的技术要求,来帮助很多PHP程序做对照设定学习成长目标. 本文按照目前主流技术做了一个基本的梳理,整个是假设PHP程序员不是基础非常扎实的情况进行的设定,并且所有设定都非常具体明确清晰,可能会让人觉得不适,请理解仅代表一家之言.(未来技术变化不在讨论范围) 第一阶段: