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


Posted in Javascript onNovember 24, 2017

本文实例讲述了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的变大,次数也会非常恐怖增长。

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

当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);

结果如下:

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

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

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

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

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实现数独解法
Mar 14 Javascript
easyui window refresh 刷新两次的解决方法(推荐)
May 18 Javascript
jQuery+ajax的资源回收处理机制分析
Jan 07 Javascript
Angular.js自动化测试之protractor详解
Jul 07 Javascript
JS常见构造模式实例对比分析
Aug 27 Javascript
Angular ElementRef简介及其使用
Oct 01 Javascript
Windows下支持自动更新的Electron应用脚手架的方法
Dec 24 Javascript
浅谈JavaScript_DOM学习篇_图片切换小案例
Mar 19 Javascript
基于JavaScript 实现拖放功能
Sep 12 Javascript
SSM+layUI 根据登录信息显示不同的页面方法
Sep 20 Javascript
jQuery 查找元素操作实例小结
Oct 02 jQuery
uniapp实现可以左右滑动导航栏
Oct 21 Javascript
详解vue-cli脚手架build目录中的dev-server.js配置文件
Nov 24 #Javascript
javaScript和jQuery自动加载简单代码实现方法
Nov 24 #jQuery
Bootstrap modal只加载一次数据的解决办法(推荐)
Nov 24 #Javascript
浅谈vue-cli加载不到dev-server.js的解决办法
Nov 24 #Javascript
浅谈Angular文字折叠展开组件的原理分析
Nov 24 #Javascript
vue 文件目录结构详解
Nov 24 #Javascript
获取本机IP地址的实例(JavaScript / Node.js)
Nov 24 #Javascript
You might like
php时间不正确的解决方法
2008/04/09 PHP
php实现把url转换迅雷thunder资源下载地址的方法
2014/11/07 PHP
ThinkPHP5 验证器的具体使用
2018/05/31 PHP
PHP实现的文件浏览器功能简单示例
2019/09/12 PHP
用JavaScript获取网页中的js、css、Flash等文件
2006/12/20 Javascript
理解Javascript_01_理解内存分配原理分析
2010/10/11 Javascript
Javascript的常规数组和关联数组对比小结
2012/05/24 Javascript
javascript 正则表达式相关应介绍
2012/11/27 Javascript
javascript提取URL的搜索字符串中的参数(自定义函数实现)
2013/01/22 Javascript
chrome下img加载对height()的影响示例探讨
2014/05/26 Javascript
Node.js模块加载详解
2014/08/16 Javascript
原生js实现可拖拽效果
2017/02/28 Javascript
vue-router配合ElementUI实现导航的实例
2018/02/11 Javascript
jQuery实现鼠标移入移出事件切换功能示例
2018/09/06 jQuery
超简单的微信小程序轮播图
2019/11/22 Javascript
JS实现TITLE悬停长久显示效果完整示例
2020/02/11 Javascript
vue 里面的 $forceUpdate() 强制实例重新渲染操作
2020/09/21 Javascript
Python操作串口的方法
2015/06/17 Python
Tensorflow中的placeholder和feed_dict的使用
2018/07/09 Python
浅谈python函数调用返回两个或多个变量的方法
2019/01/23 Python
python3中eval函数用法使用简介
2019/08/02 Python
python 微信好友特征数据分析及可视化
2020/01/07 Python
django的autoreload机制实现
2020/06/03 Python
Django def clean()函数对表单中的数据进行验证操作
2020/07/09 Python
html5+css3进度条倒计时动画特效代码【推荐】
2016/03/08 HTML / CSS
HTML5 新标签全部总汇(推荐)
2016/06/13 HTML / CSS
韩国三星旗下的一家超市连锁店:Home Plus
2016/07/30 全球购物
英国的知名精品百货公司:House of Fraser(福来德)
2016/08/14 全球购物
Falconeri美国官网:由羊绒和羊毛制成的针织服装
2018/04/08 全球购物
System.Array.CopyTo()和System.Array.Clone()有什么区别
2016/06/20 面试题
哈理工毕业生的求职信
2013/12/22 职场文书
道路交通安全实施方案
2014/03/12 职场文书
商务日语专业毕业生自荐信
2014/03/27 职场文书
2014年计生工作总结
2014/11/21 职场文书
2014年教师思想工作总结
2014/12/03 职场文书
2016年党员干部廉政承诺书
2016/03/24 职场文书