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 相关文章推荐
JQUERY的属性选择符和自定义选择符使用方法(二)
Apr 07 Javascript
JQUERY 实现窗口滚动搜索框停靠效果(类似滚动停靠)
Mar 27 Javascript
showModelDialog弹出文件下载窗口的使用示例
Nov 19 Javascript
JavaScript 实现简单的倒计时弹窗DEMO附图
Mar 05 Javascript
JavaScript使用push方法添加一个元素到数组末尾用法实例
Apr 06 Javascript
Javascript验证方法大全
Sep 21 Javascript
javascript实现无法关闭的弹框
Nov 27 Javascript
js实现每日签到功能
Nov 29 Javascript
vue组件间的参数传递实例详解
Apr 26 Javascript
Vue中UI组件库之Vuex与虚拟服务器初识
May 07 Javascript
vue+elementui实现点击table中的单元格触发事件--弹框
Jul 18 Javascript
结合axios对项目中的api请求进行封装操作
Sep 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 日志缩略名的创建函数代码
2010/05/26 PHP
php截取后台登陆密码的代码
2012/05/05 PHP
详谈PHP文件目录基础操作
2014/11/11 PHP
Zend Framework基本页面布局分析
2016/03/19 PHP
PHP7+Nginx的配置与安装教程详解
2016/05/10 PHP
PHP 自动加载的简单实现(推荐)
2016/08/12 PHP
PHP的mysqli_select_db()函数讲解
2019/01/23 PHP
小型js框架veryide.librar源代码
2009/03/05 Javascript
jQuery 淡出一个图像到另一个图像的实现代码
2013/06/12 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
2013/11/03 Javascript
jQuery实现的淡入淡出二级菜单效果代码
2015/09/15 Javascript
Vue.js每天必学之指令系统与自定义指令
2016/09/07 Javascript
js 轮播效果实例分享
2016/12/28 Javascript
ES6(ECMAScript 6)新特性之模板字符串用法分析
2017/04/01 Javascript
angular8.5集成TinyMce5的使用和详细配置(推荐)
2020/11/16 Javascript
[03:09]2014DOTA2国际邀请赛 赛场上的美丽风景线 中国Coser也爱DOTA2
2014/07/20 DOTA
Python中的迭代器漫谈
2015/02/03 Python
python采集百度百科的方法
2015/06/05 Python
python链接Oracle数据库的方法
2015/06/28 Python
Python实现获取域名所用服务器的真实IP
2015/10/25 Python
python使用Pycharm创建一个Django项目
2018/03/05 Python
python 接口返回的json字符串实例
2018/03/27 Python
Python django框架应用中实现获取访问者ip地址示例
2019/05/17 Python
pytorch获取vgg16-feature层输出的例子
2019/08/20 Python
python实现的汉诺塔算法示例
2019/10/23 Python
H5新属性audio音频和video视频的控制详解(推荐)
2016/12/09 HTML / CSS
判断单链表中是否存在环
2012/07/16 面试题
工作违纪检讨书
2014/02/17 职场文书
相亲大会策划方案
2014/06/05 职场文书
小学生关于梦想的演讲稿
2014/08/22 职场文书
会计师事务所实习证明
2014/11/16 职场文书
撤诉申请怎么写
2015/05/19 职场文书
《曹冲称象》教学反思
2016/02/20 职场文书
python 如何做一个识别率百分百的OCR
2021/05/29 Python
Python实现byte转integer
2021/06/03 Python
JS实现数组去重的11种方法总结
2022/04/04 Javascript