算法第二、三章上机实验报告

算法第二章上机实验报告

一、实践题目名称

7-2 二分法求函数的零点

 

二、问题描述

有函数:f(x)=x5−15x4+85x3−225x2+274x−121 已知f(1.5)>0,f(2.4)<0 且方程f(x)=0 在区间[1.5,2.4] 有且只有一个根,请用二分法求出该根。 提示:判断函数是否为0,使用表达式 fabs(f(x)) < 1e-7

求出给定函数的根,该根结果与函数真实结果相差不超过0.0000001

 

三、算法描述

总体思路:首先根据题目确定f(x)函数在[1.5,2.4]范围内是呈现一个递减并且经过x轴的曲线,我们先将[1.5,2.4]这个大范围作为正式二分法的第一个区间,然后根据中间值和左右两个指针的取值大小,再合理缩小范围并改变mid所指值,直到f(mid)的值在与0相差在(-1e-7~1e-7)的范围。

 

解题代码及注释如下图:

  

四、算法时间及空间复杂度分析

此算法使用了二分法,实现的时间复杂度和空间复杂度都为 log2n级别的:

时间复杂度O(log2n):查找长度为n,每次查找后长度减半,T(n)=2T(n/2);

空间复杂度O(log2n)。

 

五、心得体会
1、仔细阅读题目后,要先理清解题思路,遇到函数题型时通常要结合画图来辅助思考,最后再进行从其中找关键点求解;

2、一定要看清题目了解限制点,并且对于误差范围的题目通常会使用绝对值,这让我们在求解时更增加难度,要更多方面地考虑问题;

3、真的很感谢我的搭档,她有很强的思维能力,会不胜其烦地为基础差的我解释代码,让我能更深入地了解题目,很感谢有这样的搭档!

 

六、分治法的个人体会和思考

1、分治法是将一个大问题细分成我们可以解决的很多子问题的一种实用方法,可以将一个庞大的问题细分,更加有助于问题的解决;

2、分治法很核心的点是如何划分问题,子问题越多有时会加大问题的复杂性;

3、分治法处理得当,可以降低问题解决的难度,还可能降低算法的时间空间复杂度。

 

 

算法第三章上机实验报告

、实践题目名称

7-3 最低通行费

 

二、问题描述

一个商人穿过一个N×N的正方形的网格,去参加一个非常重要的商务活动。他要从网格的左上角进,右下角出。每穿越中间1个小方格,都要花费1个单位时间。商人必须在(2N-1)个单位时间穿越出去。而在经过中间的每个小方格时,都需要缴纳一定的费用。注意:不能对角穿越各个小方格(即只能向上下左右四个方向移动且不能离开网格)

问:这个商人期望在规定时间内用最少费用穿越出去。请问至少需要多少费用?

 

三、算法描述

总体:我和搭档对这题的解题思路就是先根据范例及数组,建一个递推方程,然后再把数据套上去,检查是否所有自变量取值均满足此方程。最终我们建立了这个m[i][j]=min(m[i][j]+m[i-1][j],m[i][j]+m[i][j-1] 的递推方程,同时发现了第一列和第一行不需考虑其他数据,直接可以根据所在列或者所在行更新数组数据,第一列更新的数据是将其前面的数据与当前相加得到,第一行也是如此,因为商人没必要往下走或者往右走了以后再往上走或者往左走,这样会浪费钱,而这个就是我们发现的临界条件。数组的其他数据均按照建好的递推方程去做就可。

代码及解释如下图:

 

四、问题求解:

(1)递归方程式为:m[i][j]=min(m[i][j]+m[i-1][j],m[i][j]+m[i][j-1]);

(2)表的维度:二维

填表范围:n*n

填表顺序:先将第一行和第一列的数据更新后,再从m[2][2]开始,依据m[2][1]和m[1][2]的值大小更新m[2][2],以此类推更新到m[2][n]后再从m[3][2]开始更新,以此类推至m[n][n]即为最终结果。

(3)该算法的时间复杂度:由于该算法主要运用了两重循环,时间复杂度为O(n^2);

空间复杂度:算法运用了一个二维数组来存放原始数据和最优子结构,故空间复杂度为O(n^2)

(4)心得体会(对本次实践收获及疑惑进行总结)

这道题真的研究了好久,对于临界条件我一直是以为从i和j的关系中找,然后就没头绪,但我的搭档最后自己想出了这个跟普通解题时不一样的临界条件,然后也教会了我正确的填表顺序和方法,感受到了动态规划算法的特别和难度。

 

五、你对动态规划算法的理解和体会

(1)我认为动态规划的核心思想也是分治的思想,就是把原问题分解成子问题进行求解;

(2)我们平时遇到的问题用一般的算法做就会出现比较多的重叠子问题,这会进行很多重复的运算,这时我们就可以用动态规划的算法思想找到最优子结构再进行求解,这样才会尽可能避免一些重复的不必要的运算;

(3)其次,在使用动态规划算法中,填表的顺序相当重要,这不仅关涉到时间空间复杂度的变化,还是问题求解中非常重要的考虑成分。

 

posted @ 2021-10-23 10:44  Sandgirl  阅读(146)  评论(0编辑  收藏  举报