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 select控制插件
Aug 17 Javascript
IE的fireEvent方法概述及应用
Feb 22 Javascript
JsRender for index循环索引用法详解
Oct 31 Javascript
js中数组排序sort方法的原理分析
Nov 20 Javascript
基于jquery和svg实现超炫酷的动画特效
Dec 09 Javascript
JS实现自动切换文字的导航效果代码
Aug 27 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
Feb 23 Javascript
js实时获取窗口大小变化的实例代码
Nov 18 Javascript
socket.io实现在线群聊功能
Apr 07 Javascript
VUE页面中加载外部HTML的示例代码
Sep 20 Javascript
微信小程序分包加载代码实现方法详解
Sep 23 Javascript
JS array数组检测方式解析
May 19 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
Win2000+Apache+MySql+PHP4+PERL安装使用小结
2006/10/09 PHP
PHP封装请求类实例分析【基于Yii框架】
2019/10/17 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
php操作redis数据库常见方法实例总结
2020/02/20 PHP
js 获取服务器控件值的代码
2010/03/05 Javascript
基于jquery的inputlimiter 实现字数限制功能
2010/05/30 Javascript
extjs之去除s.gif的影响
2010/12/25 Javascript
非常棒的10款jQuery 幻灯片插件
2011/06/14 Javascript
setTimeout函数兼容各主流浏览器运行执行效果实例
2013/06/13 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
2014/12/22 Javascript
jQuery实现渐变下拉菜单的简单方法
2015/03/11 Javascript
jquery实现不包含当前项的选择器实例
2015/06/25 Javascript
JS实现的倒计时效果实例(2则实例)
2015/12/23 Javascript
AngularJS应用开发思维之依赖注入3
2016/08/19 Javascript
纯javascript版日历控件
2016/11/24 Javascript
angular ng-repeat数组中的数组实例
2017/02/18 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
2017/06/12 jQuery
JS实现图片放大镜插件详解
2017/11/06 Javascript
解决Vue+Element ui开发中碰到的IE问题
2018/09/03 Javascript
了解JavaScript表单操作和表单域
2019/05/27 Javascript
[02:54]DOTA2英雄基础教程 撼地者
2014/01/14 DOTA
跟老齐学Python之从格式化表达式到方法
2014/09/28 Python
Python中一行和多行import模块问题
2018/04/01 Python
python 实现登录网页的操作方法
2018/05/11 Python
Python实现平行坐标图的两种方法小结
2019/07/04 Python
python支持多线程的爬虫实例
2019/12/21 Python
Links of London官方网站:英国标志性的珠宝品牌
2017/04/09 全球购物
妈妈的账单教学反思
2014/02/06 职场文书
购房协议书
2014/04/11 职场文书
二年级学生期末评语
2014/12/26 职场文书
项目经理岗位职责
2015/01/31 职场文书
六一晚会主持词开场白
2015/05/28 职场文书
2016反腐倡廉警示教育心得体会
2016/01/13 职场文书
MySQL令人咋舌的隐式转换
2021/04/05 MySQL
解析探秘fescar分布式事务实现原理
2022/02/28 Java/Android
LeetCode189轮转数组python示例
2022/08/05 Python