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 相关文章推荐
document 和 document.all 分别什么时候用
Jun 22 Javascript
JavaScript 工具库 Cloudgamer JavaScript Library v0.1 发布
Oct 29 Javascript
简单实用的js调试logger组件实现代码
Nov 20 Javascript
JavaScript使用yield模拟多线程的方法
Mar 19 Javascript
简介JavaScript中Math.LOG10E属性的使用
Jun 14 Javascript
利用HTML5的画布Canvas实现刮刮卡效果
Sep 06 Javascript
浅谈 Vue 项目优化的方法
Dec 16 Javascript
vue与vue-i18n结合实现后台数据的多语言切换方法
Mar 08 Javascript
vue组件实现可搜索下拉框扩展
Oct 23 Javascript
30分钟快速实现小程序语音识别功能
Nov 27 Javascript
使用JS监听键盘按下事件(keydown event)
Nov 07 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
Dec 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生成静态页面详解
2006/11/19 PHP
php is_file 判断给定文件名是否为一个正常的文件
2010/05/10 PHP
php GUID生成函数和类
2014/03/10 PHP
php根据日期显示所在星座的方法
2015/07/13 PHP
js的闭包的一个示例说明
2008/11/18 Javascript
js的alert弹出框出现乱码解决方案
2013/09/02 Javascript
Javascript之this关键字深入解析
2013/11/12 Javascript
javascript修改IMG标签的src问题
2014/03/28 Javascript
javaScript年份下拉列表框内容为当前年份及前后50年
2014/05/28 Javascript
jQuery学习笔记之jQuery原型属性和方法
2014/06/09 Javascript
jQuery实现圣诞节礼物动画案例解析
2016/12/25 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(二)
2017/01/21 Javascript
JavaScript寄生组合式继承实例详解
2018/01/06 Javascript
vue监听用户输入和点击功能
2019/09/27 Javascript
[59:08]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第一局
2016/02/27 DOTA
Python简单进程锁代码实例
2015/04/27 Python
Python os模块学习笔记
2015/06/21 Python
浅析Python基础-流程控制
2016/03/18 Python
Python实现新浪博客备份的方法
2016/04/27 Python
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
2018/01/11 Python
tensorflow TFRecords文件的生成和读取的方法
2018/02/06 Python
Python使用pyserial进行串口通信的实例
2019/07/02 Python
详解Python中list[::-1]的几种用法
2020/11/16 Python
python 实用工具状态机transitions
2020/11/21 Python
python 基于wx实现音乐播放
2020/11/24 Python
全网最全python库selenium自动化使用详细教程
2021/01/12 Python
HTML5时代CSS设置漂亮字体取代图片
2014/09/04 HTML / CSS
简单介绍CSS3中Media Query的使用
2015/07/07 HTML / CSS
P D PAOLA法国官网:西班牙著名的珠宝首饰品牌
2020/02/15 全球购物
澳大利亚厨房和家用电器购物网站:Bing Lee
2021/01/11 全球购物
大四学年自我鉴定
2013/11/13 职场文书
工程管理英文求职信
2014/03/18 职场文书
教师调动申请报告
2015/05/18 职场文书
鲁滨孙漂流记读书笔记
2015/06/30 职场文书
2019旅游导游工作总结
2019/06/27 职场文书
Nginx 反向代理解决跨域问题多种情况分析
2022/01/18 Servers