ImageVerifierCode 换一换
格式:DOCX , 页数:24 ,大小:26.58KB ,
资源ID:8546189      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8546189.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(算法导论上机报告.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

算法导论上机报告.docx

1、算法导论上机报告算法导论上机报告 班级: 1313012 学号: 姓名: 黄帮振 实验编号1题目1归并排序算法实验内容描述一个运行时间为(nlgn)的算法 给定n个整数的集合S和另一个整数x该算法能确定S中是否存在两个其和刚好为x的元素。实验目的用分治思想,设计子问题,实现归并排序算法;报 告 正 文一、算法分析1、运用归并排序算法 归并排序运用的是分治思想,时间复杂度为(nlgn)能够满足题目要求的运行时间。归并排序的分解部分是每次将数组划分两个部分,时间复杂度为(1)再对已经分解的两个部分再进行分解直到将数组分解成单个元素为止。解决部分是递归求解排序子序列,合并部分是将已经排序的子序列进行

2、合并得到所要的答案,时间复杂度为(lgn)。2、在已经排好序的基础上,对其运用二分查找 二分查找算法的时间复杂度为(lgn)在题目要求的范围内,二分查找的条件为待查的数组为有序序列。算法的主要思想为设定两个数 low指向最低元素 high指向最高元素,然后比较数组中间的元素与待查元素进行比较。如果待查元素小于中间元素,那么表明查找元素在数组的前半段,反之,如果待查元素大于中间元素,那么表明查找元素在数组的后半段。二、伪代码:MERGE(A,p,q,r)1.n1=q-p+12.n2=r-q3.Let L1.n1+1andR1.n2+1be new arrays4.For i=1 to n15.

3、Li=Ap+i-16.For j=1 to n27. Rj=Aq+j8.Ln1+1=无穷9.Rn2+1=无穷10.I=111.J=112.For k=p to r13. If Li=Rj14. Ak=Li15. I=i+116. Else Ak=Rj17. J=j+1MERGE-SORT(A,p,r)1、if pr2、 q=(p+r)/2(取下限)3、 MERGE-SORT(A,p,q)4、 MERGE-SORT(A,q+1,r)5、 MERGE(A,p,q,r)3、实验总结 在主函数中调用二分查找的时候,参数应该为BinSearch(a,j+1,n,x-aj)从j+1开始遍历而不是都是从第一

4、个开始。在程序中由于程序语言规定数组的下标从0开始而算法伪代码要求从1开始,因此在定义数组大小的时候将数字加1,但是在编译运行的时候会得不到想要的结果,出现数组下标访问错误。实验编号1题目2优先队列排序实验内容实现优先队列排序算法,需要支持以下操作:INSERT(S,x):把元素x插入到集合S中MAXMUM(S):返回S中具有最大key的元素 EXTRACT-MAX(S):去掉并返回S中的具有最大key的元素 INCREASE-KEY(S,x,k):将元素x的关键字值增到k。 实验目的堆排序,运用堆来实现优先队列。报 告 正 文1、算法原理1、堆排序算法是引用堆这个数据结构进行信息管理。堆排序

5、的时间复杂度是(nlgn),但是与归并排序不同的是堆排序具有空间的原址性,任何时候都只需要常数个额外的元素空间存储临时数据。堆排序算法分为3个过程MAX-HEAPIEY:调整堆以满足小顶堆性质 其时间复杂度为(lgn);BUILD-MAXHEAP:从无序的输入数据数组中构造小顶堆,其时间复杂度为线性时间;HEAP-SORT:对数组进行原址排序,其时间复杂度为(nlgn)。 2、在堆的基础上实现优先队列INSERT、MAXMUM、EXTRACT-MAX、INCREASE-KEY时间复杂度为(lgn)。 2、伪代码 BUILD-MAX-HEAP(A)1.=2.For i=2(取下限) downto

6、 13.MAX-HEAPIFY(A,i)HEAPSORT(A)1.Build-MAX-HEAP(A)2.For i= downto 23.Exchange A1 with Ai4.= - 15.MAX-HEAPIFY(A,1)HEAP-MAIMUM(A)1.return A1HEAP-EXTRACT-MAX(A)1.if 12. Error “heap underflow”3.Max=A14.A1=A5.= - 16.MAX-HEAPIFY(A,1)7.Return maxHEAP-INCREASE-KEY(A,i,key)1.if key1 and APARENT(i)Ai5. Exchan

7、ge Ai with APARENT(i)6. I=PARENT(i)MAX-HEAP-INSERT(A,key)1.= + 12.A=负无穷3.HEAP-INCREASE-KEY(A,key) 三、实验总结 一开始没有理解将一个序列转换成小顶堆的过程,在编写MAX-EXSTRACT函数的时候,当去掉第一个元素后,程序并没有调用MAX-HEAP进行调整堆,因此最后序列是无序状态。实验编号1题目3快速排序算法实验内容实现快速排序算法。实验目的使用Java实现插入排序算法。报 告 正 文一、算法原理快速排序采用分治策略,时间复杂度为(nlgn),但是最坏情况下为(n2),并且快速排序算法属于原地排

8、序,并不需要开辟空间。快速排序复杂的步骤为其分解的步骤 分解的过程 数组Ap.r被划分为两个子数组Ap.q-1和Aq+1.r,使得Ap.q-1中的每个元素都小于Aq,而Aq也小于等于Aq+1.r中的每个元素。而在实现的过程总是选择将Ar作为基准点进行划分Ap.r数组。 二、伪代码QUICKSORT(A,p,r)1 if p B1,那么K肯定不在A0, (m/(m + n) * (k - 1)以及B(k + 1 - (m/(m + n) * (k - 1)+ 1, n中;如果A1ahigh 4. return Bblow+k-15.If blowbhigh 6. return Aalow+k-1

9、7.If Aamid=Bbmid8.If Aamid=Bbmid9. If k= amid-alow+bmid-blow+110. Return Searchkth(A,B,alow,ahigh,blow,bmid-1,k)11. Else 12. Return Searchkth(A,B,amid+1,ahigh,blow,bhigh,k-(amid-alow)-1)13.Else14. If k= amid-alow+bmid-blow+115. Return Searchkth(A,B,alow,amid-1,blow,bhigh,k)16. Else17. Return Searchk

10、th(A,B,alow,ahigh,bmid+1,bhigh,k-(bmid-blow)-1) 3、实验总结 理解分治策略的三个步骤:分解、解决和合并对于具体问题的具体表现,要善于根据时间复杂度与所学的算法进行结合,找出可以利用的地方。 实验编号2题目1矩阵链乘实验内容用动态规划实现矩阵链乘,保证相乘的次数最少。实验目的用动态规划实现矩阵链乘报 告 正 文1、算法原理 1 最优子结构为:如果最优的加括号的方式将其分解为Ai.k与Ak+1.j的乘积 则分别对Ai.k与Ak+1.j加括号的方式也一定是最优的。 2 定义mi,j为计算矩阵Ai.j所需标量乘法次数的最小值,对于i=j时,矩阵链乘只包含

11、唯一的矩阵Ai,因此不需要做任何标量乘法运算,所以mi,i=0;当ij时利用最优子结构来计算mi,j。 3 矩阵链乘的递归式 4 在算法设计的时候 需要m数组记录Ai.j最小相乘次数,s数组记录构造最优解所需要的信息,其记录的k值指出了AiAi+1Aj的最优括号化方案的分割点应在AkAk+1之间。 5 矩阵链乘的时间复杂度为(n3) 2、伪代码MATRIX-CHAIN-ORDER(p)= m1.n,1.n and s1.n-1,2.n be new tables i=1 to n4. Mi,i=0 l=2 to n6. For i=1 to n-l+17. J=i+l-18. Mi,j=无穷9

12、. For k=i to j-110. Q=mi,k+mk+1,j+p(i-1)*p(k)*p(j)11. If qmi,j12. Mi,j=q13. Si,j=kPRINT-OPTIMAL-PARENS(s,i,j)1.if i=j2. Print “A”3.Else print “(”4. PRINT-OPTIMAL-PARENS(s,i,si,j)5. PRINT-OPTIMAL-PARENS(s,si,j+1,j)6. Print “)”3、实验总结 矩阵链乘主要运用动态规划的思想,这种思想的重要之处在于找到最优的子结构,并设计出最优解的形式。编程是并未遇到什么问题,过程较为顺利。实验

13、编号2题目2最长公共子序列实验内容用动态规划求下列字符串的最长公共子序列。实验目的用动态规划实现寻找最长公共子序列算法。报 告 正 文1、算法原理 1 最优子结构:令X=和Y=为两个序列 Z=为X和Y的任意LCS。如果xm=yn,则zk=xm=yn且Zk-1是Xm-1和Yn-1的一个LCS;如果xmyn,则zkxm意味着Z是Xm-1和Y的一个LCS;如果xmyn,则zkyn意味着Z是X和Yn-1的一个LCS。 2 定义一个bi,j指向表项对应计算ci,j时所选择的子问题最优解,过程返回表b和表c,cm,n保持X和Y的LCS长度。 3 LCS的递归式为 4 LCS的时间复杂度为(m+n),b表的

14、空间复杂度为(mn)。 2、伪代码LCS-LENGTH(X,Y)1.m=2.n=3.Let b1.m,1.n and c0.m,0.n be new tables4.For i=1 to m5. ci,0=06.For j=0 to n7. c0,j=08.For i=1 to m9. For j=1 to n10.If xi=yj11. ci,j=ci-1,j-1+112. bi,j=113.Else if ci-1,j=ci,j-114. ci,j=ci-1,j15. bi,j=216.Else ci,j=ci,j-117. bi,j=3 ;PRINT-LCS(b,X,i,j)1.if i

15、=0 or j=02. Return ;3.If bi,j=14. PRINT-LCS(b,X,i-1,j-1)5. Print xi6.Elseif bi,j=27.PRINT-LCS(b,X,i-1,j) PRINT-LCS(b,X,i,j-1)三、实验总结 用动态规划求取最长公共子序列的时候,要理解b数组的用途和使用。一开始编程时将输入的字符串转化为字符出现问题,后来使用charAt()函数解决了问题。 实验编号2题目3最长公共子串实验内容用动态规划求取以下字符串的最长公共子串。实验目的用动态规划实现最长公共子串算法报 告 正 文一、算法原理 1 最优子结构 令X=和Y=为两个序列 Z=

16、为X和Y的任意最长公共子串。如果xm=yn,则zk=xm=yn且Zk-1是Xm-1和Yn-1的一个最长公共子串; 如果xmyn,则zkxm意味着Z是Xm-1和Y的一个最长公共子串;如果xmyn,则zkyn意味着Z是X和Yn-1的一个最长公共子串。 2 定义Li,j为以xi和yj为结尾的相同子串的最大长度,记录着X和Y的最长公共子串的最大长度。 3 最长公共子串的递归式 4 最长公共子串的时间复杂度为(mn),空间复杂度为(mn)。 2、伪代码 getLCString(str1,tr2) len1 = ;len2 = ;maxLen = len1 len2 len1 : len2;int max

17、 = new intmaxLen;int maxIndex = new intmaxLen;int c = new intmaxLen;Let max0.maxlen-1,maxindex0.maxlen-1 and c0.maxlen-1 be new tablesFor i = 0 to len2 for j = len1 - 1 to 0 if str2i = str1j if i = 0 or j = 0 cj = 1; else cj = cj - 1 + 1; else cj = 0; if cj max0) max0 = cj; maxIndex0 = j; for k = 1t

18、o maxLen maxk = 0; maxIndexk = 0; else if cj = max0 for k = 1 to maxLen if maxk = 0 maxk = cj; maxIndexk = j; for j to maxLen if maxj 0 Print j + 1 for i = maxIndexj - maxj + 1 to maxIndexj Print str1i三、实验总结 要同上述的最长公共子序列进行对比 区分他们的不同之处。也要理解用动态规划求解时的相同之处和不同之处。实验编号2题目4最大子段和实验内容给定n个整数(可能为负数)组成的序列a1,a2.a

19、n,求该序列ai+ai+1.aj的子段和的最大值。 实验目的用动态规划实现数列的最大和报 告 正 文1、算法原理 1 最优子结构:定义当所给整数全为负数的时候,最大子段和为0,则最大子段和为max0,ai+ai+1.+aj,1ijn 2 引入一个辅助数组b,动态规划的分解分为两步:(1)计算辅助数组的值;(2)计算辅助数组的最大值。辅助数组bj用来记录以j为尾的子段以及集合中的最大子段和。 3 最大子段和的递归式 4 最大子段和使用动态规划进行计算的时间复杂度为(n)。2、伪代码Maxsum(A)1.sum=02.temp=03.B1.=arraycopy(A)4.For i=0 to 5.I

20、f Bi06. Sum=Bi7. Break j=i+1 to 9. If Bj010. For a=i to j11. temp=temp+ba12. If tempsum13. sum=temp max三、实验总结 对比比较了动态规划和分治法的不同,感受到用动态规划解决的便捷。 实验编号2题目5最短路径问题实验内容解决多级图中的最短路径问题实验目的用动态规划解决多级图中的最短路径问题报 告 正 文一、算法原理1 可以由图可知,图中的顶点讲图划分7个阶段,分别了解每个阶段可以有几种可供选择的点,引入fk表示状态k到终点状态的最短距离。最优子结构为当前状态的fk由上个状态的fk-1和状态k-1

21、到状态k的距离决定决策:当前状态应在前一个状态的基础上获得。决策需要满足规划方程,规划方程f(k)表示状态k到终点状态的最短距离。 2 多段图最短路径的递归式 2、伪代码Shortestpathlet indexs 0.W10.length,isLabel 0.W10.lengthbe a new tablei_count = -1distance = W1start index = startpresentShortest = 0indexs+i_count = index;isLabelindex = true;while i_countW10.length min = ; for i =

22、 0 to if !isLabeli and distancei != -1 and i != indexif distancei distanceindex presentShortest = distanceindex;else presentShortest += W1indexsi_count - 1index; for i = 0 to if distancei = -1 and W1indexi != -1 distancei = presentShortest + W1indexi;else if W1indexi != -1 and presentShortest + W1in

23、dexi distancei) distancei = presentShortest + W1indexi; return distanceend - distancestart;三、实验总结 遇到的问题:无法将多段图的每个阶段点的状态表示并记录下来。并不了解如何将动态规划与贪心算法的如迪杰斯特拉算法进行对比,真正从最优子结构将最短路径表示出来。实验编号3题目1分数背包问题和0/1背包问题实验内容解决分数背包和0/1背包问题实验目的分别用贪心算法和动态规划实现分数背包问题和0/1背包问题报 告 正 文1、算法原理 1 0-1背包问题:选择n个元素中的若干个来形成最优解,假定为k个。对于这k个元素a1, a2, .ak来说,它们组成的物品组合必然满足总重量=背包重量限制,而且它们的价值必然是最大的。假定ak是我们按照前面顺序放入的最后一个物品,它的重量为wk,它的价值为vk。前面k个元素构成了最优选择,把ak物品拿走,对应于k-1个物品来说,它们所涵盖的重量范围为0-(W-wk)。假定W为背包允许承重的量,最终的价值是V,剩下的物品所构成的价值为V-vk。这剩下的k-1个元素构成了W-wk的最优解 。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1