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获取form里的表单元素的示例代码
Feb 14 Javascript
jquery自动填充勾选框即把勾选框打上true
Mar 24 Javascript
EasyUI,点击开启编辑框,并且编辑框获得焦点的方法
Mar 01 Javascript
JavaScript用select实现日期控件
Jul 17 Javascript
基于JS实现的笛卡尔乘积之商品发布
May 13 Javascript
jQuery过滤选择器经典应用
Aug 18 Javascript
JS实现禁止鼠标右键的功能
Oct 15 Javascript
webpack入门+react环境配置
Feb 08 Javascript
jquery append与appendTo方法比较
May 24 jQuery
webpack dll打包重复问题优化的解决
Oct 10 Javascript
vue中使用微信公众号js-sdk踩坑记录
Mar 29 Javascript
js实现无刷新监听URL的变化示例代码详解
Jun 03 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学习之数组值的操作
2011/04/17 PHP
将时间以距今多久的形式表示,PHP,js双版本
2012/09/25 PHP
部署PHP项目应该注意的几点事项分享
2013/12/20 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
2014/07/01 PHP
php对xml文件的增删改查操作实现方法分析
2017/05/19 PHP
php如何修改SESSION的生存存储时间的实例代码
2017/07/05 PHP
php实现姓名根据首字母排序的类与方法(实例代码)
2018/05/16 PHP
Jquery替换已存在于element上的event的方法
2010/03/09 Javascript
js遍历、动态的添加数据的小例子
2013/06/22 Javascript
自制的文件上传JS控件可支持IE、chrome、firefox etc
2014/04/18 Javascript
jquery中change()用法实例分析
2015/02/06 Javascript
ionic js 模型 $ionicModal 可以遮住用户主界面的内容框
2016/06/06 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
2016/06/26 Javascript
自动化测试读写64位操作系统的注册表
2016/08/15 Javascript
深入理解vue-loader如何使用
2017/06/06 Javascript
jQuery实现注册会员时密码强度提示信息功能示例
2017/09/05 jQuery
详解vue2 $watch要注意的问题
2017/09/08 Javascript
vue axios 二次封装的示例代码
2017/12/08 Javascript
详解在vue-cli中使用graphql即vue-apollo的用法
2018/09/08 Javascript
微信小程序发送短信验证码完整实例
2019/01/07 Javascript
微信小程序学习笔记之文件上传、下载操作图文详解
2019/03/29 Javascript
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
2020/06/06 jQuery
js实现电灯开关效果
2021/01/19 Javascript
uniapp微信小程序:key失效的解决方法
2021/01/20 Javascript
python切换hosts文件代码示例
2013/12/31 Python
python pygame模块编写飞机大战
2018/11/20 Python
深入了解Django中间件及其方法
2019/07/26 Python
python 爬取疫情数据的源码
2020/02/09 Python
Python 实现自动完成A4标签排版打印功能
2020/04/09 Python
Python CSS选择器爬取京东网商品信息过程解析
2020/06/01 Python
Keras在训练期间可视化训练误差和测试误差实例
2020/06/16 Python
天猫精选:上天猫,就够了
2016/09/21 全球购物
简历自荐信
2013/12/02 职场文书
爱与责任演讲稿
2014/05/20 职场文书
2019求职信:应届生求职信范文
2019/04/24 职场文书
Python+Appium实现自动抢微信红包
2021/05/21 Python