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 DOM 学习第七章 表单的扩展
Feb 19 Javascript
ASP.NET jQuery 实例14 在ASP.NET form中校验时间范围
Feb 03 Javascript
jQuery+CSS 半开折叠效果原理及代码(自写)
Mar 04 Javascript
IE下Ajax缓存问题的快速解决方法(get方式)
Jan 09 Javascript
javascript 实现map集合
Apr 03 Javascript
js实现点击向下展开的下拉菜单效果代码
Sep 01 Javascript
基于jQuery实现点击弹出层实例代码
Jan 01 Javascript
jQuery使用ajax跨域获取数据的简单实例
May 18 Javascript
原生js实现鼠标跟随效果
Feb 28 Javascript
seajs下require书写约定实例分析
May 16 Javascript
JS设置自定义快捷键并实现图片上下左右移动
Oct 17 Javascript
在 HTML 页面中使用 React的场景分析
Jan 18 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使用数组实现队列
2012/02/05 PHP
ThinkPHP查询返回简单字段数组的方法
2014/08/25 PHP
PHP文件缓存类示例分享
2015/01/30 PHP
php发送html格式文本邮件的方法
2015/06/10 PHP
详解laravel passport OAuth2.0的4种模式
2019/11/04 PHP
slice函数的用法 之不错的应用
2006/12/29 Javascript
jquery 插件之仿“卓越亚马逊”首页弹出菜单效果
2008/12/25 Javascript
jQuery生成asp.net服务器控件的代码
2010/02/04 Javascript
js动态调用css属性的小规律及实例说明
2013/12/28 Javascript
跟我学Nodejs(一)--- Node.js简介及安装开发环境
2014/05/20 NodeJs
js插件设置innerHTML时在IE8下提示“未知运行时错误”解决方法
2015/04/25 Javascript
Bootstrap每天必学之标签与徽章
2015/11/27 Javascript
jQuery+canvas实现简单的球体斜抛及颜色动态变换效果
2016/01/28 Javascript
js 创建对象 经典模式全面了解
2016/08/16 Javascript
jQuery视差滚动效果网页实现方法经验总结
2016/09/29 Javascript
详解js的六大数据类型
2016/12/27 Javascript
BootStrap中Table隐藏后显示问题的实现代码
2017/08/31 Javascript
在vue中封装可复用的组件方法
2018/03/01 Javascript
详解JavaScript中的数组合并方法和对象合并方法
2018/05/11 Javascript
简单了解Python下用于监视文件系统的pyinotify包
2015/11/13 Python
全面理解Python中self的用法
2016/06/04 Python
flask-restful使用总结
2018/12/04 Python
详解Python列表赋值复制深拷贝及5种浅拷贝
2019/05/15 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
2020/03/13 Python
python:HDF和CSV存储优劣对比分析
2020/06/08 Python
python实现二分查找算法
2020/09/18 Python
荷兰天然和有机产品网上商城:BigGreenSmile.nl
2020/07/26 全球购物
公司员工的自我评价范例
2013/11/01 职场文书
九年级数学教学反思
2014/02/02 职场文书
幼儿园庆六一活动方案
2014/03/06 职场文书
运动会入场口号
2014/06/07 职场文书
公司欠款证明
2015/06/24 职场文书
食品卫生管理制度
2015/08/06 职场文书
解析在浏览器地址栏输入一个URL后发生了什么
2021/06/21 Servers
Python连接Postgres/Mysql/Mongo数据库基本操作大全
2021/06/29 Python
Win11 Build 22000.51版本文件资源管理器“命令栏”和上下文菜单有什么新变化?
2021/11/21 数码科技