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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

算法设计与分析实验指导书.docx

1、算法设计与分析实验指导书实验一、求最大公约数一、实验内容:(1)至少设计出3种版本的求最大公约数的算法;(2)对所设计的算法采用大O符号进行时间复杂性分析;(3)上机实现算法。二、实验要求:(1)掌握并应用算法的数学分析和后验分析方法;(2)理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。三、主要仪器设备装有TC或Visual C+的PC机四、实验步骤算法分析(1)连续整数检测1t=minm,n2m除以t,如果余数为0,则执行步骤3,否则,执行第4步;3n除以t,如果余数为0,返回t的值作为结果,否则执行第4步;4T=t-1,转第2步。(2

2、) 欧几里得算法1r=m%n;2循环直到r=0; 21 m=n; 22 n=r;23 r=m%n;3输出n.(3) 分解质因数算法1 将m分解质因数;2 将n分解质因数;3提取m和n中的公共质因数;4将m和n中的公共质因数相乘,乘积作为结果输出五、注意事项(1)、将本实验上机调试、运行,注意调试过程中出现的问题;(2)、结合运行结果,进行复杂性分析。实验二、 最近对问题一、实验内容按照按照蛮力法有关思想,写出相应的程序求解平面上的最近点对,并在计算机上调试成功,并分析其性能特征。二、实验要求结合学过的有关算法设计的基本知识,掌握蛮力算法;理解蛮力算法的概念特征;掌握其时间性能与空间性能及可能的

3、改进方案。 三、主要仪器设备装有TC或Visual C+的PC机四、实验步骤(1)算法分析用分治算法求S中最接近点对的基本思想是:选取一垂直线Lx = m作为分割直线,将S的点分割为点数大致相同的2个子集S1和S2,使得: S1=pS | p(x)m,S2=pS | p(x)m 其中:m是S中各点x坐标的中位数,因此S1和S2中点数大致相同,且S=S1S2。递归地在S1和S2上解最接近点对的问题,分别得到S1和S2中的最小距离d1和d2,并设d=mind1,d2。用P1和P2分别表示在直线L左边和右边与其距离在d范围的点构成的两个垂直长条平面区域。 P1:pP1 | (|m-x(p)|d),P

4、2:p P2 | (|x(p)-m|d) S中的最接近点对的距离或者是d,或者是某个p,q点对的距离,其中pP1,qP2。如果p,q是S中的最接近点对,则必有distance(p,q)将上述描述简化如下: (1)递归用L将节点集分成两个相等的部分; (2)设d是d1和d2的最小值; (3)删除离L超过d的节点; (4)按照y维扫描剩下的节点,计算5个邻居的距离; (5)如果距离小于d,更新d 下面我们分析分治算法的时间复杂度,由于步骤2-5是每个递归过程中都要去做的,我们先分析2-5。步骤2时间复杂度为O(1);步骤3时间复杂度为O(n);步骤4时间复杂度为O(1);步骤5时间复杂度为O(1)

5、,所以步骤2-5的时间复杂度为O(n)。步骤1递归地将平面S中的点分成两个相等的部分时间复杂度为O(logn),所以总的时间复杂度为O(n)* O(logn)=O(nlogn)。(2)参考代码#include #include#include #include #include using namespace std;const int N = 100005;const double MAX = 10e100;const double eps = 0.00001;typedef struct TYPE double x, y; int index; Point;Point aN, bN, cN

6、;double closest(Point *, Point *, Point *, int, int);double dis(Point, Point);int cmp_x(const void *, const void*);int cmp_y(const void *, const void*);int merge(Point *, Point *, int, int, int);inline double min(double, double);int main() int n, i; double d; scanf(%d, &n); while (n) for (i = 0; i n

7、; i+) scanf(%lf%lf, &(ai.x), &(ai.y); qsort(a, n, sizeof(a0), cmp_x); for (i = 0; i n; i+) ai.index = i; memcpy(b, a, n *sizeof(a0); qsort(b, n, sizeof(b0), cmp_y); d = closest(a, b, c, 0, n - 1); printf(%.2lfn, d); scanf(%d, &n); return 0;double closest(Point a, Point b, Point c, int p, int q) if (

8、q - p = 1) return dis(ap, aq); if (q - p = 2) double x1 = dis(ap, aq); double x2 = dis(ap + 1, aq); double x3 = dis(ap, ap + 1); if (x1 x2 & x1 x3) return x1; else if (x2 x3) return x2; else return x3; int m = (p + q) / 2; int i, j, k; double d1, d2; for (i = p, j = p, k = m + 1; i = q; i+) if (bi.i

9、ndex = m) cj+ = bi; /数组c左半部保存划分后左部的点, 且对y是有序的. else ck+ = bi; d1 = closest(a, c, b, p, m); d2 = closest(a, c, b, m + 1, q); double dm = min(d1, d2); merge(b, c, p, m, q); /数组c左右部分分别是对y坐标有序的, 将其合并到b. for (i = p, k = p; i = q; i+) if (fabs(bi.x - bm.x) dm) ck+ = bi; /找出离划分基准左右不超过dm的部分, 且仍然对y坐标有序. for

10、(i = p; i k; i+) for (j = i + 1; j k & cj.y - ci.y dm; j+) double temp = dis(ci, cj); if (temp dm) dm = temp; return dm;double dis(Point p, Point q) double x1 = p.x - q.x, y1 = p.y - q.y; return sqrt(x1 *x1 + y1 * y1);int merge(Point p, Point q, int s, int m, int t) int i, j, k; for (i = s, j = m +

11、1, k = s; i = m & j qj.y) pk+ = qj, j+; else pk+ = qi, i+; while (i = m) pk+ = qi+; while (j x - (Point*)q)-x; if (temp 0) return 1; else if (fabs(temp) y - (Point*)q)-y; if (temp 0) return 1; else if (fabs(temp) q) ? (q): (p);五、注意事项(1)、将本实验上机调试、运行,注意调试过程中出现的问题;(2)、结合运行结果,进行复杂性分析。实验三、 快速排序算法一、实验内容利用

12、快速排序算法编制程序对给定的一组数排序,并分析其性能。二、实验要求掌握分治法解决问题的策略;学会使用分治法设计程序并能分析它。三、主要仪器设备装有TC或Visual C+的PC机四、实验步骤(1)算法分析快速排序的基本思想是基于分治策略的。对于输入的子序列Lp.r,如果规模足够小则直接进行排序,否则分三步处理:分解(Divide):将输入的序列Lp.r划分成两个非空子序列Lp.q和Lq+1.r,使Lp.q中任一元素的值不大于Lq+1.r中任一元素的值。 递归求解(Conquer):通过递归调用快速排序算法分别对Lp.q和Lq+1.r进行排序。 合并(Merge):由于对分解出的两个子序列的排序

13、是就地进行的,所以在Lp.q和Lq+1.r都排好序后不需要执行任何计算Lp.r就已排好序。(2)参考代码QSort(Sqlist &L,int low,int high) c=high-low; /*循环次数*/ if(cL.rhigh.key)L.rlowL.rhigh; /*确保区间内第一个元素的值不大于区间内最后一个元素的值*/ ilow=low; /*小于区间内第一个元素的值数组边界下标*/ ihigh=high; /*大于区间内最后一个元素的值数组边界下标*/ for(i=low+1;ic;i+) if(L.ri.keyL.rlow.key)L.riL.r+ilow; /*小于区间内

14、第一个元素的值放置ilow区间内*/ else if(L.ri.keyL.rhigh.key) L.riL.r-ihigh; /*大于区间内最后一个元素的值放置ihigh区间内*/ i-; /*下一个比较位置不变*/ c-; /*循环次数减一*/ L.rilowL.rlow; /*将小于区间内第一个元素的边界下标元素与第一个元素互换*/ L.rihighL.rhigh; /*将大于区间内最后一个元素的边界下标元素与最后一个元素互换*/ QSort(L,low,ilow-1); QSort(L,ilow+1,ihigh-1); QSort(L,ihigh+1,high); void QuickS

15、ort(Sqlist &L) QSort(L,1,L.length); 五、注意事项(1)、将本实验上机调试、运行,注意调试过程中出现的问题;(2)、结合运行结果,进行复杂性分析。实验四、最大子段和(分治法)一、实验内容编制程序求解如下问题:给定由n个整数(可能有负整数)组成的序列(a1,a2,an),最大子段和问题要求该序列形如的最大值(1=i=j=n),当序列中所有整数均为负整数时,其最大子段和为0。二、实验要求进一步掌握递归算法的设计思想以及递归程序的调式技术;理解这样一个观点,分治与递归经常同时应用在算法设计之中。三、主要仪器设备装有TC或Visual C+的PC机四、实验步骤(1)算

16、法分析首先判断输入的数组是不是一个元素。如果是,则再看该元素是不是大于0.如果大于0,则问题的解为该元素的值,否则为0;如果输入的数组不是一个数,则求出其数组中间的元素下标。递推对前半部分数组(low,center)和后半部分(center+1,high)求最大字段和.之后,设置一个左标记和一个右标记。从数组中间向前边执行for语句。在这个过程中,把当前元素加到左标记里面去。同时判断左标记是不是大于左部分可能的字段和,如果大于,把左部分可能的字段和值设置为左标记的值。对数组的右半部分做同样操作。把右半部分的当前元素加到右标记里面去。同时判断右标记是不是大于右部分可能的字段和,如果大于,把右部分

17、可能的字段和值设置为右标记的值。之后设置可能的问题解为左部分可能解和右部分可能解之和。之后判断该可能解是不是大于该数组左边和右边的递推解。如果前者没有后面2者的一个大。则设置问题的最终解为最大者。(2)参考代码#include #define N 10 int subMaxSum(int a,int low,int high) /*quickSort*/ int sum=0; int i; if(low=high) sum=alow; if(sum=low;i-) leftsum+=ai; if(leftsums1)s1=leftsum; for(i=center+1;is2)s2=lefts

18、um; sum=s1+s2; if(sumleftsum)sum=leftsum; if(sumrightsum)sum=rightsum; return sum; int MaxSum(int a,int n) return subMaxSum(a,0,n-1); void main(void) int i,sum; int testN; for(i=0;iN;i+) printf(please input the %d number:,i+1); scanf(%d,&testi); printf(n); printf(your input is:); for(i=0;i 0 ; xi =

19、yi 时 , cij = ci-1j-1 + 1当 i , j 0 ; xi != yi 时 , cij = max cij-1 , ci-1j (2)参考代码#include iostream.h#include iomanip.h#define max 100void LCSLength( int m , int n , char *x , char *y , char *b )int i , j , k;int cmaxmax;for( i = 1 ; i = m ; i+ )ci0 = 0;for( i = 1 ; i = n ; i+ )c0i = 0;for( i = 1 ; i

20、= m ; i+ )for( j = 1 ; j = cij-1 )cij = ci-1j;k = i * ( n + 1 ) + j;bk = |;elsecij = cij-1;k = i * ( n + 1 ) + j;bk = -;void LCS( int i , int j , char *x , char *b , int width )if( i = 0 | j = 0 )return;int k = i * ( width + 1 ) + j;if( bk = )LCS( i - 1 , j - 1 , x , b , width );coutxiendl;else if(

21、bk = | )LCS( i - 1 , j , x , b , width );elseLCS( i , j - 1 , x , b , width );void main()char xmax = a , b , c , b , d , a , b ;char ymax = b , d , c , a , b , a ;int m = 7;int n = 6;char bmax = 0 ;LCSLength( m , n , x , y , b );LCS( m , n , x , b , n );coutendlendl;五、注意事项(1)、将本实验上机调试、运行,注意调试过程中出现的问

22、题;(2)、结合运行结果,进行复杂性分析。实验六、最大子段和(动态规划)一、实验内容运用动态规划法编制一个程序求解实验3的最大字段和问题,并对这两种算法比较分析。二、实验要求深刻掌握动态规划法的设计思想并能熟悉运用;理解这样一个观点,同样的问题可以用不同的方法解决,一个好的算法是返回努力和重新修正的结果。三、主要仪器设备装有TC或Visual C+的PC机四、实验步骤(1)算法分析若记bj=max(ai+ai+1+.+aj),其中1=i=j,并且1=j=n。则所求的最大子段和为max bj,1=j0时bj=bj-1+aj,否则bj=aj。故bj的动态规划递归式为:bj=max(bj-1+aj,aj),1=j=n。据此,可设计出求最大子段和问题的动态规划算法。(2)参考代码int maxSum(int a)int sum=0;int b=0;for(int i=0;i0) b+=ai;else b=ai;if(bsum)sum=b; return sum;五、注意事项(1)、将本实验上机调试、运行,注意调试过程中出现的问题;(2)、结合运行结果,进行复杂性分析。实验七、哈夫曼编码一、实验内容运用贪心法编制程序求解如下问题:设需要编码的字符集为d1,d2,dn,它们出现的频率为w1,w2,wn,应用哈夫曼树构造最短的不等长编码方案。二、实验要求了解前缀

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

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