2011-2012(1)《算法分析与设计》上机指导书
- 格式:doc
- 大小:134.50 KB
- 文档页数:18
算法设计与分析实验指导书. . .. . .算法设计与分析实验指导书东北大学软件学院2012年.. .专业. .目录算法设计与分析 (1)实验指导书 (1)前言 (3)实验要求 (4)实验1 分治法的应用(2学时) (5)1.实验目的 (5)2.实验类型 (5)3.预习要求 (5)4.实验基本要求 (5)5.实验基本步骤 (7)实验2动态规划(2学时) (9)1.实验目的 (9)2.实验类型 (9)3.预习要求 (9)4.实验基本要求 (9)5.实验基本步骤 (10)实验3 回溯法(4学时) (12)1.实验目的 (12)2.实验类型 (12)3.预习要求 (12)4.实验基本要求 (12)5.实验基本步骤 (13)前言《算法设计与分析》是一门面向设计,处于计算机科学与技术学科核心地位的教育课程。
通过对计算机算法系统的学习,使学生理解和掌握计算机算法的通用设计方法,培养对算法的计算复杂性正确分析的能力,为独立设计算法和对算法进行复杂性分析奠定基础。
要求掌握算法复杂度分析、分治法、动态规划法、贪心法、回溯法、分支限界法等算法的设计方法及其分析方法。
能将这些方法灵活的应用到相应的问题中,并且能够用C++实现所涉及的算法,并尽量做到低复杂度,高效率。
通过本课程的实验,使学生加深对课程容的理解,培养学生严密的思维能力,运用所学知识结合具体问题设计适用的算法的能力;培养学生良好的设计风格,激励学生创造新算法和改进旧算法的愿望和热情。
希望同学们能够充分利用实验条件,认真完成实验,从实验中得到应有的锻炼和培养。
希望同学们在使用本实验指导书及进行实验的过程中,能够帮助我们不断地发现问题,并提出建议,使《算法设计与分析》课程成为对大家有益的课程。
实验要求《算法设计与分析》课程实验的目的是为了使学生在课堂学习的同时,通过一系列的实验,使学生加深理解和更好地掌握《算法设计与分析》课程教学大纲要求的容。
在《算法设计与分析》的课程实验过程中,要求学生做到:(1)仔细观察调试程序过程中出现的各种问题,记录主要问题,做出必要说明和分析。
计算机科学与技术学院算法分析与设计实验指导书2011年8月于洪编写2015年9月周应华修订目录实验一分治策略排序 (3)实验二减治策略查找顺序表 (5)实验三动态规划求解0/1背包问题 (8)实验四贪心算法求解最短路径问题 (10)附录1 关于文件的操作 (12)附录2 关于如何统计运算时间 (13)实验一分治策略排序实验目的1)以排序问题为例,掌握分治法的基本设计策略;2)熟练掌握合并排序算法的实现;3)熟练掌握快速排序算法的实现;4) 理解常见的算法经验分析方法。
实验环境计算机、C语言程序设计环境实验学时2学时实验内容与步骤1.准备实验数据要求:编写一个函数data-generate,生成2000个在区间[1,10000]上的随机整数,并将这些数输出到外部文件data.txt中。
这些数作为本算法实验的输入数据。
2.实现合并排序算法要求:实现mergesort算法。
输入:待排数据文件data.txt;输出:有序数据文件resultsMS.txt(注:建议将此排好序的数据作为实验二的算法输入);程序运行时间TimeMS。
合并排序算法(类C语言):/* 数组A[] 中包含待排元素;array B[] is a work array */TopDownMergeSort(A[], B[], n){TopDownSplitMerge(A, 0, n, B);}// iBegin is inclusive; iEnd is exclusive (即:A[iEnd]不是待排元素)TopDownSplitMerge(A[], iBegin, iEnd, B[]){if(iEnd - iBegin < 2) // 如果只有1个待排元素,返回。
return;// recursively split runs into two halves until run size == 1,// then merge themiMiddle = (iEnd + iBegin) / 2; // 划分TopDownSplitMerge(A, iBegin, iMiddle, B);TopDownSplitMerge(A, iMiddle, iEnd, B);TopDownMerge(A, iBegin, iMiddle, iEnd, B); // 合并;元素放到数组B中。
《算法设计与分析》实验指导书计算机科学与技术学院石少俭实验一分治法1、实验目的(1)掌握设计有效算法的分治策略。
(2)通过快速排序学习分治策略设计技巧2、实验要求(1)熟练掌握分治法的基本思想及其应用实现。
(2)理解所给出的算法,并对其加以改进。
3、分治法的介绍任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。
问题的规模越小,越容易直接求解,解题所需的计算时间也越少。
而当n较大时,问题就不那么容易处理了。
要想直接解决一个规模较大的问题,有时是相当困难的。
分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
如果原问题可分割成k个子问题,1<k≤n ,且这些子问题都可解,并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。
由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。
在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。
这自然导致递归过程的产生。
分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。
分治法的适用条件(1)该问题的规模缩小到一定的程度就可以容易地解决;(2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
(3)利用该问题分解出的子问题的解可以合并为该问题的解;(4)该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
上述的第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加;第二条特征是应用分治法的前提,它也是大多数问题可以满足的,此特征反映了递归思想的应用;第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条特征,而不具备第三条特征,则可以考虑贪心法或动态规划法。
第四条特征涉及到分治法的效率,如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然可用分治法,但一般用动态规划法较好。
《算法设计与分析》课程实验指导书作者:姜文君杨明李梦娴单位:信息科学与工程学院2015年4月一、实验教学目标《算法设计与分析》旨在教会学生处理各种问题的方法,而通过实验,使学生能够把所学的方法用于具体的问题,并对所用算法进行比较分析,从而提高学生分析问题、解决问题的能力。
只有通过实验,学生才能判定自己所拟算法是否正确,是否算得上一个较优算法。
通过该课程的实验,使学生对课堂中所讲述的内容有一个直观的认识,更好地掌握所学的知识。
同时培养学生的实际动手能力,加强学生创新思维能力的培养。
二、实验教学主要内容实验课外时间组织:实验课外消化理论课堂,老师对项目实验的讲解,并且做好相关的设计与实现。
实验课内时间组织:学生在学院机房集中上机,实验教师在机房采用辅导和自由讨论相结合的方式进行指导。
最终完成实验项目的检查。
三、实验要求《算法设计与分析》是计算机专业的专业核心课程,其先修课程有数据结构和至少一门高级语言。
算法设计与分析课程将覆盖计算机软件实现中的大部分算法,并具有一定的深度和广度,使学生对计算机常用算法有一个全盘的了解;通过此课的学习,学生应该具有针对所给的问题设计和实现高效算法的能力。
通过上机实验,将使学生熟悉、掌握课堂教学中所学的大部分算法。
同时,上机实验是对学生在软件设计方面的综合训练,包括问题分析、总体结构设计、用户界面设计(可选)、程序设计基本技能和技巧等,以培养良好的编程风格和科学作风。
通过理论联系实际,以最终提高学生动手操作的能力以及分析问题的能力。
为了顺利完成《算法设计与分析》课程实验,学生应做到:1、熟练掌握一种高级程序设计语言及相关开发工具。
2、认真学习教材以及老师课堂讲解的项目实验相关内容,提前做好分析设计和实现。
3、自行完成代码编写,不得超袭。
实验课上课时间做好项目陈述和检查的准备,也可以针对一些问题做相应的讨论。
4、遵守机房纪律,服从辅导教师指挥,爱护实验设备。
5、实验课上进行相关的程序检查和测试,结束后提交所有的文档和源程序。
精品文档可修改昆明理工大学信息工程与自动化学院学生实验报告( 2011 — 2012 学年第 1 学期)课程名称:算法分析与设计开课实验室:信自楼机房444 2011年10月12日一、上机目的及内容上机目的(1)复习数据结构课程的相关知识,实现课程间的平滑过渡;(2)掌握并应用算法的数学分析和后验分析方法;(3)理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。
上机内容求两个自然数m和n的最大公约数。
二、实验原理及基本技术路线图(方框原理图或程序流程图)实验原理(1)至少设计出三个版本的求最大公约数算法;(2)对所设计的算法采用大O符号进行时间复杂性分析;(3)上机实现算法,并用计数法和计时法分别测算算法的运行时间;(4)通过分析对比,得出自己的结论。
流程图三、所用仪器、材料(设备名称、型号、规格等或使用软件)设备:1台PC及VISUAL C++6.0软件。
四、实验方法、步骤(或:程序代码或操作过程)源程序:#include<stdio.h>#include<time.h>#include<stdlib.h>int max(int m,int n){int r;if(m>n)r=n;elser=m;return r;}void Menu(){int a;void algorithmone();void algorithmtwo();void algorithmthree();printf("请选择算法:\n");printf("1.算法一\n");printf("2.算法二\n");printf("3.算法三\n");scanf("%d",&a);getchar();switch(a){case 1:algorithmone();break;case 2:algorithmtwo();break;case 3:algorithmthree();break;default:printf("请输入1,2,3中的一个!\n");}}void algorithmone() //算法一{clock_t start,finish;int m,n,r;char key;printf("求两个数的最大公约数,请输入这两个数:");scanf("%d %d",&m,&n);getchar();start=clock();r=max(m,n);while(r>0){if(m%r==0){if(n%r==0){printf("算法一求出的最大公约数为%d\n",r);finish=clock();break;}elser=r-1;}elser=r-1;}printf("算法一所需的时间是:%ld秒\n",(finish-start));printf("是否返回主菜单?(y/n):");key=getchar();switch(key){case 'y':Menu();break;case 'Y':Menu();break;case 'n':break;case 'N':break;default:printf("error!\n");}}void algorithmtwo() //算法二{clock_t start,finish;int m,n,r;char key;printf("求两个数的最大公约数,请输入这两个数:");scanf("%d %d",&m,&n);start=clock();while((r=m%n)!=0){m=n;n=r;r=m%n;if(r==0){printf("算法二求出的最大公约数为%d\n",n);finish=clock();break;}}printf("算法二所需的时间是:%ld秒\n",(finish-start));getchar();printf("是否返回主菜单?(y/n):");key=getchar();switch(key){case 'y':Menu();break;case 'Y':Menu();break;case 'n':break;case 'N':break;default:printf("error!\n");}}void commonzhishu(int arraym[],int arrayn[]) //提取公共质数{int i,j,k=0,common[3],d=0;for(i=0;i<3;i++)for(j=0;j<3;j++)if(arraym[i]==arrayn[j]){common[k]=arraym[i];k=k+1;}for(k=0;k<3;k++)for(d=k+1;d<3;d++)if(common[k]==common[d])common[d]=1;printf("算法三结果%d\n",common[0]*common[1]*common[2]);}void algorithmthree() //算法三{clock_t start,finish;int m,n,mr,nr,i;float count;char key;mr=2;nr=2;printf("求两个数的最大公约数,请输入这两个数:");scanf("%d %d",&m,&n);int arraym[3],arrayn[3];i=0;start=clock();while(m!=1) //将两数分解{if((count=(float)(m%mr))==0.0){arraym[i]=mr;i++;m=m/mr;}elsemr++;}for(i=0;i<3;i++)printf("%d ",arraym[i]);printf("\n");i=0;while(n!=1){if((count=(float)(n%nr))==0.0){arrayn[i]=nr;i++;n=n/nr;}elsenr++;}for(i=0;i<3;i++)printf("%d ",arrayn[i]);printf("\n");commonzhishu(arraym,arrayn);finish=clock();printf("算法三所需的时间是:%ld秒\n",(finish-start));getchar();printf("是否返回主菜单?(y/n):");key=getchar();switch(key){case 'y':Menu();break;case 'Y':Menu();break;case 'n':break;case 'N':break;default:printf("error!\n");}}void main(){int a;printf("请选择算法:\n");printf("1.算法一\n");printf("2.算法二\n");printf("3.算法三\n");scanf("%d",&a);getchar();switch(a){case 1:algorithmone();break;case 2:algorithmtwo();break;case 3:algorithmthree();break;default:printf("请输入1,2,3中的一个!\n");}}五、实验过程原始记录( 测试数据、图表、计算等)六、实验结果、分析和结论(误差分析与数据处理、成果总结等。
计算机算法分析与设计实验指导书
杨红云
适用专业:软件工程
江西农业大学软件学院
计算机算法分析与设计实验指导书
计算机算法分析与设计是面向设计的,它是计算机科学和软件工程应用的核心。
无论是计算机系统、系统软件和解决计算机的各种应用课题都可归结为算法的设计。
通过本课程的学习,使学生掌握计算机领域中许多常用的非数值的精确的描述:分治法、贪心法、动态规划、回溯法等。
并掌握算法分析的方法。
从而将学生分析问题和解决问题的能力提高到高层理论的高度。
前期课程为程序设计语言、数据结构、高等数学,即学生应该具备一门高级语言程序设计编程基础,学习基本的数据结构知识,还要求学生掌握较好的数学基础。
实验学时:16学时。
福州大学数学与计算机科学学院《计算机算法设计与分析》上机实验报告(2)4.根据计算最优值时得到的信息,构造最优解3.算法正确性证明对于矩阵连乘积的最优计算次序问题,设计算A[ i : j ],1<=i<=j<=n,所需的最少数乘次数为m[ i ][ j ],则原问题的最优值为m[ 1 ][ n]。
当i=j时,A[ i ; j ]=Ai,为单一矩阵,无需计算,因此m[ i ][ i ]=0。
当i < j时,可以利用最优子结构的性质来计算m[ i ][ j ]。
事实上,若计算A[ i : j ]的最优次序在Ak和Ak+1之间断开,i<=k<j,则m[ i ][ j ]=m[ i ][ k ]+m[k+1][ j ]+Pi-1*Pk*Pj。
其中Pi表示第i个矩阵的列数,也是第i-1个矩阵的行数,P0表示第一个矩阵的行数。
由于在计算时并不知道断开点k的位置,所以k还未定。
不过k的位置只有j-i个可能。
从而m[ i ][ j ]可以递归地定义为当i=j m[ i ][ j ] = 0当i<j m[ i ][ j ] = min{ m[ i ][ k ]+m[ k+1 ][ j ]+Pi-1*Pk*Pj }m[ i ][ j ]给出了最优值,即计算A[ i : j ]所需的最少数乘次数。
同时还确定了计算A[ i : j ]的最优次序中的断开位置k,也就是说,对于这个k有m[ i ][ j ]=m[ i [ k ]+m[ k+1 ][ j] + Pi-1*Pk*Pj若将对应于m[ i ][ j ]的断开位置k记为s[ i ][ j ],在计算最优值m[ i ][ j ]后,可以递归地有s[ i ][ j ]构造出相应的最优解。
根据计算m[ i ][ j ]的递归式,容易写一个递归算法计算m[ 1 ][ n ]。
但是简单地递归将好费指数计算时间。
在递归计算时,许多子问题被重复计算多次。
《算法设计与分析》实验指导书《算法设计与分析》实验指导书本文档主要用于《算法设计与分析》课程的实验指导。
《算法设计与分析》旨在教会学生处理各种问题的方法,通过实验,使学生能够把所学的方法用于具体的问题,并对所用算法进行比较分析,从而提高学生分析问题、解决问题的能力。
通过该课程的实验,使学生对课堂中所讲述的内容有一个直观的认识,更好地掌握所学的知识,培养学生的实际动手能力,加强学生创新思维能力的培养。
本课程设计了7个设计型实验。
实验内容包括用分治法、动态规划、贪心法、回溯法以及分支限界法求解问题。
一、实验内容安排二、实验基本要求实验前要求学生一定要先了解实验目的、内容、要求以及注意事项,要求学生熟悉实验对象,设计并编写相应的算法。
学生应独立完成所布置实验内容,编写代码,运行程序,记录结果并撰写实验报告。
三、实验报告要求实验结束后,应及时整理出实验报告,实验报告提交书面文档。
四、考核方式理论考试(60%)+实验(30%)+作业(10%)五、实验内容与指导实验一快速排序问题1.实验目的(1) 用分治法求解该问题。
2.实验环境PC机,要求安装Eclipse软件或VC++软件供学生实验。
3.实验内容有n个无序的数值数据,现要求将其排列成一个有序的序列。
4. 实验步骤(1) 输入实现该问题的源代码;(2) 输入测试数据,验证代码的正确性。
5.实验要求(1)做好实验预习,熟悉本实验中所使用的开发环境。
(2)写出实验报告①实验目的②实验内容③出错信息及处理方法④实验结果实验二最少硬币问题1.实验目的(1) 用动态规划求解该问题。
2.实验环境PC机,要求安装Eclipse软件或VC++软件供学生实验。
3.实验内容有n种不同面值的硬币,各硬币面值存于数组T[1:n];现用这些面值的钱来找钱;各面值的个数存在数组Num[1:n]中。
对于给定的1≤n≤10,硬币面值数组、各面值的个数及钱数m,0<=m<=2001,设计一个算法,计算找钱m的最少硬币数。
算法实验指导书12级《算法设计与分析》实验指导书本实验指导书是为配合《算法设计与分析》课程实验而编写的,其目的是使学生消化算法理论知识,加深对课堂讲授内容的理解,尤其是一些典型算法的实现及其应用,培养学生独立编程和调试程序的能力,使学生对算法的设计与分析有更深刻的认识。
一、上机实验应遵循以下步骤:(1)实验前,先准备好上机所需的程序。
手编程序应书写整齐,并经自我检查无误后才能上机。
(2)实验时,输入并调试自己所编的程序,独立上机调试,上机时出现的问题,最好能自己独立解决。
(3)实验结束后,按照规定整理出实验报告,并在规定时间内提交。
二、实验报告的内容:实验报告应该包括:实验名称、实验目的、实验题目、问题分析、程序清单、运行结果、实验结论(即算法的时间空间分析与改进建议)。
三、需写出实验报告的实验:实验一、实验四、实验五。
实验一递归与迭代算法一、实验目的与要求1、通过本实验掌握迭代算法和递归算法的基本思想及设计工作的主要步骤。
2、通过本实验加深对循环和递归过程的理解。
3、通过本实验加深对迭代过程的理解。
4、掌握两种算法策略的主要适用范围。
二、实验题目:1、求2+22+222+……+22……22(精确计算)n个22、从键盘输入任一正整数n(n>=3),打印如下图所示的n×n 方阵(下图中n=7)。
1 2 3 4 5 6 724 25 26 27 28 29 823 40 41 42 43 30 922 39 48 49 44 31 1021 38 47 46 45 32 1120 37 36 35 34 33 1219 18 17 16 15 14 133、完成给“余”猜数的游戏:心里先想好一个1~100之间的整数x,然后输入3个除数a、b、c,再输入x分别除以a、b、c后所得到的余数ra、rb、rc,计算机能求出这个数x并输出x。
4、用递归函数判断字符串str是否为“回文”。
三、实验步骤1、理解算法思想和问题要求。
《算法设计与分析》上机报告姓名李晓荣学号SA09225085 0期2009.10.14⑺ 当n=100000, k=18时运行结果如下:7li00000,ls/183 2 8 *20 5 -!■ 4-144 !■ ■■■・ ■ 为为了 • 红丑继 运运g 的⑵当n=100000, k=13时运行结果如下: 为为了 -- 迂爼继 运U 也 的的比意 =曙⑶当时运行结果如下: QQ "^1100000^ k 14 458.4. 4 ■FVB-II■ 为为了・间间ft - 迂朴继 云运$ 的的比意⑷当n=100000, k=15时运行结果如下:(5)当n=100000, k=16时运行结果如下: n 为 100000, lc 为“ ■■ ■■ ■■ ■ 为为了・ 间间快- 续 迂花(6)当n=100000, k=17时运行结果如下: gj 为 1000003:■ -■ ■事 • 为为了・ -继 运运如 的的比意(13)当n=100000, k=24时运行结果如下: "^100000, 8⑻ 当n=1OOOOO, k=19时运行结果如下: n%100000,kT119 ⑼ 当n=100000, k=2O 时运行结果如下:In W100t)00,k^20 ⑽ 当n=100000, k=21时运行结果如下:(11)当n=100000, k=22时运行结果如下:n/^100000>k 为22 (12)当n=100000, k=23时运行结果如下: OA 【*f ■ iim0 4 7 4;4404«■■■ ■■ ■- 为为了・ 间间決- 近爲继运运屢 的的比意 亠曙后任 化化化按 * 8 4■4 95 九加7!- ・ 刖续 程亦继 运运集 的的比意 亠曙后俗 9 7 2 4,.9.0 4 9 5 3 X f t il 为为了・间间快- 续 继 运运建 的战比茁 化化化按 请为为了 > 可间央-继 的的.比意 亠曙后«■ 化化化按 44-25 40 4.25 ■* - A 为行%继 运运蛊 的的比意 4曙后任 化化化按优优1^请 0 44(13)当n=100000, k=24时运行结果如下: 3 ♦■•■ »» _■为为了・ ・ 继 运运蔭 的的比意 化化化按(18)当n=100000, k=60时运行结果如下:(14)当n=100000, k=25时运行结果如下: h 711100000, kT!2 5(15)当n=100000, k=30时运行结果如下:0^100000, k 为30(16)当n=100000, k=35时运行结果如下:(16)当n=100000, k=40时运行结果如下:n ^Ml©0000?l<~Si40(17)当n=100000, k=50时运行结果如下:为:44.51 为:40-E4 了; 3.9?同间快・ 的的比意 亠曙后任化化化按8 5 4 4--0-fl 4 0 4 4 ■ ■ ■■ S ■ 为为了 • 间问快・ 续 运运陰 的的比意 二曙后任 化化化按4 *v «w I II 为为了・ 刖续 迂运继 运运直 的的比意 骂后任 化化化按 连忧请3 2 8 ・3 ?5 一 * 4 13 4 t -* ■为湖了> 征近继 运运蔭 的的比意 亠凳后任 化化化按 •- ■ ■■■ ■ 为为了. - 时啦刖续 迂S-继 运运直 的的比意 亠胃后杞 化化化按片a-l "Si00800,k 为24(18)当n=100000, k=60时运行结果如下:45^3 44*49 0-8399999999999962.当n=250000,数组A 的取值范围为1到2500000,k 从8到65中取值优化前与 优化后的运行时间分别为下面 20个图⑴当n=250000, k=8时运行结果如下:n^l250000,⑵当n=250000, k=12时运行结果如下:n :^250000,k^I12⑶当n=250000, k=13时运行结果如下:n%250000,k^!3 行吋〔可为:122-83 行吐通为= 112-56 化前快了: 10-27 继续・•・ ⑷当n=250000, k=14时运行结果如下:XI 为:123-16 列为二丄丄3 -28 夬了 : 9-88 ⑸当n=250000, k=15时运行结果如下:^7100000,k 为盹为为了 - - 刖续 近亚继运运量 优化化按 • 9 3 3 ■2 2 4 - 118 13 I i ■ 为为了- 迂逐继运运谨 的的比意 化化化按 吮连请 114 -X 0 3 -- 2 2 1 ill 1 为为了 - WI 刖续 迂花继 运运塚 的旳比意 亠曙后任 化化化按 运运蔭 的的比意 前后后任 化化化按时时前续征爼继 ii 的的比意 曆后任 化化化按E420(11)当n=250000, k=21时运行结果如下:In代化前的运i [比化汩的运[请按隹恚犍纟 亍吋[司为=122-96 TTO?;111-9 乜吨快了= 11-3& ⑹当n=250000, k=16时运行结果如下:tf^2S0000J<%18n=250000, k=19九为﹁- ・ fi s-继 运运将 的的比意 土曙后任(7)当n=250000, k=17时运行结果如下: ⑻当n=250000, k=18时运行结果如下:nnFK 7 2 5 -9 6 i -- 20 0 111 ! ■ ■ ■■ H 为为了122.07 110-4 11.67 S ■■ ■-为为了・- 时吐易 运运业 的的比意 4曙后任可为i 122 .IT 夬「11-36 辽花继 运运业 的的比意⑽当n=250000, k=20时运行结果如下: -84 99 75 2 10 111 1 H - S 31 迂张继 运运谨 的的比意(17)当n=250000, k=30时运行结果如下:tsl 250@03^k 121-97 111.15 ±9.82 为为了 - 圖窝-代■化莎的运行业 信浚任育槌麻義(12)当n=250000, k=22时运行结果如下::d e J I 订 X [r250000,1^122 运行吋〔刖为’ 122-37 运行时可^:110.1G 优屁谕快了: 12-21 韓蜒蹊・・・ 的的比童 亠曙后借 化化化按(13)当n=250000, k=23时运行结果如下:1 *1 rPl In ^1250000,k^j23 4 3 4 ■ 0 62 - ■ 2 0 1 1111 ■■ ■■ ■・ ■ 为为了 - - 區刖续 (14)当n=250000, k=24时运行结果如下:24 Off 7J2 50000. k2 8 6 ■ 29 1 ■ ■ 2 0 0 111 1 s S «« ■ 为为了 - 同间快" 一辽.35 08 27 jH250000,J<%25(16)当n=250000, k=26时运行结果如下: (15)当n=250000, k=25时运行结果如下: a ■ ■ ■ - ■ ■ m ■ ・・F »' ■■■ ・ n e II ・r ・T i2 11 i l l 1 s I s ■- 为为了.- 31 征花继 运运曜121,19 112.07 9.12为为了・ 迂爼继 运运谨 的的比意 亠曙后任7^250000>k5^30 吋迥为=123-03 吐间为瞋炖E 前快「= 10-3 (17)当n=250000, k=40时运行结果如下:(18)当n=250000, k=50时运行结果如下: 丽 如当n=250000, k=65时运行结果如下: 冋为:122.32 '可为:122.96 -0 2 3 * 0 244 丄1-9 1 s -I 为为了・ -3M 迂花继 运运普 的的比意 亠if莎继 ss 的的比意嘗后任化化套 50 2B0000,k可为:坨墾“ 可为:117.43 夬了; S.25999999999999迂%继运运低 的的比意 =聲后任 化化化按 S 1 ■ 9 2 2 - £0 2 0 - 12 1 1 X ! n 为为了 -迂爼继 运运曜 的的比意 亠曙后任 化化化按继 运运雜 的的比意 亠儈后任 化化化按(19)当n=250000, k=60时运行结果如下:n7^250000^ k3.当n=1000000,数组A的取值范围为1到10000000,k从8到80时优化前与优化后的运行时间分别为下面10个图⑴当n=1000000时,k=8时的运行结果如下图:(7)当n=1000000时,k=21时的运行结果如下图⑶当n=1000000时,k=17时的运行结果如下图匚 i C : YVIMDOwSA^jr^te In ^11000800/k ^117⑷当n=1000000时,k=18时的运行结果如下图n ^11000000, k 7118可为:541.44 旬为;49&.6 ^T : 44.84 n 为 1000000?kAf20无化煎的运行旳 尤优后比ftiiw 有按任意犍继缮 C : kriOOISAeys “■驱heL *⑵当n=1000000时,k=16时的运行结果如下图 3 - " &^1000000^(%16 -8 4 1 ・ ・ 5 5 5 5 0 45 ! ■■ ■■ ﹂■ 为为了 -间间•■ ■ ■ : « 为为了・ 决- 區刖续 迂証继 i ︱ 的的比意 亠磐后任 化化化按 运运优 勺勺匕 JRHJff.Lrk *诰后 化化化10QOQQ0r k 为35 运运优勺勺匕 丄畧启/ J /J/J 司为:540.63 同为:498.48 42,15 (5)当n=1000000时,k=19时的运行结果如下图 13M 捋宿詐 (6)当n=1000000时,k=20时的运行结果如下图(7)当n=1000000时,k=21时的运行结果如下图为约00丽dk 为2』(⑽当n=1000000时,k=24时的运行结果如下图:[n ^11000000, k^24为为了 夬 5151515151515151515 目为.545.83 间为:£即・?7 快了 = 38.0600000S00001 (11)当n=1000000时,k=25时的运行结果如下图 (13)当n=1000000时,k=30时的运行结果如下图 的的为为了快 刖 &S 雲后f f i l 刖 运运优 勺勺匕 J R HfrHLL嘗后(12)当n=1000000时,k=26时的运行结果如下图 n^lB000007k^21吋问为;54141 吐司知49恥 刖'快了: ^3-21运运优 勺勺匕 IP 亠曙后 丿uy J 丿J ■ 3 3 7 - ■ 3 5 2 5 9 4 :«« «« 为为了 间间^ 盼T &t4BI 运运优 勺勺匕 frHJ&u-L k 書后 问为:540.38 冋为:495.66 快了: 44.72 nTJ1000000,k^]22⑻当n=1000000时,k=22时的运行结果如下图(9)当n=1000000时,k=23时的运行结果如下图G =\ x 1 ie z/j/u: /Bijr ■划 n 为 1600080P h 为30(16)当n=1000000时,k=60时的运行结果如下图De四、备注(*可选):总结:对于给定的n 值,当k 值在某一个范围内用插入排序的快排(称为优化后的快排) 要比没用插入排序的普通快排的运行时间短,但是当K 值超出这个范围时优化后 的快排性能反而下降,经过一系列的测试,K 取lgn 或附近的值时性能最优. using System; using System.Collectio ns.Ge neric; using Syste m 丄 i nq; using System.Text; s -- ・s< 为为了 运运优 勺勺匕 ︐臼i 甘t- 嘗后 匕匕匕377 -2 1 Do ■ ■ 3 8 0 5 0 3 5 ・・ ■■ ・︕H 为为了 间间吠 ﹁J Bt^前 运运优 勺勺匕 537,64 522.67 14.97为为了运运优 Z^H^HLr 暫后 -kukLku 为为了Bn-lfttQB I 运运优 勺勺匕JrrJrr _L_Su =曙后 附录(源代码) (14)当n=1000000时,k=40时的运行结果如下图10 腼Mdk 为 40 (15)当n=1000000时,k=50时的运行结果如下图1008000^7^50为;536-89 ^:539,88 T : 一2・99000300000001h 为10000肌k 为弱 (17)当n=1000000时,k=65时的运行结果如下图if ((r - p ) < k) //直接插入排序 { In serti on Sort(A, p, r); } else { long q =Partiti on(A, p, r); Ran domized_quicksort(A, p, q - 1,k); Randomized_quicksort(A, q + 1, r,k); } _ //插入排序 public void InsertionSort( long [] A, long p, long long j = 0, i = 0; long key = 0; for (j = p + 1; j <= r; j++) key = A[j]; i = j - 1; while (i >= 0 && A[i] > key) { A[i + 1] = A[i]; i = i - 1; } A[i + 1] = key;p. Io ng { { r, Io ng k) if (P < r) r){}} } }。
《算法分析与设计》实验指导书本书是为配合《算法分析与设计实验教学大纲》而编写的上机指导,其目的是使学生消化理论知识,加深对讲授内容的理解,尤其是一些算法的实现及其应用,培养学生独立编程和调试程序的能力,使学生对算法的分析与设计有更深刻的认识。
上机实验一般应包括以下几个步骤:(1)、准备好上机所需的程序。
手编程序应书写整齐,并经人工检查无误后才能上机。
(2)、上机输入和调试自己所编的程序。
一人一组,独立上机调试,上机时出现的问题,最好独立解决。
(3)、上机结束后,整理出实验报告。
实验报告应包括:1)问题分析2)算法描述3)运行结果、4)算法性能分析。
实验一实验名称:贪心算法应用及设计实验学时:6学时实验类型:验证实验目的:1.理解贪心算法的基本思想2.掌握利用贪心算法求解问题的求解步骤实验内容1.活动选择问题(2学时)问题描述:设有11个会议等待安排,用贪心法找出满足目标要求的会议集合,这些会议按结束时间实验实现提示:1)数据结构设计:将会议开始时间存储在数组B中,结束时间存储在数组E中,数组下标为会议的代码。
结果存储在数组A中,其元素A[i]==true,表示会议i被选中。
2)算法:void GreedySelect(int n, struct time B[], struct time E[], bool A[]){int i,j;A[1]=true;j=1; i=2;while( i<=n)if (B[i]>=E[j]){ A[i]=true; j=i;}elseA[i]=false;}思考题:证明所得的解是最优解?2.单源点最短路径问题。
(2学时)问题描述如图所示的有向带权图中,求源点0到其余顶点的最短路径及最短路径长度。
并对算法进行性能分析。
实现提示1)数据结构设计:将图存储在邻接矩阵C中,结点个数为n,源点编号为u, 源点u到其余顶点的最短路径长度存储在dist[],最短路径存储在p[]。
算法分析与设计本书是为配合《计算机算法分析与设计》而编写的上机指导,其目的是使学生消化理论知识,加深对讲授内容的理解,增强算法分析与设计实践动手能力。
上机实验注意事项如下:(1)课前认真做好预习,准备好实验工具,熟悉实验流程和手段。
(3)课中根据实验指导书,结合课本实例进行编程实验。
实验时,一人一组,独立上机调试,上机时出现疑问,可以举手询问实验指导老师,或者与周边同学小声讨论,鼓励独立解决问题。
(4)课后按时按质按量整理出实验报告。
实验报告应独立完成,拒绝抄袭。
实验内容覆盖:递归与分治策略、动态规划、贪心算法、回溯法、分支限界法等。
实验一递归与分治策略一.实验目的与要求(1)理解和掌握递归与分治策略的基本原理。
(2)理解课本中的示例代码。
(3)调试代码通过。
二.递归与分治的基本思想(1)递归与分治方法。
递归与分治方法的基本思想是:将一个难以解决的大问题,分割成一些规模较小的、相同的子问题,以便各个击破,分而治之。
(2)递归。
递归问题分析时,要把握如下两个要素:●递归出口。
●递归公式。
其中:●递归出口给出了最简单情况下问题的解。
●递归公式则给出了一般意义下大问题(原问题)和小问题(子问题)之间的递归关系。
通过递归公式,一个难以解决的大问题会随着递归不断分解为多个小问题,小问题继续递归变为更小的小问题,直到最后到达递归出口得到解。
三.实验代码分析和说明本部分实验,需完成“棋盘覆盖”(课本P20)和“快速排序”(课本P22)两个问题。
3.1棋盘覆盖1. 棋盘覆盖问题的思路:(1)首先,将原始的棋盘覆盖问题看作最初的大问题。
(2)然后,将棋盘的行、列一分为二,从而将原始的大棋盘分为四个同样大小的小棋盘。
(3)接着,采用P21的图2-5中合适的L型骨牌,覆盖原始大棋盘的中心位置,将四个同样大小的小棋盘都转化为特殊棋盘。
(4)最后,对四个特殊小棋盘进行递归处理即可。
以上步骤(2)和步骤(3)合起来,完成了将大问题划分为小问题的过程,特别需要注意的是:小问题必须要和大问题相同或相似,否则无法递归。
《算法分析与设计》实验指导书(适用于计算机科学与技术、软件工程专业)计算机科学与技术学院软件教研室2011-8目录实验一算法分析 (3)实验二分治策略 (4)实验三堆排序 (5)实验四动态规划 (6)实验五贪心算法 (8)实验六图算法1-基本图算法 (10)实验七图算法2-最小生成树和单源顶点最短路径 (12)实验八图算法3-所有点对最短路径.14 附录一实验规范. 15实验一算法分析一、实验目的及任务1、使学生通过插入排序和合并排序的算法实现,理解算法的概念并且通过运行时间比较其时间复杂度。
2、体会合并排序的分治方法的三个步骤:分解、递归求解和合并。
3、了解渐近记号的意义和初步分析算法复杂性。
二、实验环境c++或java或Turbo c三、问题描述Input: A sequence of n numbers <a1, a2, . . .,a n>.Output: A permutation (reordering) <a1’, a2’, . . .,a n’> of the input sequence such that a1’≤a2’≤ . . . ≤a n’四、编程任务给定长度为n的一个序列,对其进行插入排序和合并排序五、数据输入随机产生10000以上的数据,放入输入文件input.txt,用来进行排序六、结果输出排序后的结果和两种排序算法的运行时间输出到文件output.txt七、实验报告内容见《算法分析与设计》实验规范。
实验二分治策略一、实验目的及任务1、掌握递归和分治策略的概念和基本思想,分析并掌握“快速排序”问题的分治算法;2、分治算法思想解决median问题。
二、实验环境c++或java或Turbo c三、问题描述(1) Input: A sequence of n numbers <a1, a2, . . .,a n>.Output: A permutation (reordering) <a1’, a2’, . . .,a n’> of the input sequence such that a1’≤a2’≤ . . . ≤a n’(2) Input: A set A of n (distinct) numbers and a number i, with 1 ≤i ≤n.Output: The element x∈A that is larger than exactly i - 1 other elements of A.四、编程任务给定长度为n的一个序列,对其进行快速排序和求第i小数五、数据输入A=<13,19,9,5,12,8,7,4,11,2,6,21>六、结果输出将排序结果输出到文件output.txt。
如果不存在所要求的第i小数,则输出-1。
七、实验报告内容见《算法分析与设计》实验规范。
实验三堆排序一、实验目的及任务1、了解堆的性质; 2利用堆构成一个优先队列,并实现相关的函数功能; 3为图算法做好准备。
二、实验环境c++或java或Turbo c三、问题描述A priority queue is a data structure for maintaining a set S of elements, each with an associated value called a key. A max-priority queue supports the following operations.. INSERT(S, x) inserts the element x into the set S. This operation could be written as S←S ∪ {x}.. MAXIMUM(S) returns the element of S with the largest key.. EXTRACT-MAX(S) removes and returns the element of S with the largest key.. INCREASE-KEY(S, x, k) increases the value of element x's key to the new value k,which is assumed to be at least as large as x's current key value. 四、编程任务编程建立最大堆,构造优先队列并实现以上的相关操作。
五、数据输入A=<15,13,9,5,12,8,7,4,0,6,2,1>六、结果输出执行INSERT(A, 10),EXTRACT-MAX(A),将结果输出到文件output.txt。
七、实验报告内容见《算法分析与设计》实验规范。
实验四动态规划一、实验目的及任务1、掌握动态规划算法的基本步骤:找出最优解的性质,并刻画其结构特征;递归地定义最优值;以自底向上的方式计算出最优值;根据计算最优值时得到的信息,构造最优解。
2、熟悉最长公共子序列问题的算法,设计一个算法解决编辑距离问题。
二、实验环境c++或java或Turbo c三、问题描述1 若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。
例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。
给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。
给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列。
2 设A和B是2个字符串。
要用最少的字符操作将字符串A转换为字符串B。
这里所说的字符操作包括:山出一个字符、插入一个字符、将一个字符改为另一个字符。
将字符串A变换为字符串B所用的最少字符操作称为字符串A到字符串B的编辑距离,记为d(A,B)。
试设计一个有效算法,对任意给定的两个字符串,计算出它们的编辑距离d(A,B)。
四、编程任务1 求X和Y的最长公共子序列长度以及最长公共子序列2 对于给定的字符串A和字符串B,编程计算其编辑距离d(A,B)。
五、数据输入1由文件input.txt提供输入数据,X={A,B,C,B,D,A,B}和Y={B,D,C,A,B,A}。
2由文件input.txt提供输入数据。
文件的第1行是字符串A,文件的第2行是字符串B。
A:fxpimu B:xwrs六、结果输出1程序运行结束时,将编程计算出的最长公共子序列长度以及最长公共子序列输出到文件output.txt中。
2 程序运行结束时,将编辑距离d(A,B)输出到文件output.txt的第1行中。
七、实验报告内容见《算法分析与设计》实验规范。
实验五贪心算法一、实验目的及任务1、掌握贪心算法的基本性质。
2 贪心算法与动态规划的区别。
3 贪心算法解决活动安排问题和背包问题。
二、实验环境c++或java或Turbo c三、问题描述1 有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。
每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si <fi 。
如果选择了活动i,则它在半开时间区间[si, fi]内占用资源。
若区间[si, fi]与区间[sj, fj]不相交,则称活动i与活动j是相容的。
也就是说,当si≥fj或sj≥fi时,活动i与活动j相容。
活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子。
该问题要求高效地安排一系列争用某一公共资源的活动。
贪心算法提供了一个简单、漂亮的方法使得尽可能多的活动能兼容地使用公共资源。
2 0-1背包问题:给定n种物品和一个背包。
物品i的重量是Wi,其价值为Vi,背包的容量为C。
应如何选择装入背包的物品,使得装入背包中物品的总价值最大?背包问题:与0-1背包问题类似,所不同的是在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1≤i≤n。
四、编程任务1 在所给的活动集合中选出最大的相容活动子集合。
2 计算背包问题/0-1背包问题背包的价值五、数据输入1i 1 2 3 4 5 6 7 8 9 10 11si 1 3 0 5 3 5 6 8 8 2 12fi 4 5 6 7 8 9 10 11 12 13 142W={10,100,120} V={10,20,30} C=50六、结果输出1、将编程计算出的最长最大活动安排结果输出到文件output1.txt。
2、将编程计算出的背包价值输出到文件output2.txt。
七、实验报告内容见《算法分析与设计》实验规范。
实验六图算法1-基本图算法一、实验目的及任务1、掌握图邻接表的存储方法;2、掌握深度优先遍历算法(DFS);3、利用深度优先遍历的timestamps进行拓扑排序或计算有向图的强连通分支;二、实验环境c++或java或Turbo c三、问题描述Given G=(V,E) In DFS, edges are explored out the most recently discovered vertex v that still has unexplored edges leaving it. When v's edges have been explored, the search "backtracks" to explore edges leaving the vertex from which v was discovered. Besides creating a depth-first forest, DFS also timestamps each vertex. Each vertex v has two timestamps: the first timestamp d[v] records when v is first discovered, and the second one f[v] records when the search finishes examining v's adjacency list.A topological sort of a directed acyclic graph (DAG) G = (V;E) is a linear ordering of all its vertices such that if G contains an edge (u; v), then u appears before v in the ordering (if the graph is cyclic, then no linear ordering is possible).A strongly connected component (SCC) of a directed graph G = (V;E) is a maximal subset of vertices C ⊆ V such that ∀u, v ∈C, we have u→v and v→ u.四、编程任务1 、深度优先遍历; 2、利用深度优先遍历的timestamps进行拓扑排序;3、利用深度优先遍历的timestamps进行有向图的强连通分支;五、数据输入六、结果输出1、将编程计算出深度优先遍历结果输出到文件output1.txt;2、将编程进行拓扑排序结果输出到文件output2.txt;3、将编程进行有向图的强连通分支的结果输出到文件output3.txt。