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中:last选择器用法实例
Dec 30 Javascript
Angular中$cacheFactory的作用和用法实例详解
Aug 19 Javascript
Angular2 (RC5) 路由与导航详解
Sep 21 Javascript
Angular 2应用的8个主要构造块有哪些
Oct 17 Javascript
AngularJS中transclude用法详解
Nov 03 Javascript
详解Javascript中DOM的范围
Feb 13 Javascript
详解Vue.js分发之作用域槽
Jun 13 Javascript
ZeroClipboard.js使用一个flash复制多个文本框
Jun 19 Javascript
微信小程序swiper组件用法实例分析【附源码下载】
Dec 07 Javascript
vue中Element-ui 输入银行账号每四位加一个空格的实现代码
Sep 14 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
Dec 19 Javascript
使用JavaScript实现网页秒表功能(含开始、暂停、继续、重置功能)
Jun 05 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/09/01 PHP
PHP获取毫秒级时间戳的方法
2015/04/15 PHP
laravel config文件配置全局变量的例子
2019/10/13 PHP
“不能执行已释放的Script代码”错误的原因及解决办法
2007/09/09 Javascript
JAVASCRIPT下判断IE与FF的比较简单的方式
2008/10/17 Javascript
ExtJS 2.0实用简明教程之应用ExtJS
2009/04/29 Javascript
onclick与listeners的执行先后问题详细解剖
2013/01/07 Javascript
jquery实现弹出层遮罩效果的简单实例
2014/03/03 Javascript
JS实现让网页背景图片斜向移动的方法
2015/02/25 Javascript
js实现百度联盟中一款不错的图片切换效果完整实例
2015/03/04 Javascript
JavaScript动态添加style节点的方法
2015/06/09 Javascript
jquery中object对象循环遍历的方法
2015/12/18 Javascript
学习JavaScript设计模式之策略模式
2016/01/12 Javascript
AngularJS过滤器filter用法总结
2016/12/13 Javascript
详解如何在NodeJS项目中优雅的使用ES6
2017/04/22 NodeJs
vue elementui el-form rules动态验证的实例代码详解
2019/05/23 Javascript
vue中的面包屑导航组件实例代码
2019/07/01 Javascript
JS实现提示框跟随鼠标移动
2019/08/27 Javascript
JavaScript实现拖拽功能
2020/02/11 Javascript
[01:30]DOTA2上海特锦赛现场采访 Loda倾情献唱
2016/03/25 DOTA
python结合selenium获取XX省交通违章数据的实现思路及代码
2016/06/26 Python
Python入门_学会创建并调用函数的方法
2017/05/16 Python
PyQt 线程类 QThread使用详解
2017/07/16 Python
python中property和setter装饰器用法
2019/12/19 Python
django 实现手动存储文件到model的FileField
2020/03/30 Python
Python Scrapy多页数据爬取实现过程解析
2020/06/12 Python
Python字符串查找基本操作代码案例
2020/10/27 Python
CSS3实现文字波浪线效果示例代码
2016/11/20 HTML / CSS
H5 canvas中width、height和style的宽高区别详解
2018/11/02 HTML / CSS
英国时尚优质的女装:Hope Fashion
2018/08/14 全球购物
园林专业毕业生自荐信
2014/07/04 职场文书
酒店工程部岗位职责
2015/02/12 职场文书
大学生个人年度总结范文
2015/02/15 职场文书
民主生活会主持词
2015/07/01 职场文书
JS中一些高效的魔法运算符总结
2021/05/06 Javascript
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android