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 相关文章推荐
脚本吧 - 幻宇工作室用到js,超强推荐expand.js
Dec 23 Javascript
JQuery 入门实例1
Jun 25 Javascript
Javascript的getYear、getFullYear、getUTCFullYear异同分享
Nov 30 Javascript
JS和jquery获取各种屏幕的宽度和高度的代码
Aug 02 Javascript
JS实现判断滚动条滚到页面底部并执行事件的方法
Dec 18 Javascript
Jquery中find与each方法用法实例
Feb 04 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
Apr 15 Javascript
全面解析Bootstrap中form、navbar的使用方法
May 30 Javascript
js/jQuery实现全选效果
Jun 17 jQuery
微信小程序如何获取群聊的openGid以及名称详解
Jul 17 Javascript
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
May 19 Javascript
浅谈vue-props的default写不写有什么区别
Aug 09 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 模拟POST提交的2种方法详解
2013/06/17 PHP
php mysqli查询语句返回值类型实例分析
2016/06/29 PHP
PHP给前端返回一个JSON对象的实例讲解
2018/05/31 PHP
jQuery 顺便学习下CSS选择器 奇偶匹配nth-child(even)
2010/05/24 Javascript
jqeury-easyui-layout问题解决方法
2014/03/24 Javascript
jQuery弹出框代码封装DialogHelper
2015/01/30 Javascript
javascript记住用户名和登录密码(两种方式)
2015/08/04 Javascript
纯javascript响应式树形菜单效果
2015/11/10 Javascript
javascript实现列表切换效果
2016/05/02 Javascript
JS 数字转换为大写金额的简单实例
2016/08/04 Javascript
详谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/25 Javascript
Vue.js框架路由使用方法实例详解
2017/08/25 Javascript
Node解决简单重复问题系列之Excel内容的获取
2018/01/02 Javascript
vue-star评星组件开发实例
2018/03/01 Javascript
p5.js入门教程之平滑过渡(Easing)
2018/03/16 Javascript
JSX在render函数中的应用详解
2019/09/04 Javascript
微信小程序聊天功能的示例代码
2020/01/13 Javascript
Bootstrap告警框(alert)实现弹出效果和短暂显示后上浮消失的示例代码
2020/08/27 Javascript
python实现代理服务功能实例
2013/11/15 Python
Python列表list内建函数用法实例分析【insert、remove、index、pop等】
2017/07/24 Python
几行Python代码爬取3000+上市公司的信息
2019/01/24 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
2019/08/12 Python
通过python扫描二维码/条形码并打印数据
2019/11/14 Python
python手写均值滤波
2020/02/19 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
2020/02/27 Python
python百行代码自制电脑端网速悬浮窗的实现
2020/05/12 Python
Python 串口通信的实现
2020/09/29 Python
安德玛加拿大官网:Under Armour加拿大
2019/10/02 全球购物
美国家居装饰购物网站:Amanda Lindroth
2020/03/25 全球购物
德国BA保镖药房中文网:Bodyguard Apotheke
2021/03/09 全球购物
用C或者C++语言实现SOCKET通信
2015/02/24 面试题
成龙洗发水广告词
2014/03/14 职场文书
工商管理专业毕业生求职信
2014/05/26 职场文书
迁户口计划生育证明
2014/10/19 职场文书
服装店员工管理制度
2015/08/07 职场文书
MySQL池化框架学习接池自定义
2022/07/23 MySQL