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的消息提示插件 DivAlert之旅(二)
Apr 01 Javascript
封装html的select标签的js操作实例
Jul 02 Javascript
script标签属性用type还是language
Jan 21 Javascript
详细介绍jQuery.outerWidth() 函数具体用法
Jul 20 Javascript
深入浅析同源策略和跨域访问
Nov 26 Javascript
Vue 2.0学习笔记之Vue中的computed属性
Oct 16 Javascript
JS中判断某个字符串是否包含另一个字符串的五种方法
May 03 Javascript
浅析vue-router原理
Oct 19 Javascript
使用p5.js临摹动态图形
Oct 23 Javascript
微信小程序登录时如何获取input框中的内容
Dec 04 Javascript
js删除指定位置超链接中含有百度与360的标题
Jan 06 Javascript
Vue+Bootstrap实现简易学生管理系统
Feb 09 Vue.js
详解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+mysql保存和输出文件
2006/10/09 PHP
php实现复制移动文件的方法
2015/07/29 PHP
Yii2创建表单(ActiveForm)方法详解
2016/07/23 PHP
PHP实现递归的三种方法
2020/07/04 PHP
JavaScript中this关键字使用方法详解
2007/03/08 Javascript
Event altKey,ctrlKey,shiftKey属性解析
2013/12/18 Javascript
node.js读取文件到字符串的方法
2015/06/29 Javascript
Javascript模仿淘宝信用评价实例(附源码)
2015/11/26 Javascript
jQuery学习心得总结(必看篇)
2016/06/10 Javascript
终于实现了!精彩的jquery弹幕效果
2016/07/18 Javascript
基于jQuery实现表格的查看修改删除
2016/08/01 Javascript
Mvc提交表单的四种方法全程详解
2016/08/10 Javascript
bootstrapfileinput实现文件自动上传
2016/11/08 Javascript
EasyUI框架 使用Ajax提交注册信息的实现代码
2017/09/27 Javascript
vue 路由页面之间实现用手指进行滑动的方法
2018/02/23 Javascript
JavaScript常见鼠标事件与用法分析
2019/01/03 Javascript
JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例
2019/01/29 Javascript
vue计算属性computed的使用方法示例
2019/03/13 Javascript
运用TensorFlow进行简单实现线性回归、梯度下降示例
2018/03/05 Python
python等差数列求和公式前 100 项的和实例
2020/02/25 Python
jupyter notebook插入本地图片的实现
2020/04/13 Python
Python自定义sorted排序实现方法详解
2020/09/18 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
2020/12/11 Python
外企C语言笔试题
2013/11/10 面试题
Delphi工程师笔试题
2013/09/21 面试题
党校学习自我鉴定
2014/02/24 职场文书
梅花魂教学反思
2014/04/25 职场文书
护士自荐信怎么写
2015/03/06 职场文书
检察院起诉书
2015/05/20 职场文书
工作后的感想
2015/08/07 职场文书
大学班长竞选稿
2015/11/20 职场文书
《折线统计图》教学反思
2016/02/22 职场文书
创业计划书之校园超市
2019/09/12 职场文书
Java中PriorityQueue实现最小堆和最大堆的用法
2021/06/27 Java/Android
Python基本数据类型之字符串str
2021/07/21 Python
MySQL如何使备份得数据保持一致
2022/05/02 MySQL