算法设计发顶顶顶顶顶及分析-课程实验指导书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《算法设计与分析》课程实验指导书
作者:姜文君杨明李梦娴
单位:信息科学与工程学院
2015年4月
一、实验教学目标
《算法设计与分析》旨在教会学生处理各种问题的方法,而通过实验,使学生能够把所学的方法用于具体的问题,并对所用算法进行比较分析,从而提高学生分析问题、解决问题的能力。
只有通过实验,学生才能判定自己所拟算法是否正确,是否算得上一个较优算法。
通过该课程的实验,使学生对课堂中所讲述的内容有一个直观的认识,更好地掌握所学的知识。
同时培养学生的实际动手能力,加强学生创新思维能力的培养。
二、实验教学主要内容
实验课外时间组织:实验课外消化理论课堂,老师对项目实验的讲解,并且做好相关的设计与实现。
实验课内时间组织:学生在学院机房集中上机,实验教师在机房采用辅导和自由讨论相结合的方式进行指导。
最终完成实验项目的检查。
三、实验要求
《算法设计与分析》是计算机专业的专业核心课程,其先修课程有数据结构和至少一门高级语言。
算法设计与分析课程将覆盖计算机软件实现中的大部分算法,并具有一定的深度和广度,使学生对计算机常用算法有一个全盘的了解;通过此课的学习,学生应该具有针对所给的问题设计和实现高效算法的能力。
通过上机实验,将使学生熟悉、掌握课堂教学中所学的大部分算法。
同时,上机实验是对学生在软件设计方面的综合训练,包括问题分析、总体结构设计、用户界面设计(可选)、程序设计基本技能和技巧等,以培养良好的
编程风格和科学作风。
通过理论联系实际,以最终提高学生动手操作的能力以及分析问题的能力。
为了顺利完成《算法设计与分析》课程实验,学生应做到:
1、熟练掌握一种高级程序设计语言及相关开发工具。
2、认真学习教材以及老师课堂讲解的项目实验相关内容,提前做好分析设
计和实现。
3、自行完成代码编写,不得超袭。
实验课上课时间做好项目陈述和检查的
准备,也可以针对一些问题做相应的讨论。
4、遵守机房纪律,服从辅导教师指挥,爱护实验设备。
5、实验课上进行相关的程序检查和测试,结束后提交所有的文档和源程序。
四、评分细则
实验总分值80+附加分(实现了额外的程序实验等)
实验项目名称分值评分标准备注
1.分治算法实验(用分治法查找数组元素的最大值和
最小值)10考勤2分,设计4分,程序检查2分,文档2分
2.分治算法实验(用分治法
实现归并排序算法)10考勤2分,设计4分,程序检查2分,文档2分
3.动态规划法求解背包问题10考勤2分,设计4分,程序检查2分,文档2分
4.贪心算法实验(求解背包
问题)10考勤2分,设计4分,程序检查2分,文档2分
5.贪心法求最短路径10考勤2分,设计4分,程序检查2分,文档2分
6.回溯法实验(八皇后问题)10考勤2分,设计4分,程序检查2分,文档2分
7.分支限界法实验(单源最
短路径)10考勤2分,设计4分,程序检查2分,文档2分
8.随机算法实验(Sherwood线性时间选择
算法)10考勤2分,设计4分,程序检查2分,文档2分
五、实验项目
实验一分治算法实验(用分治法查找数组元素的最大值和最小值)
1.实验目的
通过上机实验,要求掌握分治算法的问题描述、算法设计思想、程序设计。
2.实验要求
在满足分治法的条件下,根据不同的输入用例,能准确的输出用例中的最大值与最小值。
并计算出程序运行所需要的时间。
3.实验内容
用分治法查找数组元素的最大值和最小值
(1)问题描述
给定任意几组数据,利用分治法的思想,找出数组中的最大值和最小值并输出。
(2)实验步骤
①先解决小规模的问题,如数组中只有1个元素或者只有两个元素时候
的情况。
②将问题分解,如果数组的元素大于等于3个,将数组分为两个小的数
组。
③递归的解各子问题,将(中分解的两个小的数组再进行以上两个步骤
((最后都化为小规模问题。
④将各子问题的解进行比较最终得到原问题的解。
4.实验环境
VS2010、VS2012
5.实验预习要求
算法设计与分析、C/C++
6.评分标准
考勤2分,设计4分,程序检查2分,文档2分
7.实验报告
体现设计和主要算法的描述,并附上关键源程序的分析思路。
8.附录
计算程序运行时间的算法如下所示:
#include<time.h>
#include<iostream>
#include<iomanip>
using namespace std;
void main()
{
int i,j=0;
double k=0.0;
clock_t start,end,over;
start=clock();
end=clock();
over=end-start;
start=clock();
for(i=0;i<1000000000;i++)
j=j+i;
end=clock();
printf("The time is%6.3f",(double)(end-start-over)/CLK_TCK);
}
实验二分治算法实验(用分治法实现归并排序算法)
1.实验目的
通过上机实验,要求掌握分治算法的问题描述、算法设计思想、程序设计。
2.实验要求
了解用分治法求解的问题:当要求解一个输入规模为n,且n的取值相当大的问题时,如果问题可以分成k个不同子集合,得到k个不同的可独立求解的子问题,其中1<k≤n,而且子问题与原问题性质相同,原问题的解可由这些子问题的解合并得出。
那末,对于这类问题分治法是十分有效的。
同时要求计算出程序运行所需要的时间。
3.实验内容
(1)问题描述
给定任意几组数据,利用分治法的思想,将数据进行排序并将排好的数据进行输出。
(2)实验步骤
①先解决小规模的问题。
②将问题分解,将数组分为两个小的数组。
③递归的解各子问题,将 中分解的两个小的数组再进行以上两个步骤
最后都化为小规模问题。
④将各子问题的解进行合并最终得到原问题的解。
4.实验环境
VS2010、VS2012
5.实验预习要求
算法设计与分析、C/C++
6.评分标准
考勤2分,设计4分,程序检查2分,文档2分
7.实验报告
体现设计和主要算法的描述,并附上关键源程序的分析思路。
8.附录
计算程序运行时间的算法如下所示:
#include<time.h>
#include<iostream>
#include<iomanip>
using namespace std;
void main()
{
int i,j=0;
double k=0.0;
clock_t start,end,over;
start=clock();
end=clock();
over=end-start;
start=clock();
for(i=0;i<1000000000;i++)
j=j+i;
end=clock();
printf("The time is%6.3f",(double)(end-start-over)/CLK_TCK);
}
实验三动态规划法求解背包问题
1.实验目的
通过上机实验,要求掌握动态规划算法的问题描述、算法设计思想、程序设计。
2.实验要求
利用动态规划算法求解背包问题,并计算出程序运行所需要的时间。
3.实验内容
(1)问题描述
给定几组数据,利用动态规划算法的思想,把0-1背包装满并使得其价值最大。
(2)实验步骤
①把问题分解成若干个子问题,如背包仅可以容纳1个物品且可以容纳
的质量为一等。
②依次求出各个子问题的最优解。
③每个子问题的最优解又可以从它的子问题的最优解中得到。
④通过各个子问题的最优解得到原问题的最优解。
4.实验环境
VS2010、VS2012
5.实验预习要求
算法设计与分析、C/C++
6.评分标准
考勤2分,设计4分,程序检查2分,文档2分
7.实验报告
体现设计和主要算法的描述,并附上关键源程序的分析思路。
8.附录
计算程序运行时间的算法如下所示:
#include<time.h>
#include<iostream>
#include<iomanip>
using namespace std;
void main()
{
int i,j=0;
double k=0.0;
clock_t start,end,over;
start=clock();
end=clock();
over=end-start;
start=clock();
for(i=0;i<1000000000;i++)
j=j+i;
end=clock();
printf("The time is%6.3f",(double)(end-start-over)/CLK_TCK);
}
实验四贪心算法实验(求解背包问题)
1.实验目的
通过上机实验,要求掌握贪心算法的问题描述、算法设计思想、程序设计。
2.实验要求
设计程序,利用贪心算法求解背包问题,输出相应结果,并计算出程序运行所需要的时间。
3.实验内容
(1)问题描述
给定几组数据,利用贪心算法的思想,将物品装入背包并使得其价值最大。
(2)实验步骤
①计算每种物品单位重量的价值Vi/Wi.
②依贪心选择策略,将尽可能多的单位重量价值最高的物品装入背
包。
③若将这种物品全部装入背包后,背包内的物品总重量未超过C,
则选择单位重量价值次高的物品并尽可能多地装入背包。
④依此策略一直地进行下去,直到背包装满为止。
4.实验环境
VS2010、VS2012
5.实验预习要求
算法设计与分析、C/C++
6.评分标准
考勤2分,设计4分,程序检查2分,文档2分
7.实验报告
体现设计和主要算法的描述,并附上关键源程序的分析思路。
8.附录
计算程序运行时间的算法如下所示:
#include<time.h>
#include<iostream>
#include<iomanip>
using namespace std;
void main()
{
int i,j=0;
double k=0.0;
clock_t start,end,over;
start=clock();
end=clock();
over=end-start;
start=clock();
for(i=0;i<1000000000;i++)
j=j+i;
end=clock();
printf("The time is%6.3f",(double)(end-start-over)/CLK_TCK); }
实验五:贪心法求最短路径
1、实验目的:
通过上机实验,掌握贪心算法的思想,利用Dijkstra算法求解最短路径并实现。
2、实验要求:
使用贪心法求出给定图各点的最短路径,并计算算法的执行时间,分析算法的有效性。
3、实验内容:
,如上所示,求出从(1)问题描述:已知一个有向网络G=(V,E)和源点V
1
源点出发到图中其余顶点的最短路径。
(2)实验步骤:
1用邻接矩阵表示有向图,并进行初始化,同时选择源点;
2选取候选集中距离最短的顶点,把其加入终点集合中;
3以该顶点为新考虑的中间顶点,修改候选集中各顶点距离,若经过该点后,各点到达源点距离比原来距离短,则修改距离;
4重复以上2、3步,直到所有候选集点都被加入到终点集中。
8.实验环境
VS2010、VS2012
9.实验预习要求
算法设计与分析、C/C++
10.评分标准
考勤2分,设计4分,程序检查2分,文档2分
11.实验报告
体现设计和主要算法的描述,并附上关键源程序的分析思路。
12.附录
计算程序运行时间的算法如下所示:
#include<time.h>
#include<iostream>
#include<iomanip>
using namespace std;
void main()
{
int i,j=0;
double k=0.0;
clock_t start,end,over;
start=clock();
end=clock();
over=end-start;
start=clock();
for(i=0;i<1000000000;i++)
j=j+i;
end=clock();
printf("The time is%6.3f",(double)(end-start-over)/CLK_TCK);
}
实验六:回溯法实验(八皇后问题)
1、实验目的:
(1)掌握回溯法求解问题的思想
(2)学会利用其原理求解相关问题
2、实验要求:
利用回溯法解决八皇后问题,检验结果,并计算算法的执行时间,分析算法的有效性。
测试数据可以通过手工寻找三组满足需要的值,测试数组(M,N),其中M代表皇后所在的行,N代表皇后所在的列。
例如,第一组测试数据:
(1,4)、(2,7)、(3,3)、(4、8)、(5,2)、(6,5)、(7,1)、(8,6);
第二组测试数据
(1,5)、(2,2)、(3,4)、(4,7)、(5,3)、(6,8)、(7,6)、(8,1);
第三组测试数据:
(1,4)、(2,2)、(3,7)、(4,3)、(5,6)、(6,8)、(7,5)、(8,1)。
最后与编程求得的结果进行比较。
如果这三组数据在最后编程求得的结果中,说明程序的编写基本没有什么问题。
3、实验内容:
(1)问题描述:
八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。
(2)实验步骤:
数组法:
1根据8皇后问题,可以把其设想为一个数组;
2根据8皇后的规则,可以设想为数组上同一直线,横线,斜线的数字都不能相同,由此可以得出判断条件;
3根据判断条件之后,建立回溯点,即可解决问题。
堆栈法:
1检索当前行是否可以放置一个皇后;
2利用检索过程,通过递归的方式,来确定每个皇后的位置———回溯的思想。
4.实验环境
VS2010、VS2012
5.实验预习要求
算法设计与分析、C/C++
6.评分标准
考勤2分,设计4分,程序检查2分,文档2分
7.实验报告
体现设计和主要算法的描述,并附上关键源程序的分析思路,以及结果分析。
8.附录
计算程序运行时间的算法如下所示:
#include<time.h>
#include<iostream>
#include<iomanip>
using namespace std;
void main()
{
int i,j=0;
double k=0.0;
clock_t start,end,over;
start=clock();
end=clock();
over=end-start;
start=clock();
for(i=0;i<1000000000;i++)
j=j+i;
end=clock();
printf("The time is%6.3f",(double)(end-start-over)/CLK_TCK); }
实验七:分支限界法实验(单源最短路径)
1、实验目的:
(1)掌握并运用分支限界法基本思想
(2)运用分支限界法实现单源最短路径问题
2、实验要求:
设计C/C++程序解决下图中的单源最短路径问题,并计算算法的执行时间,分析算法的有效性。
3、实验内容及步骤:
(1)问题描述:
给定下示有向图,利用分支限界法的思想,计算并输出其单源最短路径。
(2)实验步骤:
1算法从图G的源顶点s和空优先队列开始。
结点s被扩展后,它的儿子结点被依次插入堆中;
2算法每次从堆中取出具有最小当前路长的结点作为当前扩展结点,并依次检查与当前扩展结点相邻的所有顶点;
3如果从当前扩展结点i到j有边可达,且从源出发,途经i再到j的所相应路径长度,小于当前最优路径长度,则将该顶点作为活结点插入到活结点优先队列中;
4结点扩展过程一直继续到活结点优先队列为空时为止。
4.实验环境
VS2010、VS2012
5.实验预习要求
算法设计与分析、C/C++
6.评分标准
考勤2分,设计4分,程序检查2分,文档2分
7.实验报告
体现设计和主要算法的描述,并附上关键源程序的分析思路。
8.附录
计算程序运行时间的算法如下所示:
#include<time.h>
#include<iostream>
#include<iomanip>
using namespace std;
void main()
{
int i,j=0;
double k=0.0;
clock_t start,end,over;
start=clock();
end=clock();
over=end-start;
start=clock();
for(i=0;i<1000000000;i++)
j=j+i;
end=clock();
printf("The time is%6.3f",(double)(end-start-over)/CLK_TCK);
}
实验八Sherwood型线性时间选择算法
1.实验目的
通过上机实验,要求掌握Sherwood型线性时间选择算法的问题描述、算法设计思想、程序设计。
2.实验要求
使用舍伍德型选择算法,根据不同的输入用例,能准确的输出用例中的中值,并计算出程序运行所需要的时间。
4.实验内容
用分治法查找数组元素的最大值和最小值
(1)问题描述
给定任意几组数据,利用舍伍德型选择算法,找出数组中的中值并输出(若数组为奇数个则输出中值,若数组为偶数个则输出第n/2小元素)。
(2)实验步骤
①先判断是否需要进行随机划分即(kϵ(1,n)?n>1?);
②产生随机数j,选择划分基准,将a[j]与a[l]交换;
③以划分基准为轴做元素交换,使得一侧数组小于基准值,另一侧数组
值大于基准值;
④判断基准值是否就是所需选择的数,若是,则输出;若不是对子数组
重复步骤②③④。
13.实验环境
VS2010、VS2012
14.实验预习要求
算法设计与分析、C/C++
15.评分标准
考勤2分,设计4分,程序检查2分,文档2分
16.实验报告
体现设计和主要算法的描述,并附上关键源程序的分析思路。
8.附录
计算程序运行时间的算法如下所示:
#include<time.h>
#include<iostream>
#include<iomanip>
using namespace std;
void main()
{
int i,j=0;
double k=0.0;
clock_t start,end,over;
start=clock();
end=clock();
over=end-start;
start=clock();
for(i=0;i<1000000000;i++)
j=j+i;
end=clock();
printf("The time is%6.3f",(double)(end-start-over)/CLK_TCK); }。