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 相关文章推荐
解析arp病毒背后利用的Javascript技术附解密方法
Aug 06 Javascript
flash javascript之间的通讯方法小结
Dec 20 Javascript
javascript 设置文本框中焦点的位置
Nov 20 Javascript
js 禁止选择功能实现代码(兼容IE/Firefox)
Apr 23 Javascript
DOM Scripting中的图片切换[兼容Firefox]
Jun 12 Javascript
jCallout 轻松实现气泡提示功能
Sep 22 Javascript
微信分享的标题、缩略图、连接及描述设置方法
Oct 14 Javascript
jquery简单实现图片切换效果的方法
May 12 Javascript
详解AngularJS中的表达式使用
Jun 16 Javascript
js禁止浏览器的回退事件
Apr 20 Javascript
详解JavaScript 浮点数运算的精度问题
Jul 23 Javascript
layui使用templet格式化表格数据的方法
Sep 16 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/07/04 PHP
CMS中PHP判断系统是否已经安装的方法示例
2014/07/26 PHP
php使用session二维数组实例
2014/11/06 PHP
PHP扩展开发入门教程
2015/02/26 PHP
javascript模拟的Ping效果代码 (Web Ping)
2011/03/13 Javascript
Jquery使用val方法读写value值
2015/05/18 Javascript
微信企业号开发之微信考勤百度地图定位
2015/09/11 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
2015/11/02 Javascript
JavaScript判断DIV内容是否为空的方法
2016/01/29 Javascript
BootStrap select2 动态改变值的方法
2017/02/10 Javascript
基于JavaScript实现拖动滑块效果
2017/02/16 Javascript
基于node.js之调试器详解
2017/08/22 Javascript
解决nodejs的npm命令无反应的问题
2018/05/17 NodeJs
vue中$set的使用(结合在实际应用中遇到的坑)
2018/07/10 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
[39:00]Optic vs VP 2018国际邀请赛淘汰赛BO3 第三场 8.24
2018/08/25 DOTA
[16:01]夜魇凡尔赛茶话会 第二期01:你比划我猜
2021/03/11 DOTA
深入分析python数据挖掘 Json结构分析
2018/04/21 Python
python调用OpenCV实现人脸识别功能
2018/05/25 Python
Python实现按逗号分隔列表的方法
2018/10/23 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
2019/03/18 Python
Python字符串的常见操作实例小结
2019/04/08 Python
Python二维码生成识别实例详解
2019/07/16 Python
详解Matplotlib绘图之属性设置
2019/08/23 Python
Django框架 querySet功能解析
2019/09/04 Python
Keras中的多分类损失函数用法categorical_crossentropy
2020/06/11 Python
在PyCharm中安装PaddlePaddle的方法
2021/02/05 Python
伦敦平价潮流珠宝首饰品牌:Astrid & Miyu
2016/10/10 全球购物
澳大利亚购买太阳镜和眼镜网站:Glamoureyes
2020/09/22 全球购物
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
2012/06/05 面试题
顺丰快递Java软件工程师面试题
2015/07/31 面试题
办公室文秘自我评价
2013/09/21 职场文书
《草原》教学反思
2014/02/15 职场文书
个人工作主要事迹
2014/05/08 职场文书
蛋糕店创业计划书范文
2014/09/21 职场文书
ElementUI实现el-form表单重置功能按钮
2021/07/21 Javascript