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 相关文章推荐
用javascript自动显示最后更新时间
Mar 15 Javascript
Jquery ThickBox插件使用心得(不建议使用)
Sep 08 Javascript
cookie的复制与使用记住用户名实现代码
Nov 04 Javascript
jQuery实现行文字链接提示效果的方法
Mar 10 Javascript
浅谈Javascript的静态属性和原型属性
May 07 Javascript
c#程序员对TypeScript的认识过程
Jun 19 Javascript
浅谈Javascript中substr和substring的区别
Sep 30 Javascript
javascript闭包概念简单解析(推荐)
Jun 03 Javascript
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
Jul 05 Javascript
JS中传递参数的几种不同方法比较
Jan 20 Javascript
vue中遇到的坑之变化检测问题(数组相关)
Oct 13 Javascript
layui table 列宽百分比显示的实现方法
Sep 28 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学习笔记 PHP面向对象的程序设计
2011/06/13 PHP
php 网上商城促销设计实例代码
2012/02/17 PHP
php统计时间和内存使用情况示例分享
2014/03/13 PHP
php实现事件监听与触发的方法
2014/11/21 PHP
PHP实现验证码校验功能
2017/11/16 PHP
laravel Validator ajax返回错误信息的方法
2019/09/29 PHP
让IE6支持min-width和max-width的方法
2010/06/25 Javascript
Javascript中的五种数据类型详解
2014/12/26 Javascript
基于BootStrap Metronic开发框架经验小结【七】数据的导入、导出及附件的查看处理
2016/05/12 Javascript
使用jquery提交form表单并自定义action的实现代码
2016/05/25 Javascript
jQuery.ajax实现根据不同的Content-Type做出不同的响应
2016/11/03 Javascript
js无提示关闭浏览器窗口的两种方法分析
2016/11/06 Javascript
js拖拽功能实现代码解析
2016/11/28 Javascript
ReactNative之键盘Keyboard的弹出与消失示例
2017/07/11 Javascript
JavaScript实现旋转轮播图
2020/08/18 Javascript
Angular2学习笔记之数据绑定的示例代码
2018/01/03 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
2018/05/15 Javascript
JS通过ajax + 多列布局 + 自动加载实现瀑布流效果
2019/05/30 Javascript
Vue CLI项目 axios模块前后端交互的使用(类似ajax提交)
2019/09/01 Javascript
小程序实现投票进度条
2019/11/20 Javascript
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
2020/10/12 Javascript
[05:45]Ti4观战指南(下)
2014/07/07 DOTA
Python实现随机创建电话号码的方法示例
2018/12/07 Python
python仿抖音表白神器
2019/04/08 Python
利用Python小工具实现3秒钟将视频转换为音频
2019/10/29 Python
TensorFLow 变量命名空间实例
2020/02/11 Python
解决jupyter notebook import error但是命令提示符import正常的问题
2020/04/15 Python
带你学习Python如何实现回归树模型
2020/07/16 Python
Python接口自动化测试的实现
2020/08/28 Python
泰海淘:泰国king Power王权免税集团旗下跨境海淘综合型电商
2020/07/26 全球购物
招标承诺书
2014/08/30 职场文书
努力工作保证书
2015/02/28 职场文书
营运督导岗位职责
2015/04/10 职场文书
Javascript之datagrid查询详解
2021/09/15 Javascript
python创建字典及相关管理操作
2022/04/13 Python