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实现的让超出显示范围外的导航自动固定屏幕最顶上
Sep 22 Javascript
深入分析JSONP跨域的原理
Dec 10 Javascript
jQuery简单实现禁用右键菜单
Mar 10 Javascript
基于PHP和Mysql相结合使用jqGrid读取数据并显示
Dec 02 Javascript
bootstrap+jQuery实现的动态进度条功能示例
May 25 jQuery
JavaScript this绑定过程深入详解
Dec 07 Javascript
vue 弹窗时 监听手机返回键关闭弹窗功能(页面不跳转)
May 10 Javascript
小程序最新获取用户昵称和头像的方法总结
Sep 23 Javascript
原生js实现下拉选项卡
Nov 27 Javascript
webpack 最佳配置指北(推荐)
Jan 07 Javascript
ES6 proxy和reflect的使用方法与应用实例分析
Feb 15 Javascript
在antd中setFieldsValue和defaultVal的用法
Oct 29 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
第四节 构造函数和析构函数 [4]
2006/10/09 PHP
destoon在360浏览器下出现用户被强行注销的解决方法
2014/06/26 PHP
PHP数组游标实现对数组的各种操作详解
2016/01/26 PHP
php 猴子摘桃的算法
2017/06/20 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
php 后端实现JWT认证方法示例
2018/09/04 PHP
Uglifyjs(JS代码优化工具)入门 安装使用
2020/04/13 Javascript
IE下写xml文件的两种方式(fso/saveAs)
2013/08/05 Javascript
快速解决jquery之get缓存问题的最简单方法介绍
2013/12/19 Javascript
JS实现简洁、全兼容的拖动层实例
2015/05/13 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
2015/11/09 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
2016/02/16 Javascript
配置nodejs环境的方法
2017/05/13 NodeJs
深入理解vue-loader如何使用
2017/06/06 Javascript
vue2.0使用v-for循环制作多级嵌套菜单栏
2018/06/25 Javascript
浅谈vue父子组件怎么传值
2018/07/21 Javascript
了解JavaScript中的选择器
2019/05/24 Javascript
express框架下使用session的方法
2019/07/31 Javascript
如何使用three.js 制作一个三维的推箱子游戏
2020/07/29 Javascript
[00:37]DOTA2上海特级锦标赛 Secert 战队宣传片
2016/03/03 DOTA
Python程序设计入门(4)模块和包
2014/06/16 Python
Python输出汉字字库及将文字转换为图片的方法
2016/06/04 Python
Windows和Linux下Python输出彩色文字的方法教程
2017/05/02 Python
用Python徒手撸一个股票回测框架搭建【推荐】
2019/08/05 Python
python列表返回重复数据的下标
2020/02/10 Python
Django choices下拉列表绑定实例
2020/03/13 Python
Django 解决新建表删除后无法重新创建等问题
2020/05/21 Python
python3中for循环踩过的坑记录
2020/12/14 Python
南威尔士家居商店:Leekes
2016/10/25 全球购物
extern是什么意思
2016/03/10 面试题
跳蚤市场口号
2014/06/13 职场文书
微笑面对生活演讲稿
2014/09/23 职场文书
员工工作能力评语
2014/12/31 职场文书
护士爱岗敬业心得体会
2016/01/25 职场文书
python将图片转为矢量图的方法步骤
2021/03/30 Python
Python自动化爬取天眼查数据的实现
2021/06/15 Python