当前位置:首页 > 日记 > 正文

JavaScript程序设计高级算法之动态规划实例分析

JavaScript程序设计高级算法之动态规划实例分析

本文实例讲述了JavaScript程序设计高级算法之动态规划。分享给大家供大家参考,具体如下:

主要是看了《数据结构与算法》有所感悟,虽然这本书被挺多人诟病的,说这有漏洞那有漏洞,但并不妨碍我们从中学习知识。

其实像在我们前端的开发中,用到的高级算法并不多,大部分情况if语句,for语句,swith语句等等,就可以解决了。稍微复杂的,可能会想到用递归去的解决。

但要注意的是递归写起来简洁,但实际上执行的效率并不高。

我们再看看动态规划的算法:

动态规划解决方案从底部开始解决问题, 将所有小问题解决掉, 然后合并成一个整体解决方案, 从而解决掉整个大问题 。

实例举例  (计算斐波那契数列)

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........

这个数列从第3项开始,每一项都等于前两项之和。

针对这个数列,可以用一个递归的函数去计算第n项 数值

// 斐波那契数列function recurFib(n) {    if(n < 2){      return n ;    }else {//          document.write("第"+(n-1)+"次计算 n-1="+(n-1)+recurFib(n-1)+'   ');//          document.write("n-2="+(n-2)+recurFib(n-2)+"<br>");      return recurFib(n-1)+recurFib(n-2)    }}

确实是个非常简洁的代码,上面有被注释的代码 ,是用来打印出当n=多少,要执行多少次函数,不过明眼人一眼就能看出来执行的次数随着n的变大,次数也会非常恐怖增长。

当n=5的时候,递归树已经长的很大了……可以预见当n=10,甚至n=100的时候……

明白了递归函数执行效率之差,我们再来看的动态规划是如何做的

function dynFib(n) {  let val = [];  for(let i = 0; i <= n; ++i){    val[i]=0;  }  if(n ===1 || n === 2){    return 1;  }  else {    val[1] =1;    val[2] = 2;    for(let i = 3; i <= n; ++i){      val[i] = val [i-1] +val[i-2] ;    }  }  return val[n-1]}

通过数组 val 中保存了中间结果, 如果要计算的斐波那契数是 1 或者 2, 那么 if 语句会返回 1。 否则,数值 1 和 2 将被保存在 val 数组中 1 和 2 的位置。

循环将会从 3 到输入的参数之间进行遍历, 将数组的每个元素赋值为前两个元素之和, 循环结束, 数组的最后一个元素值即为最终计算得到的斐波那契数值, 这个数值也将作为函数的返回值。

接下来可以写个简单的测试函数,来对比两者的运行时间。

// 定义一个测试函数,将待测函数作为参数传入function test(func,n){  let start = new Date().getTime();//起始时间  let res = func(n);//执行待测函数  document.write('<br>'+'当n='+n+'的时候 '+res+'<br>');  let end = new Date().getTime();//结束时间  return (end - start)+"ms";//返回函数执行需要时间}

打印函数执行

let time = test(recurFib,40);document.write(time);let time2 = test(dynFib,40);document.write(time2);

结果如下:

最后, 你或许已经意识到在使用迭代的方案计算斐波那契数列时, 是可以不使用数组的。

需要用到数组的原因是因为动态规划算法通常需要将中间结果保存起来。

以下是迭代版本的斐波那契函数义

function iterFib(n) {  let last = 1;  let nextLast = 1;  let result = 1;  for (let i = 2; i < n; ++i) {    result = last + nextLast;    nextLast = last;    last = result;  }  return result;}

当然这个迭代版本的与数组的版本的效率也是相同的。

更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript数据结构与算法技巧总结》、《JavaScript数学运算用法总结》、《JavaScript排序算法总结》、《JavaScript遍历算法与技巧总结》、《JavaScript查找算法技巧总结》及《JavaScript错误与调试技巧总结》

希望本文所述对大家JavaScript程序设计有所帮助。

相关文章

Word中出现文档打不开出错误时的操

Word中出现文档打不开出错误时的操

文档,错误,操作方法,打不开,操作步骤,  发现电脑里面的word无法打开,刚开始还以为是整个office崩溃了,然后又试了一下PPT灯片和excel表格,都能正常打开,只有word出问题了。今天,小编就教大家在Word中出现文档打不开出错误时的操作方法。Word中…

如何将Excel2007文本格式转换为数

如何将Excel2007文本格式转换为数

数字,文本,转换为,格式,如何将,  文本格式要将其转换成为数字?首先,文本格式可以通过设置单元格的字体格式得到。以下是小编为您带来的关于将Excel2007文本格式转换为数字,希望对您有所帮助。将Excel2007文本格式转换为数字1、选中要转换格…

JavaScript 事件对内存和性能的影

JavaScript 事件对内存和性能的影

事件,性能,内存,电脑软件,JavaScript,虽说事件处理程序可以为现代 Web 页面添加很强的交互能力,但是不分青红皂白就添加大量的事件处理程序绝对是一种愚蠢的行为。我们来分析一下:事件处理程序本质上是一种函数,是一种对象,存放在内存中,设置大…

excel 使用公式进行文本拼接的方法

excel 使用公式进行文本拼接的方法

方法,文本,公式,电脑软件,excel,  在Excel中经常需要用到公式把文本拼接起来,具体怎么做呢?接下来是小编为大家带来的excel 使用公式进行文本拼接的方法,供大家参考。excel 使用公式进行文本拼接的方法文本拼接步骤1:Excel 2013 单元格字符…

详解基于 axios 的 Vue 项目 http

详解基于 axios 的 Vue 项目 http

请求,优化,项目,详解,电脑软件,对于需要大量使用 http 请求的项目,我们通常会选择对 http 请求的方法进行二次封装,以便增加统一的拦截器,或者统一处理阻止重复提交之类的逻辑。Vue.js 的项目中我们选择使用了 axios 这样一个 http 库,下面也就…

WPS2016怎么样制作堆积柱形图图表

WPS2016怎么样制作堆积柱形图图表

图图,电脑软件,  WPS2016编辑文件的时候,想要插入图表,这就需要设计一个图表。以下是小编为您带来的关于WPS2016制作堆积柱形图图表,希望对您有所帮助。WPS2016制作堆积柱形图图表1、打开【WPS】软件。2、点击【WPS】文字下拉框中的新建,新建…

WPS表格如何添加漂亮的边框和底纹

WPS表格如何添加漂亮的边框和底纹

边框,底纹,表格,漂亮,电脑软件,  WPS表格有很多样式,可以随意的添加边框和底纹,wps中的表格想要制作成更漂亮的效果,就需要添加一些底纹和边框效果。以下是小编为您带来的关于WPS表格添加漂亮的边框和底纹,希望对您有所帮助。WPS表格添加漂亮…

Word中2010版进行为标题段文字添加

Word中2010版进行为标题段文字添加

边框,文字,操作技巧,标题,操作步骤,  在word2010中如何为标题段文字添加阴影边框,具体该怎么去进行操作的呢?今天,小编就教大家在Word中2010版进行为标题段文字添加阴影边框的操作技巧。Word中2010版进行为标题段文字添加阴影边框的操作步…

ppt2013加页码不显示的解决方法

ppt2013加页码不显示的解决方法

解决方法,显示,页码,电脑软件,strong,  ppt2013是一款十分普遍地幻灯片编辑的软件。有时我们编辑的量太大,页数太多,需要插入页码但是不显示怎么办?下面给大家分享PPT页面不显示的解决方法。ppt2013加页码不显示的解决方法步骤1在编辑框中&…

轻松学习Javascript闭包

轻松学习Javascript闭包

闭包,学习,轻松,电脑软件,Javascript,闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。当function里嵌套function时,内部的function可以访问外部function里的变量。function foo(x) { var tmp = 3; functi…

qq安全中心手机密保解绑操作方法

qq安全中心手机密保解绑操作方法

安全中心,操作方法,方法,机密,电脑软件,  关于手机密保如何解绑问题,在此先表示遗憾,因为目前QQ已经不支持解绑功能,因而也不要怀疑为什么找不到&ldquo;解绑&rdquo;按钮。但如果是手机更换或者丢失,那么可以通过更换密保手机实现,今天小编给你…

Word文档插入GIF动态的方法是什么

Word文档插入GIF动态的方法是什么

文档,方法,动态,动态图片,电脑软件,  正常情况下word可以插入GIF动画,但是插入的GIF动态图片不会动。那么在Word文档中,应该如何插入动态的图片。以下是小编为您带来的关于Word文档插入GIF动态图片,希望对您有所帮助。Word文档插入GIF动态图…