《计算机算法》课程实验指导书
- 格式:doc
- 大小:46.50 KB
- 文档页数:8
《算法分析与设计》实验指导书《算法分析与设计》课程是计算机专业的一门必修课程。
开设算法分析与设计实验,目的就是为了使学生消化理论知识,加深对讲授内容的理解,尤其是一些算法的实现及其应用,培养学生独立编程和调试程序的能力,使学生对算法的分析与设计有更深刻的认识。
《算法分析与设计》课程实验的目的:是为了使学生在课程学习的同时,通过实验环境中的实际操作,对部分算法的具体应用有一个初步的了解,使学生加深了解和更好地掌握《算法分析与设计》课程教学大纲要求的内容。
《算法分析与设计》课程实验的注意事项:在《算法分析与设计》的课程实验过程中,要求学生做到:(1)预习实验指导书有关部分,认真做好实验内容的准备,就实验可能出现的情况提前作出思考和分析。
(2)认真书写实验报告。
实验报告包括实验目的和要求,实验情况及其分析。
(3)遵守机房纪律,服从辅导教师指挥,爱护实验设备。
(4)实验课程不迟到。
如有事不能出席,所缺实验一般不补。
《算法分析与设计》课程实验的验收:实验的验收将分为两个部分。
第一部分是上机操作,包括检查程序运行和即时提问。
第二部分是提交电子的实验报告。
实验一算法实现一一、实验目的与要求熟悉C/C++语言的集成开发环境;通过本实验加深对分治法、贪心算法的理解。
二、实验内容:掌握分治法、贪心算法的概念和基本思想,并结合具体的问题学习如何用相应策略进行求解的方法。
三、实验题1. 【伪造硬币问题】给你一个装有n个硬币的袋子。
n个硬币中有一个是伪造的。
你的任务是找出这个伪造的硬币。
为了帮助你完成这一任务,将提供一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的重量是否相同。
试用分治法的思想写出解决问题的算法,并计算其时间复杂度。
2.【找零钱问题】一个小孩买了价值为33美分的糖,并将1美元的钱交给售货员。
售货员希望用数目最少的硬币找给小孩。
假设提供了数目有限的面值为25美分、10美分、5美分、及1美分的硬币。
第一章 绪论一、主要要求通过实验,认真理解和体会数值计算的稳定性、精确性与步长的关系。
二、主要结果回顾:1、算法:电子计算机实质上只会做加、减、乘、除等算术运算和一些逻辑运算,由这些基本运算及运算顺序规定构成的解题步骤,称为算法.它可以用框图、算法语言、数学语言或自然语言来描述。
用计算机算法语言描述的算法称为计算机程序。
(如c —语言程序,c++语言程序,Matlab 语言程序等)。
2、最有效的算法:应该运算量少,应用范围广,需用存储单元少,逻辑结构简单,便于编写计算机程序,而且计算结果可靠。
3、算法的稳定性:一个算法如果输入数据有误差,而在计算过程中舍入误差不增长,则称此算法是数值稳定的,否则称此算法为不稳定的。
换句话说:若误差传播是可控制的,则称此算法是数值稳定的,否则称此算法为不稳定的。
4、控制误差传播的几个原则: 1)防止相近的两数相减; 2)防止大数吃小数;3)防止接近零的数做除数;4)要控制舍入误差的累积和传播;5)简化计算步骤,减小运算次数,避免误差积累。
三、数值计算实验(以下实验都需利用Matlab 软件来完成) 实验1.1(体会数值计算精度与步长关系的实验)实验目的:数值计算中误差是不可避免的,要求通过本实验初步认识数值分析中两个重要概念:截断误差和舍入误差,并认真体会误差对计算结果的影响。
问题提出:设一元函数f :R →R ,则f 在x 0的导数定义为:hx f h x f x f h )()(lim)('0000-+=→实验内容:根据不同的步长可设计两种算法,计算f 在x 0处的导数。
计算一阶导数的算法有两种:hx f h x f x f )()()('000-+≈(1)hh x f h x f x f 2)()()('000--+≈(2)请给出几个计算高阶导数的近似算法,并完成如下工作: 1、对同样的h ,比较(1)式和(2)式的计算结果;2、针对计算高阶导数的算法,比较h 取不同值时(1)式和(2)式的计算结果。
《算法设计综合实训》指导书一、实训目的依据人才培养方案的要求及教学计划的安排,在《数据结构》课程后安排这次课程实训,通过这次实训可达到以下目的:(1)使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。
(2)使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。
(3)使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。
(4)激发学生的学习兴趣。
(5)提高学生的计算思维能力,具备一定的算法分析与设计的能力。
二、实训内容1、根据设计的需求,能阅读和理解;2、根据功能的需求,使用所学知识转化成计算机管理;三、实训进度内容安排序号实训内容计划学时(天)教学要求教法建议1 选题与搜集资料 1 学生听老师讲授,并能理解一些细节通过讲解让学生简单了解系统的需求2 分析与概要设计3 根据搜集的资料,进行程序功能与数据结构分析,并选择合适的数据结构、并在此基础上进行实现程序功能的算法设计3 程序设计 5 运用掌握C/C++/Java语言编写程序,实现所编程序的各个模块功能。
调试程序,并记录测试情况。
符合代码编写规范。
辅导,出现问题多可以统一解答4答辩1提交设计报告、成果、成果演示、答辩教学主任教研室主任课程负责人合计10四、基本要求(一)设计要求(1)所有学生统一在机房进行设计;(2)听从指导老师的统一安排;(3)严格遵守作息时间、不迟到、不早退,病、事假必须向指导老师请假;(4)使用C/C++/JA V A进行开发;(5)满足编程规范;(6)设计结构清晰(模块化开发)。
(7) 根据任务书的要求选择设计题目,针对线性表、栈、队列与递归、字符串算法设计至少选作2个题目,树、图至少选作1个题目,查找与排序至少选作1个题目。
根据题目难易程度进行综合评分。
(8)抄袭他人程序者记零分。
(二)报告要求(1)问题描述:描述要求编程解决的问题。
计 算 方 法实 验 指 导 书彭彬计算机技术实验中心2012年3月· 实验环境: VC++ 6.0· 实验要求:在机房做实验只是对准备好的实验方案进行验证,因此上机前要检查实验准备情况,通过检查后方可上机。
没有认真准备的学生不能上机,本次实验没有分数。
实验中要注意考察和体会数值计算中出现的一些问题和现象:误差的估计,算法的稳定性、收敛性、收敛速度以及迭代初值对收敛的影响等。
· 关于计算精度:如果没有特别说明,在计算的过程中,小数点后保留5位数字,最后四舍五入到小数点后四位数字。
迭代运算的结束条件统一为51102-⨯。
在VC++ 6.0中,可使用setprecision 在流的输出中控制浮点数的显示(缺省显示6位)。
演示如下: # include<iostream.h> # include<math.h> # include<iomanip.h>//输出6位精度,输出左对齐cout<<setprecision(6)<<setiosflags(ios::left); //设置输出宽度为12(不够将补充0) cout<<setw(12)<<coeff[i];· 关于图形绘制本课程个别实验要求画出函数的曲线,所有画图题目均要求用MFC 完成。
利用VC++6.0的MFC 画图,先要建立一个工程,然后在***View 中加入自定义变量、自定义函数等,最后在OnDraw ()方法中调用自定义函数。
也可以把代码直接写入OnDraw ()方法中。
画曲线有两种方法,(一)一句坐标逐个打点(用SetPixel()函数),(二)先把当前光标移动(MoveTo()函数)到曲线的始点,再用LineTo ()函数画线。
线的样式由画笔决定。
对封闭区域可以填充,填充的样式由画刷决定。
在VC++6.0中,先新建一个MFC AppWizard(exe)类型的工程(建立工程时,“应用程序类型”选择“单文档”;“是否包含数据库”选择“不包含数据库”;其它选择缺省),然后在“ClassView ”中选择XXView 类文件加以操作。
算法设计与分析实验指导书信电工程学院2015.7算法设计与分析一.实验目的算法设计与分析是计算机相关专业的核心课程之一。
本实验加深学生对算法设计的基本策略、主要方法及实验过程的理解;培养学生针对具体的问题,选择合适的数据结构和设计结构清晰、正确有效的算法的能力。
二.实验内容E05210801 算法概述E05210802 分治法E05210803 动态规划E05210804 贪心法E05210805 回溯法E05210806 分支限界法E05210807 NP完全问题E05210808 近似算法三.实验方法本课程所有实验均需上机进行,每个实验都有明确的实验目的,并根据实验要求提供实验题。
每位同学通过独立思考、与同学讨论、老师辅导答疑相结合的方法完成相应的实验题,在对题目进行分析、选择有效的方法、编程及测试的过程中,将达到加深学生印象、锻炼学生运用书本知识实际解决问题的能力。
四. 实验要求学生按照实验要求,上机前写好上机实验预习报告。
上机实验时按实验要求完成每一个实验的内容。
认真书写实验报告,内容包括:实验的目的、实验原理、实验内容、实验步骤、实验结果等。
实验一算法概述1. 实验目的(1) 复习数据结构课程的相关知识,实现课程间的平滑过渡;(2) 掌握并应用算法的数学分析和后验分析方法;(3) 理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。
2. 实验内容求两个自然数m和n的最大公约数。
3. 实验要求(1) 至少设计出三个版本的求最大公约数算法;(2) 对所设计的算法采用大O符号进行时间复杂性分析;(3) 上机实现算法,并用计数法和计时法分别测算算法的运行时间;(4) 通过分析对比,得出自己的结论。
实验二分治法1. 实验目的(1) 进一步掌握递归算法的设计思想以及递归程序的调试技术;(2) 理解这样一个观点:分治与递归经常同时应用在算法设计之中。
武汉轻工大学数学与计算机学院计算机算法基础实验报告学校:武汉轻工大学院系:数学与计算机学院班级:软件工程1303班姓名:刘敏学号:1305110145指导老师:李诗高2015年11月8日星期天实验一、递归与分治算法实验实验目的掌握用递归和分治法的基本思想解决实际问题。
实验环境Windows系统, VC6.0实验题目1、编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。
例如:1 + 2 + 34–5 + 67–8 + 9 = 100。
2、编写一个求无括号的四则运算式子的程序。
例如:输入1 + 2 *3-5 返回结果2。
3、问题描述:大于1的正整数n可以分解为n=x1*x2*…*x n。
例如,当n=12时,共有8种不同的分解式:12=12 12=6*2 12=4*3 12=3*412=3*2*2 12=2*6 12=2*3*2 12=2*2*3对于给定的正整数n,设计一个算法输出n的所有不同的分解形式。
对于整数因子分解问题,先从2到n先找到一个能被n整除的整数x1(即n%x1==0),显然x1是n的一个因子。
因为n=x1*( n/x1),只要找到( n/x1)因子分解,就找到了n的一个因子分解形式,所以问题被简化为对n/x1进行因子分解。
采用递归方法对n/x1求因子x2,持续递归迭代直到问题简化为对1求因子时,就找到了n的一个因子分解形式x1,x2,…提示:采用递归方法解决问题,重点是找到怎么将问题简化为一个比原问题规模小的同样的问题。
小的问题被简化为更小的问题,直到可以直接求解,最终小的问题被解决,同样地,大的问题也被解决。
实验要求1三个题目可任选一题实现,也可以完成多个。
2设计递归算法,并在vc6下编译和调试通过,通过具体的输入来测试程序并输出结果。
实验代码:题目一:#include<stdio.h>#include<stdlib.h>#include<string.h>const int N =9;void func(char op[],int sum,int prevadd,int a[],int i); int calcexp(const char *pexp);int main(const char *argv[], int argc){int a[N];char op[N]="+";for(int i = 0 ; i<N ; i++)a[i]=i+1;func(op , a[0] , a[0] , a , 1);return 0;}void func(char op[],int sum,int prevadd,int a[],int i){ if (i==N){if (sum==100){int j;printf("%d",a[0]);for (j=1 ; j<N ; j++){if (op[j]!=' ')printf("%c",op[j]);printf("%d",a[j]);}printf("\n",a[j]);}return;}//+op[i] = '+';sum += a[i];func(op , sum , a[i] , a , i+1);sum -= a[i];// -op[i] = '-';sum -= a[i];func(op , sum , -a[i] , a , i+1);sum += a[i];//无op[i] = ' ';sum -= prevadd;int tmp = prevadd >0 ? prevadd*10 + a[i] : prevadd*10 - a[i];sum += tmp;func(op,sum,tmp,a,i+1);sum -= tmp;sum +=prevadd;}题目二:#include<stdio.h>#include<stdlib.h>#include<string.h>int calcexp(const char *pexp);void main(){char *c = (char*)malloc(100);printf("请输入表达式:");scanf("%s",c);int val= calcexp(c);printf("%d\n",val);}int calcexp(const char *pexp){char newexp[1024];int opd1 = atoi(pexp);pexp = pexp + strlen(itoa(opd1 , newexp , 10));if (pexp[0] == '\0')return opd1;char op = *pexp++;if (op == '+')return opd1 + calcexp(pexp);else if(op == '-')return opd1 - calcexp(pexp);else{int opd2 = atoi(pexp);pexp = pexp +strlen(itoa(opd2 , newexp , 10));sprintf(newexp , "%d", op == '*' ? opd1*opd2 :opd1/opd2);strcat(newexp , pexp);return calcexp(newexp);}}题目三:#include<stdio.h>int k = 0;void func(int n){int i;if(n==1){k++;}else{for (i = 2;i<=n;i++){if (n%i==0){func(n/i);}}}}void main(){int a ;printf("请输入正整数:");scanf("%d",&a);func(a);printf("%d\n",k);}运行结果:题目一:题目二:题目三:。
实验三动态规划算法(2学时)一、实验目的与要求1、熟悉最长公共子序列问题的算法;2、初步掌握动态规划算法;二、实验题若给定序列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的最长公共子序列。
改进LCS 函数,不使用数组b而仅借助数组c本身在O(m+n)时间内构造最长公共子序列。
三、实验提示#include "stdlib.h"#include "string.h"void LCSLength(char *x ,char *y,int m,int n, int **c, int **b){int i ,j;for (i = 1; i <= m; i++) c[i][0] = 0;for (i = 1; i <= n; i++) c[0][i] = 0;for (i = 1; i <= m; i++)for (j = 1; j <= n; j++){if (x[i]==y[j]){c[i][j]=c[i-1][j-1]+1;b[i][j]=1;}else if (c[i-1][j]>=c[i][j-1]){c[i][j]=c[i-1][j];b[i][j]=2;}else{ c[i][j]=c[i][j-1];b[i][j]=3;}}}void LCS(int i ,int j, char *x ,int **b) {if (i ==0 || j==0) return;if (b[i][j]== 1){LCS(i-1,j-1,x,b);printf("%c",x[i]);}else if (b[i][j]== 2)LCS(i-1,j,x,b);else LCS(i,j-1,x,b);}。
第1篇第一章引言随着信息技术的飞速发展,计算机已经成为现代社会不可或缺的一部分。
为了培养适应新时代要求的计算机专业人才,实践教学在计算机教育中占据了越来越重要的地位。
本手册旨在为计算机实践教学提供全面、系统的指导,帮助教师和学生更好地开展实践环节,提高实践教学质量。
第二章实践教学目标与原则一、实践教学目标1. 培养学生的动手能力:通过实践,使学生掌握计算机的基本操作和编程技能,提高学生的动手能力。
2. 培养学生的创新意识:鼓励学生在实践中探索、创新,培养其创新精神和实践能力。
3. 培养学生的团队协作能力:通过实践项目,让学生学会与他人合作,提高团队协作能力。
4. 培养学生的综合素质:使学生在实践中锻炼自己的沟通能力、组织能力、解决问题的能力等。
二、实践教学原则1. 实践性原则:实践教学应以培养学生的实践能力为核心,注重理论知识与实践操作的紧密结合。
2. 逐步性原则:实践教学应遵循学生的认知规律,由浅入深、循序渐进地进行。
3. 个性化原则:根据学生的兴趣、特长和需求,开展个性化的实践教学。
4. 可持续发展原则:实践教学应关注学生的长远发展,培养学生的终身学习能力。
第三章实践教学内容与方法一、实践教学内容1. 计算机基础操作与维护2. 编程语言与程序设计3. 数据结构与算法4. 操作系统5. 计算机网络6. 数据库技术7. 软件工程8. 计算机安全9. 计算机应用技术10. 项目实践与毕业设计二、实践教学方法1. 实验教学:通过实验课程,让学生掌握计算机基本操作和编程技能。
2. 课程设计:以课程设计为载体,培养学生综合运用所学知识解决实际问题的能力。
3. 毕业设计:通过毕业设计,让学生将所学知识应用于实际项目,提高其创新能力。
4. 课外实践:鼓励学生参加各类竞赛、实践活动,拓宽知识面,提高实践能力。
5. 顶岗实习:让学生在企业或研究机构进行实习,了解行业动态,提高就业竞争力。
第四章实践教学评价一、评价体系1. 实验报告:评价学生在实验过程中的操作规范、实验结果和实验心得。
《算法设计与分析》实验指导书《算法设计与分析》实验指导书本文档主要用于《算法设计与分析》课程的实验指导。
《算法设计与分析》旨在教会学生处理各种问题的方法,通过实验,使学生能够把所学的方法用于具体的问题,并对所用算法进行比较分析,从而提高学生分析问题、解决问题的能力。
通过该课程的实验,使学生对课堂中所讲述的内容有一个直观的认识,更好地掌握所学的知识,培养学生的实际动手能力,加强学生创新思维能力的培养。
本课程设计了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、理解算法思想和问题要求。
算法分析与设计本书是为配合《计算机算法分析与设计》而编写的上机指导,其目的是使学生消化理论知识,加深对讲授内容的理解,增强算法分析与设计实践动手能力。
上机实验注意事项如下:(1)课前认真做好预习,准备好实验工具,熟悉实验流程和手段。
(3)课中根据实验指导书,结合课本实例进行编程实验。
实验时,一人一组,独立上机调试,上机时出现疑问,可以举手询问实验指导老师,或者与周边同学小声讨论,鼓励独立解决问题。
(4)课后按时按质按量整理出实验报告。
实验报告应独立完成,拒绝抄袭。
实验内容覆盖:递归与分治策略、动态规划、贪心算法、回溯法、分支限界法等。
实验一递归与分治策略一.实验目的与要求(1)理解和掌握递归与分治策略的基本原理。
(2)理解课本中的示例代码。
(3)调试代码通过。
二.递归与分治的基本思想(1)递归与分治方法。
递归与分治方法的基本思想是:将一个难以解决的大问题,分割成一些规模较小的、相同的子问题,以便各个击破,分而治之。
(2)递归。
递归问题分析时,要把握如下两个要素:●递归出口。
●递归公式。
其中:●递归出口给出了最简单情况下问题的解。
●递归公式则给出了一般意义下大问题(原问题)和小问题(子问题)之间的递归关系。
通过递归公式,一个难以解决的大问题会随着递归不断分解为多个小问题,小问题继续递归变为更小的小问题,直到最后到达递归出口得到解。
三.实验代码分析和说明本部分实验,需完成“棋盘覆盖”(课本P20)和“快速排序”(课本P22)两个问题。
3.1棋盘覆盖1. 棋盘覆盖问题的思路:(1)首先,将原始的棋盘覆盖问题看作最初的大问题。
(2)然后,将棋盘的行、列一分为二,从而将原始的大棋盘分为四个同样大小的小棋盘。
(3)接着,采用P21的图2-5中合适的L型骨牌,覆盖原始大棋盘的中心位置,将四个同样大小的小棋盘都转化为特殊棋盘。
(4)最后,对四个特殊小棋盘进行递归处理即可。
以上步骤(2)和步骤(3)合起来,完成了将大问题划分为小问题的过程,特别需要注意的是:小问题必须要和大问题相同或相似,否则无法递归。
《计算机算法基础》实验教学大纲
一、课程说明
二、实验教学目标与要求
《计算机算法基础)》是一门实践性很强的课程,要求学生在较好的掌握理论知识的基础上,多动脑,多实践,自己动手编写、调试程序。
通过上机实验,目的是加深学生对课堂讲授内容的理解,了解和熟悉计算机软件实现中的大部分算法,如常用的迭代、递推、递归、回溯等算法设计技术、搜索和排序算法等,教会学生找出一个问题的算法思想,训练和培养自己独立思考的能力,并能利用计算机加以编程实现,培养和提高学生运用算法知识有效地解决各自学科的实际问题,培养他们的独立科研的能力和理论联系实践的能力。
为了提高实验课的效率,要求学生在课前事先编写好程序,以确保有足够的时间来调试程序。
三、实验内容及学时分配
注:类型为(1)验证、(2)综合、(3)设计
四、实验报告及要求
(1)课前了解实验目的、实验环境,熟悉实验报告内容;
(2)实验报告中要求记录实验的详细步骤;
(3)给出相关程序代码;
(4)对实验结果进行分析。
五、考核方式
实验考核成绩比例:阶段考核(40%)+实验报告(60%)
执笔人:李少芳审核人:陈志辉审定人:黄朝辉。
课程名:计算机算法设计与分析实验一分治法的应用——快速排序一实验目的:基于分治策略对一个序列进行快速排序。
二实验原理:分治法思想:分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。
递归地解这些子问题,然后将各个子问题的解合并得到原问题的解。
快速排序算法是基于分治策略的另一个排序算法。
其基本思想是:对于输入的子数组A[p,r],按以下三个步骤进行排序:(1)分解:以A[p]为基准元素将A[p:r]划分成3段A[p:q-1],A[q],A[q+1:r],使得A[p:q-1]中任何一个元素小于等于A[q],A[q+1,r]中任何一个元素大于等于A[q].下标q在划分过程中确定。
(2)递归求解:通过递归调用快速排序算法分别对A[p:q-1]和A[q+1:r]进行排序。
(3)合并:对于A[p:q-1]和A[q+1:r]的排序是就地进行的,所以在A[p:q-1]和A[q+1:r]都已排好的序号不需要执行任何计算A[p:r]就已排好序。
三实验内容:实验问题:将序列{4 8 3 7 1 5 6 2}进行快速排序主要程序:void QuickSort(int A[],int p,int r){if(p<r){int q=Partition(A,p,r);QuickSort(A,p,q-1);QuickSort(A,q+1,r);}}int Partition(int A[],int p,int r){int i=p;int j=r;int x=A[p];while(i<j){while(i<j&&A[j]>=x)--j;A[i]=A[j];while(i<j&&A[i]<=x)++i;A[j]=A[i];}A[i]=x;return i;}输出结果:请输入n的值:8请输入要排序的序列:4 8 3 7 156 2排序之前的序列为:4 8 3 7 156 2排序之后的序列:1 2 3 4 5 6 7 8实验二贪心算法的应用——背包问题一实验目的:运用贪心算法解决背包问题。
贵州大学计算机科学与技术学院计算机科学与技术系上机实验报告
实验步骤:
1、定义用于输入和输出的数据结构;
2、完成分治算法的编写;
3、测试记录结构;
4、有余力的同学尝试不改变输入输出结构,将递归消除,并说明能否不用栈,直接消除递归,为什么?
六、调试过程及实验结果
详细记录程序在调试过程中出现的问题及解决方法。
记录程序执行的结果。
七、总结
对上机实践结果进行分析,问题回答,上机的心得体会及改进意见。
八、附录
源程序(核心代码)清单或使用说明书,可另附纸
贵州大学计算机科学与技术学院
计算机科学与技术系上机实验报告
贵州大学计算机科学与技术学院计算机科学与技术系上机实验报告
贵州大学计算机科学与技术学院计算机科学与技术系上机实验报告
贵州大学计算机科学与技术学院计算机科学与技术系上机实验报告。
实验一最接近点对问题一、实验目的为进一步学习分治策略的基本思想,本次实验将通过求最接近点对问题来加深我们对分治策略的认识。
二、实验问题描述给定平面上N个点,找出其中的一对点,使得在n 个点组成的所有点对中,该点对间的距离最小。
三、设计思路及步骤将所给平面上n个点的集合S分成两个子集S1和S2,每个子集中约有n/2个点。
然后在每个子集中递归地求其最接近的点对。
先考虑一维的情形:设计一个求一维点集S的最接近点对的算法Bool Cpairl(S,d){N=|S|; if(n<2) {d=无穷大;return falSe;} m=S中各点坐标的中位数;构造S1和S2; //S1={x∈S|x<=m},S2={x∈S|x>m}Cpairl(S1,d1); Cpairl(S2,d2); p=max(S1); q=max(S2);D=min(d1,d2,q-p);return true;}由此推广到二维的情形:若矩形R中有多于6个S中的点,则由鸽舍原理易知,至少有一个(d/2)*(2d/3)的小矩形中有2个以上S中的点。
设u,v是位于同一小矩形中的2个点,则(x(u)-x(v))²+(y(u)-y(v))²<=(d/2)²+(2d/3)²=25d²/36因此distance(u,v)<=5d/6<d,与d的意义相矛盾。
四、算法实现代码//2d10-2 二维最邻近点对问题#include<time.h>#include<iostream>#include<cmath>using namespace std;const int M=50;//用类PointX和PointY表示依x坐标和y坐标排好序的点class PointX {public:int operator<=(PointX a)const{ return (x<=a.x); }int ID; //点编号float x,y; //点坐标};class PointY {public:int operator<=(PointY a)const{ return(y<=a.y); }int p; //同一点在数组x中的坐标float x,y; //点坐标};float Random();template <class Type>float dis(const Type&u,const Type&v);bool Cpair2(PointX X[], int n,PointX& a,PointX& b, float& d);void closest(PointX X[],PointY Y[],PointY Z[], int l, int r,PointX& a,PointX& b,float& d);template <typename Type>void Copy(Type a[],Type b[], int left,int right);template <class Type>void Merge(Type c[],Type d[],int l,int m,int r);template <class Type>void MergeSort(Type a[],Type b[],int left,int right);int main(){srand((unsigned)time(NULL));int length;cout<<"请输入点对数:";cin>>length;PointX X[M];cout<<"随机生成的二维点对为:"<<endl;for(int i=0;i<length;i++){X[i].ID=i;X[i].x=Random();X[i].y=Random();cout<<"("<<X[i].x<<","<<X[i].y<<") ";}PointX a,b;float d;Cpair2(X,length,a,b,d);cout<<endl;cout<<"最邻近点对为:("<<a.x<<","<<a.y<<")和("<<b.x<<","<<b.y<<") "<<endl;cout<<"最邻近距离为: "<<d<<endl;return 0;}float Random(){float result=rand()%10000;return result*0.01;}//平面上任意两点u和v之间的距离可计算如下template <class Type>inline float dis(const Type& u,const Type& v){float dx=u.x-v.x;float dy=u.y-v.y;return sqrt(dx*dx+dy*dy);}bool Cpair2(PointX X[], int n,PointX& a,PointX& b,float& d){if(n<2) return false;PointX* tmpX = new PointX[n];MergeSort(X,tmpX,0,n-1);PointY* Y=new PointY[n];for(int i=0;i<n;i++) //将数组X中的点复制到数组Y中{Y[i].p=i;Y[i].x=X[i].x;Y[i].y=X[i].y;}PointY* tmpY = new PointY[n];MergeSort(Y,tmpY,0,n-1);PointY* Z=new PointY[n];closest(X,Y,Z,0,n-1,a,b,d);delete []Y;delete []Z;delete []tmpX;delete []tmpY;return true;}void closest(PointX X[],PointY Y[],PointY Z[], int l, int r,PointX& a,PointX& b,float& d){if(r-l==1) //两点的情形{a=X[l];b=X[r];d=dis(X[l],X[r]);return;}if(r-l==2) //3点的情形{float d1=dis(X[l],X[l+1]);float d2=dis(X[l+1],X[r]);float d3=dis(X[l],X[r]);if(d1<=d2 && d1<=d3){a=X[l];b=X[l+1];d=d1;return;}if(d2<=d3){a=X[l+1];b=X[r];d=d2;}else {a=X[l];b=X[r];d=d3;}return;}//多于3点的情形,用分治法int m=(l+r)/2;int f=l,g=m+1;//在算法预处理阶段,将数组X中的点依x坐标排序,将数组Y中的点依y坐标排序//算法分割阶段,将子数组X[l:r]均匀划分成两个不想交的子集,取m=(l+r)/2//X[l:m]和X[m+1:r]就是满足要求的分割。
《计算方法与程序设计》实验指导书1.上机实验使用的语言:C 语言或PASCAL 语言任选。
2.上机要求和步骤:(1)认真分析题目的条件和要求,复习相关的理论知识,选择适当的解决方案和算法;(2)编写上机实验程序,作好上机前的准备工作;(3)上机调试程序,并试算各种方案,记录计算的结果(包括必要的中间结果);(4)分析和解释计算结果; (5)按照要求书写实验报告; (6)要求独立完成上述各项。
3.实验内容:实验一 非线性方程求根从下列3题中任选2题:1为求方程01)(23=--=x x x f 在5.10=x 附近的一个根,可将方程改写成下列下列等价形式,并建立相应的迭代公式(1) 改写成211x x +=迭代公式为2111kk x x +=+; (2) 改写成231x x +=迭代公式为3211k k x x +=+;(3) 改写成112-=x x 迭代公式为111-=+k k x x试分析每一种迭代公式的收敛性。
2 证明:当5.10=x 时,迭代法k k x x +=+4101 和 311021k k x x -=+都收敛于方程0104)(23=-+=x x x f 在区间[1,2]内唯一实根*x ,并分别用上迭代法求满足要求5110-+≤-k k x x 的近似根。
再用牛顿迭代法求此方程根的近似值(精确到5110-+≤-k k x x ),并将迭代次数与上面方程相比较。
3 设0>a ,试写出用牛顿迭代法求a 近似值的计算公式,并且 (1) 讨论该迭代法的收剑性;(2) 求17具有4位有较数字的近似值。
实验二 线代数方程求解 从下列3题中任选2题:1 分别用顺序消去法和列主元消去法解方程组⎪⎩⎪⎨⎧=++-=++-=++000.3643.5072.1000.2000.2623.4712.3000.1000.1000.3000.2001000.0321321321x x x x x x x x x (要求用具有舍入的4位数进行运算),并将所得结果与具有四位有较数字的准确解T x )3675.0,05104.0,4904.0(*--=进行比较。
课程实验报告题目:计算机算法基础课程实验课程名称:计算机算法基础专业班级:计算机科学与技术班学号:姓名:指导教师:报告日期:2012年11月5日计算机科学与技术学院题目1、比较快速分类算法和归并分类算法时间效率一、方案设计本实验要求比较快速分类算法和归并分类算法的效率,于是我们很容易联想到通过对比两种算法在处理相同数据所使用的时间来比较两种算法的时间效率。
因此先定义一个函数random()来生成设定个数个随机数,并以文件形式输出。
快速分类算法和归并分类算法均使用文件形式读入数据并以文件形式输出分类结果,中间过程没有人工参与,这就保证了程序运行时间基本和分类时间一致,因此算法所用时间根据调试窗口所给出程序运行时间为准。
试验中快速分类算法和归并分类算法分别在不同的工程文件中实现,对于不同个数的数据分次测试。
为了使两种算法更具有可比性,两种算法都使用递归方法实现。
已知快速分类算法和归并分类算法的平均情况时间都是0( nl og n),但是最坏情况下快速分类算法算法时间复杂度为0(n2),而归并分类算法的时间下界为Q (nlogn),因此在比较了两种算法在一般情况下的时间效率之后还要比较两种算法在最坏情况下的时间效率。
快速分类算法的最坏情况为被分类数据有序。
二、方案实现随机数据生成:#include <stdio.h>#include <stdlib.h>#include <time.h>#define MAX 40000 //生成数据个数,根据不同要求改变int main(){int a[MAX]; //整形数组a[MAX] 存放生成的随机数long i;memset(a,0,sizeof(a));FILE *fp;fp = fopen("example.txt","wt");srand((int)time(0));for(i=0; i<MAX; i++){a[i] = rand()%40000; //生成小于40000 的随机数for(i=0; i<MAX; i++)fprintf(fp, "%d ", a[i]); //将数据写入文件fclose(fp);return 0;}快速分类算法:#include <stdio.h>#include <stdlib.h>#define MAX 40000 //分类数据个数,根据不同要求改变int Partition(int *R,int i,int j){in t pivot=R[i]; 〃R[i]是划分元素while(i<j){while(i<j&&R[j]>=pivot) //j 由右向左移j--;if(i<j)R[i++]=R[j];while(i<j&&R[i]<=pivot) //i 由左向右移i++;if(i<j)R[j--]=R[i];}R[i]=pivot;return i; //返回划分元素的最终位置}void QuickSort(int *R,int low,int high){int pivotpos;if(low<high){pivotpos=Partition(R,low,high);QuickSort(R,low,pivotpos-1);QuickSort(R,pivotpos+1,high);}int main(){FILE *fp;int a[MAX],i,n;fp = fopen("example.txt","rt"); for(i=0; i<40000; i++) fscanf(fp, "%d ", &a[i]); //从文件中读入数据QuickSort(a, 0, MAX-1); //快速分类fclose(fp);fp = fopen("result.txt","wt"); for(i=0; i<MAX; i++)fprintf(fp, "%d ", a[i]); //排序后数据写入文件fclose(fp);return 0;}归并分类算法:#include <stdio.h>#include <stdlib.h>#define MAX 40000 //分类数据个数,根据不同要求改变int A[MAX]; void MERGE(int low,int mid,int high) //归并组合{int h,k,i,j;int B[MAX]; //组合比较后形成新的数组h=low;i=0;j=mid+1; //对h,i,j 分别初始化while(h<=mid&&j<=high){ if(A[h]<=A[j]) {B[i]=A[h]; //部分归并后将小的数放进新的数组}else{B[i]=A[j]; j++;}i++;}while(h<=mid)B[i++]=A[h++]; // 转存剩余元素 while(j<=high)B[i++]=A[j++];for(i=0,k=low;i<=high-low;i++,k++)A[k]=B[i]; 〃将B 数组中的所有元素还回到 A 数组中}void MERGESORT(i nt low,i nt high)// 归并排序{int mid; if(low<high){mid=(high+low)/2; MERGESORT(low,mid);MERGESORT(mid+1,high); MERGE(low,mid,high);}}int main(){FILE *fp; int i,n;fp = fopen("example.txt","rt");for(i=0; i<MAX; i++) fscanf(fp, "%d ", &A[i]); MERGESORT(0, MAX-1);h++; //查找中点位置//前部分排序 // 后部分排序//从文件中读入数据//归并分类排序fclose(fp);fp = fope n("result.txt","wt");for(i=0; i<MAX; i++)fprin tf(fp, "%d ", A[i]); 〃结果写入文件fclose(fp);return 0;}三、结果分析实验测试数据为小于40000的整形随机数,一般情况下数据是无序排列的,实验中分使用个数为40000,50000,60000,70000,80000,160000,32000(的不同数据测试算法运行时间,得到结果如下:(时间单位:ms)、\^分类算法数据个数、Quicksort MergeSort40000 94 12550000 109 15660000 125 17270000 141 20380000 156 234160000 297 625320000 578 1430算法运行时间图:快速排序和归并排序时间比较最坏情况下测试结果:(时间单位:ms)数据个数—♦—QuicksortOOOOOOOOW矶16141210S6C400200由测试结果可以看出,在一般情况下快速分类算法时间效率要优于归并分类算法,尤其是当数据量变大时归并分类算法花费时间有较大增长,而快速分类算法基本呈线性增长。
《计算机算法设计与分析》
实验指导书
计算机教研室
黄伟东编
实验一:计算机递归和分治策略
一、实验目的:
通过实验,学习计算机递归和分治策略算法。
二、实验任务
1、学习计算机递归算法;
2、学习计算机分治策略算法;
三、实验前准备:
1、认真复习教材第二章;
2、写好预习报告;
四、实验要求:
必须先进行程序设计,再进行实验;
五、实验步骤:
1、开启计算机;
2、运行VC++;
3、输入一段递归算法程序;
如计算阶乘函数:
int Factorial(int n)
{
if (n = = 0) return 1;
return n* Factorial(n-1);
}
4、输入一段分治策略算法程序;
如二分搜索技术算法:
template < class Type >
int BinarySearch (Type a[],const type&x,int n) int left = 0;
int right = n-1;
while (left<=right ) {
int middle = (left+right )/2;
if (x = = a[middle]) return middle;
if (x > a[middle]) left = middle+1;
else right = middle-1;
}
return -1;
}
5、输入数据,并观察运行结果;
6、如正常,关闭计算机,实验结束.
六、实验小结:
略
实验二:计算机动态规划算法;
一、实验目的:
学习计算机动态规划算法。
二、实验任务
1、学习计算机动态规划算法含义;
2、用动态规划算法求最长公共子序列;
三、实验前准备:
1、认真复习教材关于动态规划算法的章节;
2、写好预习报告;
四、实验要求:
必须先进行程序设计,再进行实验;
五、实验步骤:
1、开启计算机;
2、运行VC++;
3、了解最长公共子序列问题;
4、写出最长公共子序列问题数学表达式;
5、推导出最长公共子序列问题的递归表达式;
6、计算最优值;
7、构造最长公共子序列;
8、输入数据,并观察运行结果;
9、如正常,关闭计算机,实验结束;
六、实验小结:
略
实验三:计算机回溯算法
一、实验目的:
通过实验,学习计算机回溯算法;
二、实验任务:
1、学习计算机回溯算法含义;
2、用回溯算法求最优装载问题;
三、实验前准备:
1、认真复习教材关于回溯算法章节;
2、写好预习报告;
四、实验要求:
必须先进行程序设计,再进行实验;
五、实验步骤:
1、开启计算机;
2、运行VC++;
3、了解最优装载问题;
4、计算最优值;
5、设计上界函数;
6、构造最优解;
7、输入数据,并观察运行结果;
8、如正常,关闭计算机,实验结束;
六、实验小结:略
实验四:计算机分支限界法
一、实验目的:
通过实验,学习计算机分支限界算法。
二、实验任务
1、学习计算机分支限界算法含义;
2、用分支限界算法求单源最短路径问题;
三、实验前准备:
1、认真复习教材关于计算机分支限界算法的章节;
2、写好预习报告;
四、实验要求:
必须先进行程序设计,再进行实验;
五、实验步骤:
1、开启计算机;
2、运行VC++;
3、了解单源最短路径问题;
4、输入具体算法;
5、输入数据,并观察运行结果;
6、如正常,关闭计算机,实验结束;
六、实验小结:
略
实验五:计算机近似算法
一、实验目的:
通过实验,学习计算机近似算法。
二、实验任务:
1、学习计算机近似算法含义;
2、用近似算法求顶点覆盖问题;
三、实验前准备:
1、认真复习教材关于计算机近似算法的章节;
2、写好预习报告;
四、实验要求:
必须先进行程序设计,再进行实验;
五、实验步骤:
1、开启计算机;
2、运行VC++;
3、了解顶点覆盖问题;
4、输入具体算法;
5、输入数据,并观察运行结果;
6、如正常,关闭计算机,实验结束;
六、实验小结:
略。