宝哥软件园

动态编程示例JavaScript编程高级算法分析

编辑:宝哥软件园 来源:互联网 时间:2021-09-03

本文阐述了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,.

本系列从第3项开始,每项等于前两项之和。

对于这个系列,可以使用递归函数来计算第n个值

//斐波那契数列函数recurfib(n){ if(n ^ 2){ return n;} else {//document . write(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=0时函数应该执行多少次。然而,明眼人一眼就能看出,随着n的增加,执行的次数会可怕地增加。

当n=5时,递归树已经长得很大了…可以预测,当n=10时,甚至当n=100时…

了解递归函数执行效率的差异,让我们看看动态规划是如何完成的

函数DynFib(n){ let val=[];for(设I=0;I=n;I){ val[I]=0;} if(n===1 | | n===2){ return 1;} else { val[1]=1;val[2]=2;for(设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遍历到输入参数,并将数组的每个元素指定为前两个元素的总和。当循环结束时,数组的最后一个元素值是最终计算的斐波那契值,它也将作为函数的返回值。

接下来,我们可以编写一个简单的测试函数来比较两者的运行时间。

//定义一个测试函数,将待测函数作为参数传递给functiontest (func,n) {let start=newdate()。gettime();//开始时间让RES=func(n);//执行要测试的函数document.write('br'' res 'br '当n=' n ');让结束=新日期()。getTime();//结束时间返回(结束-开始)‘ms’;//返回函数执行需要时间}打印函数执行

让时间=测试(recurFib,40);document.write(时间);让time2=test(dynFib,40);document . write(time 2);结果如下:

最后,您可能已经意识到,在使用迭代方案时,无需使用数组就可以计算斐波那契序列。

之所以需要数组,是因为动态编程算法通常需要保存中间结果。

以下是斐波那契函数含义的迭代版本

函数IterFib(n){ let last=1;让next last=1;让结果=1;for(设I=2;I n;I){ result=last next last;nextLast=lastlast=结果;}返回结果;}当然,这个迭代版本的效率和数组版本是一样的。

更多对JavaScript相关内容感兴趣的读者可以查看本网站专题:《JavaScript数据结构与算法技巧总结》、《JavaScript数学运算用法总结》、《JavaScript排序算法总结》、《JavaScript遍历算法与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、0103010

希望本文对JavaScript编程有所帮助。

更多资讯
游戏推荐
更多+