西电算法导论上机实验报告Word格式.docx
- 文档编号:20019266
- 上传时间:2023-01-15
- 格式:DOCX
- 页数:17
- 大小:105.56KB
西电算法导论上机实验报告Word格式.docx
《西电算法导论上机实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《西电算法导论上机实验报告Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
题目四:
6
2、所用策略:
4、结果截图:
5、总结:
7
实验二动态规划7
8
9
10
11
12
3、算法分析:
13
题目五:
14
实验三贪心算法14
15
16
17
1、题目描述:
18
19
实验四回溯法19
20
21
实验一排序算法
1、题目描述:
描述一个运行时间为θ(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素。
2、所用算法:
1、运用归并排序算法
2、在已经排好序的基础上,对其运用二分查找。
3、算法分析:
(1)归并排序运用的是分治思想,时间复杂度为θ(nlgn),能够满足题目要求的运行时间。
归并排序的分解部分是每次将数组划分两个部分,时间复杂度为θ
(1);
再对已经分解的两个部分再进行分解直到将数组分解成单个元素为止;
解决部分是递归求解排序子序列;
合并部分是将已经排序的子序列进行合并得到所要的答案,时间复杂度为θ(lgn)。
(2)二分查找算法的时间复杂度为θ(lgn)在题目要求的范围内,二分查找的条件为待查的数组为有序序列。
算法的主要思想为设定两个数,low指向最低元素,high指向最高元素,然后比较数组中间的元素与待查元素进行比较。
如果待查元素小于中间元素,那么表明查找元素在数组的前半段;
反之,如果待查元素大于中间元素,那么表明查找元素在数组的后半段。
4、结果截图:
5、总结:
(1)在主函数中调用二分查找的时候,参数应该为BinSearch(a,j+1,n,x-a[j]),从j+1开始遍历而不是都是从第一个开始。
(2)遇到的困难为:
由于程序语言规定数组的下标从0开始,而算法伪代码要求从1开始,因此在定义数组大小的时候将数字加1,但是在编译运行的时候会得不到想要的结果,出现数组下标访问错误。
采取的解决方案为:
在开始定义数组的时候,将数组的大小定义为一个较大的数字,如1000。
避免在运行时出现错误,但是造成了空间的浪费。
较好的方案为使用动态数组,如malloc函数。
实现优先级队列,即需要支持以下操作:
INSERT(S,x):
把元素x插入到集合S中;
MAXMUM(S):
返回S中具有最大key的元素;
EXTRACT-MAX(S):
去掉并返回S中的具有最大key的元素;
INCREASE-KEY(S,x,k):
将元素x的关键字值增到k。
堆排序,运用堆来实现优先队列。
3、算法分析:
(1)堆排序算法是引用堆这个数据结构进行信息管理。
堆排序的时间复杂度是θ(nlgn),但是与归并排序不同的是堆排序具有空间的原址性,任何时候都只需要常数个额外的元素空间存储临时数据。
堆排序算法分为3个过程,MAX-HEAPIEY:
调整堆以满足小顶堆性质,其时间复杂度为θ(lgn);
BUILD-MAXHEAP:
从无序的输入数据数组中构造小顶堆,其时间复杂度为线性时间;
HEAP-SORT:
对数组进行原址排序,其时间复杂度为θ(nlgn)。
(2)在堆的基础上实现优先队列INSERT、MAXMUM、EXTRACT-MAX、INCREASE-KEY,时间复杂度为θ(lgn)。
遇到的困难:
没有理解将一个序列转换成小顶堆的过程,因此刚开始很难将伪代码用c语言进行实现。
从结果可以看出,在编写MAX-EXSTRACT函数的时候,当去掉第一个元素后,程序没有调用MAX-HEAP进行调整堆,因此最后序列是无序状态。
实现quick_sort算法,并且回答以下两个问题:
(1)待排数组中的元素值都相同的情况下,运用quick_sort需要进行多少次比较?
(2)对于n个元素的数组,运用quick_sort举出需要进行比较次数的上限和下限是多少?
快速排序算法
快速排序采用分治策略,时间复杂度为θ(nlgn),但是最坏情况下为θ(n2),并且快速排序算法属于原地排序,并不需要开辟空间。
快速排序复杂的步骤为其分解的步骤,分解的过程:
数组A[p..r]被划分为两个子数组A[p..q-1]和A[q+1..r],使得A[p..q-1]中的每个元素都小于A[q],而A[q]也小于等于A[q+1..r]中的每个元素。
而在实现的过程总是选择将A[r]作为基准点进行划分A[p..r]数组。
问题答案:
(1)当选取第一个或者最后一个为基准点时,当n个元素相同的时候为最坏情况,比较次数为n*(n-1)/2;
(2)快速排序比较次数最少为θ(nlgn),,最大的比较次数为θ(n2)。
1、题目描述:
运用分治的策略将两个已经排好序的序列中,找出第k大的元素,且要求时间复杂度为θ(lgm+lgn),其中m和n分别为两个序列的长度。
2、所用策略:
分治策略
(1)分解:
因为已经是两个独立的的序列,所以不用进行分解。
(2)解决:
因为两个序列为已经排好的序列,因此不用分开进行排序。
(3)利用归并排序中的merge函数,将这两个序列分别看成是L[]和R[]两个数组,通过开辟一个新的数组,将两个数组合并成一个新的排好序的序列,在根据要求的k值,对新的数组进行取值。
(1)理解分治策略的三个步骤:
分解、解决和合并对于具体问题的具体表现,要善于根据时间复杂度与所学的算法进行结合,找出可以利用的地方。
实验二动态规划
用动态规划实现矩阵链乘,保证相乘的次数最少。
动态规划
(1)最优子结构为:
如果最优的加括号的方式将其分解为Ai..k与Ak+1..j的乘积,则分别对Ai..k与Ak+1..j加括号的方式也一定是最优的。
(2)定义m[i,j]为计算矩阵Ai..j所需标量乘法次数的最小值,对于i=j时,矩阵链乘只包含唯一的矩阵Ai,因此不需要做任何标量乘法运算,所以m[i,i]=0;
当i<
j时利用最优子结构来计算m[i,j]。
(3)矩阵链乘的递归式:
(4)在算法设计的时候,需要m数组记录Ai..j最小相乘次数,s数组记录构造最优解所需要的信息,其记录的k值指出了AiAi+1Aj的最优括号化方案的分割点应在AkAk+1之间。
(5)矩阵链乘的时间复杂度为θ(n3)
遇到的问题:
在构建m数组和s数组的时候需要构建二维数组,而c语言中函数的参数列表中二维数组要指明数组大小,但是还没有输入信息的时候并没有方法确定数组大小。
采取的方案:
由于此次的例子只有两种情况,因此对于MATRIX_CHAIN_ORDER函数和PRINT_OPTIMAL_PARENS函数写两遍,大体的实现过程相同,只是数组的大小有所改变。
并没有解决这个情况,造成代码的冗余。
用动态规划求下列字符串的最长公共子序列(LCS)
(1)最优子结构:
令X=<
x1,x2,..xm>
和Y=<
y1,y2,...,yn>
为两个序列,Z=<
z1,z2,...,zk>
为X和Y的任意LCS。
1、如果xm=yn,则zk=xm=yn且Zk-1是Xm-1和Yn-1的一个LCS.2、如果xm≠yn,则zk≠xm意味着Z是Xm-1和Y的一个LCS;
3、如果xm≠yn,则zk≠yn意味着Z是X和Yn-1的一个LCS。
(2)定义一个b[i,j]指向表项对应计算c[i,j]时所选择的子问题最优解,过程返回表b和表c,c[m,n]保持X和Y的LCS长度。
(3)LCS的递归式为:
(4)LCS的时间复杂度为θ(m+n),b表的空间复杂度为θ(mn)。
用动态规划求取最长公共子序列的时候,要理解b数组的用途和使用。
编写的代码无法针对字符串大小未定情况下,进行求解LCS这导致了代码的冗余。
用动态规划求取以下字符串的最长公共子串。
(1)最优子结构:
为X和Y的任意最长公共子串。
1、如果xm=yn,则zk=xm=yn且Zk-1是Xm-1和Yn-1的一个最长公共子串.2、如果xm≠yn,则zk≠xm意味着Z是Xm-1和Y的一个最长公共子串;
3、如果xm≠yn,则zk≠yn意味着Z是X和Yn-1的一个最长公共子串。
(2)定义L[i,j]为以x[i]和y[j]为结尾的相同子串的最大长度。
记录着X和Y的最长公共子串的最大长度。
(3)最长公共子串的递归式:
(4)最长公共子串的时间复杂度为θ(mn),空间复杂度为θ(mn)。
要同上述的最长公共子序列进行对比,区分他们的不同之处。
也要理解用动态规划求解时的相同之处和不同之处。
给定n个整数(可能为负数)组成的序列,a[1],a[2]...a[n],求该序列a[i]+a[i+1]...a[j]的子段和的最大值。
3、算法分析:
定义当所给整数全为负数的时候,最大子段和为0,则最大子段和为max{0,a[i]+a[i+1]...+a[j]},1≤i≤j≤n
(2)引入一个辅助数组b,动态规划的分解分为两步:
(1)计算辅助数组的值;
(2)计算辅助数组的最大值。
辅助数组b[j]用来记录以j为尾的子段以及集合中的最大子段和。
(3)最大子段和的递归式:
(4)最大子段和使用动态规划进行计算的时间复杂度为θ(n)。
在求解集合的最大子段和的时候,要对比不同解决方法的不同之处,感受用动态规划解决的便捷。
利用动态规划求出多段图中的最短路径
2、所用策略:
(1)可以由图可知,图中的顶点讲图划分7个阶段,分别了解每个阶段可以有几种可供选择的店,引入f[k]表示状态k到终点状态的最短距离。
最优子结构为:
当前状态的f[k]由上个状态的f[k-1]和状态k-1到状态k的距离决定决策:
当前状态应在前一个状态的基础上获得。
决策需要满足规划方程,规划方程:
f(k)表示状态k到终点状态的最短距离。
(2)多段图最短路径的递归式:
无。
(1)遇到的问题:
无法将多段图的每个阶段点的状态表示并记录下来。
并不了解如何将动态规划与贪心算法的如迪杰斯特拉算法进行对比,真正从最优子结构将最短路径表示出来。
实验三贪心算法
背包问题,即分别计算出在0-1背包和分数背包情况下的计算结果。
动态规划和贪心策略
(1)0-1背包问题:
所选择的的贪心策略为按照选择单位重量价值最大的物品顺序进行挑选。
算法的步骤:
设背包容量为C,共有n个物品,物品重量存放在数组W[n]中,价值存放在数组V[n]中,问题的解存放在数组X[n]中。
第一步:
改变数组W和V的排列顺序,使其按单位重量价值V[i]/W[i]降序排列,并将数组X[n]初始化为0;
第二步初始化i=0,设计一个循环,循环终止条件为(W[i]>
C),循环体为将第i个物品放入背包:
X[i]=1;
C=C-W[i];
i++;
最后一步:
将结果存入到X数组中。
(2)分数背包问题:
将结果存入到X数组中X[i]=C/W[i]。
(3)分数背包问题所采用的贪心策略之不能得到最优解,是由于物品不允许分割,因此,无法保证最终能将背包装满,部分闲置的背包容量使背包的单位重量价值降低了。
(4)分数背包问题采用选择单位重量价值最大的物品顺序进行挑选,其算法的时间复杂度为θ(nlgn)。
使用贪心策略解决0-1背包问题得出的结果并不是最优解,这是由于所用的选择策略不同。
一个简单的调度问题,给予工作编号为J1,J2...Jn,已知所以工作的运行时间分别为T1,T2...TN。
有一个单独的处理器,为了安排这些工作以到达减少平均完成时间的最好方法是什么。
假定它是一个非抢占式调度:
一旦工作开始,它必须运行完成。
贪心策略
(1)由于是非抢占式调度,所以应该尽量让时间短的工作先做,然后再让时间长的工作做。
这里我们使用堆进行排序,建立一个小顶堆,然后每次拿出小顶堆上的最小元素,并使用sum中的公式就可以算出平均完成时间。
堆排序的时间复杂度是O(nlgn),其中BuildMinHeap的时间复杂度是O(n),而BuildMinHeap()的时间复杂度是O(lgn)。
其中HeapExtractMin(N)的时间复杂度是O(lgn)。
由于前面对于堆排序和优先队列的MIN-EXTRACT函数的错误没有解决,导致在调度中,需要每次去运行时间最短的工作时发生了错误。
1、题目描述:
以A为源点,求出下图的单源点最短路径。
由于图中存在负权值,所以Dijkstra算法无法使用,因此采用Bellman-Ford算法求取图的单源点最短路径。
(1)Bellman-Ford算法通过对边进行松弛操作来渐近地降低从源点A到每个结点的最短路径的估计值,直到该估计值与实际的最短路径权重ơ(A,v)相同为止。
该算法返回TRUE值当且仅当输入图中不包含可以从源结点到达的权重为负值的环路。
(2)Bellman-Ford算法的执行步骤:
1、初始化:
将除源点外的所有顶点的最短距离估计值d[v]←+∞,d[s]←0;
2、迭代求解:
反复对边集E中的每条边进行松弛操作,使得顶点集V中的每个顶点v的最短距离估计值逐步逼近其最短距离;
(运行|v|-1次)3、检验负权回路:
判断边集E中的每一条边的两个端点是否收敛。
如果存在未收敛的顶点,则算法返回false表明问题无解;
否则算法返回true,并且从源点可达的顶点v的最短距离保存在d[v]中。
(3)算法适用范围和条件:
1.单源最短路径(从源点A到其它所有顶点v);
2.有向图&
无向图(无向图可以看作(u,v),(v,u)同属于边集E的有向图);
3.边权可正可负(如有负权回路输出错误提示)。
(4)Bellman-Ford算法的时间复杂度为θ(VE)。
无
这次的实验并没有成功,按照伪代码进行编写代码,编译通过的时候却没有办法输出结果,或者结果是错误的。
求题3图中每对结点的最短路径问题
Floyd-Warshall算法。
(1)设G的顶点为V={1,2,3...n},对于任意一对顶点i,j属于V,假设i到j有路径且中间节点皆属于集合{1,2,3...k},P是其中的一条最小权值路径。
就是i到j的最短路径P所通过的中间顶点最大不超过k。
(2)设d(k)ij为从结点i到结点j的所有中间结点全部取自结合{1,2,...,k}的一条最短路径的权重。
d(k)ij的递归定义为
(3)Floyd-Warshall算法的时间复杂度为θ(v3)。
实验四回溯法
运用回溯法实现实验3中的0-1背包问题
回溯法
(1)利用回溯法求解首先是要确定约束函数,根据0-1背包问题的特点,由于背包的容量是确定,因此背包问题中第k个物品的取舍要取决于放入后是否超过背包的容量。
即:
C1..k-1+wk<
=W(其中C1..k表示已经决定好前k-1物品的取舍后当前背包的重量,wk为第k件物品的容量,W为背包的容量)
(2)为了求出最优解,从而确定求解的限界条件。
为了能达到最大的价值(不超过背包容量的前提下)通过计算只放入一部分第k物品来计算最大的价值,要确保当前的选择的最大价值大于已经选择的价值,此为限界条件。
用回溯法实现8-queen问题
(1)利用回溯法求解8-queen问题,即确定每个queen在每一行的位置,首先确定约束条件,要求每个queen不能再同一行,同一列和同一对角线上引入queen[i],记录第i行的列数,由于两个queen不能再同一列,因此数组中没有相同的值;
而对于判断是否在同一对角线上的条件为:
假设两个queen的坐标位置分别为(i,j),(k,h),当且仅当|i-k|=|j-h|时才确定两个queen在同一对角线上。
(2)回溯的过程:
不断检索该行能够存放的位置,1)先从第一行第一列开始检查,如果不能放置,接着检查该行第二个位置,依次检查下去,直到在该行找到一个可以放置一个皇后的地方,然后保存当前状态,转到下一行重复上述方法的检索;
2)如果检查了该行所有的位置均不能放置一个皇后,说明上一行皇后放置的位置无法让所有的皇后找到自己合适的位置,因此就要回溯到上一行,重新检查该皇后位置后面的位置。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 导论 上机 实验 报告
