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 相关文章推荐
Notify - 基于jquery的消息通知插件
Oct 18 Javascript
jQuery中delegate和on的用法与区别详细解析
Jan 26 Javascript
当jQuery1.7遇上focus方法的问题
Jan 26 Javascript
Javascript高级技巧分享
Feb 25 Javascript
使用GruntJS构建Web程序之安装篇
Jun 04 Javascript
Javascript限制网页只能在微信内置浏览器中访问
Nov 09 Javascript
jQuery实现的图文高亮滚动切换特效实例
Aug 10 Javascript
jQuery实现下拉加载功能实例代码
Apr 01 Javascript
针对JavaScript中this指向的简单理解
Aug 26 Javascript
bootstrap的常用组件和栅格式布局详解
May 02 Javascript
基于vue的验证码组件的示例代码
Jan 22 Javascript
jQuery实现穿梭框效果
Jan 19 jQuery
详解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/10/09 PHP
Phpbean路由转发的php代码
2008/01/10 PHP
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
2011/11/21 PHP
基于MySQL分区性能的详细介绍
2013/05/02 PHP
header导出Excel应用示例
2014/01/24 PHP
PHP结合JQueryJcrop实现图片裁切实例详解
2014/07/24 PHP
PHP中提问频率最高的11个面试题和答案
2014/09/02 PHP
Laravel重写用户登录简单示例
2016/10/08 PHP
js getElementsByTagName的简写方式
2010/06/27 Javascript
文本框倒叙输入让输入框的焦点始终在最开始的位置
2014/09/01 Javascript
文件上传,iframe跨域数据提交的实现
2016/11/18 Javascript
js模拟微博发布消息
2017/02/23 Javascript
原生javascript上传图片带进度条【实例分享】
2017/04/06 Javascript
layui弹出层效果实现代码
2017/05/19 Javascript
vue使用axios实现文件上传进度的实时更新详解
2017/12/20 Javascript
angularjs获取到My97DatePicker选中的值方法
2018/10/02 Javascript
[41:56]Spirit vs Liquid Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
[59:15]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.20
2020/11/20 DOTA
Python中实现三目运算的方法
2015/06/21 Python
详解Python中的静态方法与类成员方法
2017/02/28 Python
Python使用正则表达式过滤或替换HTML标签的方法详解
2017/09/25 Python
浅谈Python traceback的优雅处理
2018/08/31 Python
Python判断telnet通不通的实例
2019/01/26 Python
解决django同步数据库的时候app models表没有成功创建的问题
2019/08/09 Python
浅谈python 类方法/静态方法
2020/09/18 Python
Canvas实现贝赛尔曲线轨迹动画的示例代码
2019/04/25 HTML / CSS
HTML5超炫酷粒子效果的进度条的实现示例
2019/08/23 HTML / CSS
英国领先的NHS批准的在线药店:Pharmacy2U
2017/01/06 全球购物
英国和世界各地鲜花速递专家:Arena Flowers
2018/02/10 全球购物
亚马逊加拿大网站:Amazon.ca
2020/01/06 全球购物
新年抽奖获奖感言
2014/03/02 职场文书
2014年前台个人工作总结
2014/11/14 职场文书
如何制定一份可行的计划!
2019/06/21 职场文书
《狼王梦》读后感:可怜天下父母心
2019/11/01 职场文书
教你怎么用Python处理excel实现自动化办公
2021/04/30 Python
中国十大神话动漫电影排行榜 哪吒登顶 白蛇缘起排第七
2022/03/21 国漫