计算机算法设计与分析实验指导书,算法设计与分析-附录 实验指导

本实验指导书聚焦于计算机科学中的算法设计与分析,涵盖递归与分治、贪心算法和动态规划。通过实例解析汉诺塔、格雷码构造、单源最短路径、最小延迟调度、0-1背包问题及旅行商问题,旨在深化学生对这些算法的理解和应用。实验要求学生通过编程实践,掌握算法的实现和调试,同时通过思考题探讨算法转换、正确性和优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

“算法分析与设计”是一门面向设计的,处于计算机类相关学科核心地位的课程。无论是计算机系统、系统软件和解决计算机的各种应用课题都可归结为算法的设计。通过本课程的学习,学生将消化理论知识,加深对讲授内容的理解,尤其是一些算法的实现及其应用;并掌握计算机领域中许多常用的非数值计算的算法设计技术:递归算法、分治算法、贪心算法、动态规划算法、回溯算法、分支限界算法,增强独立编程和调试程序的能力;与此同时,读者将对算法的分析与设计有更深刻的认识,并掌握算法分析的方法。

上机实验一般应包括以下几个步骤。

(1)准备好上机所需的程序。手编程序应书写整齐,并经人工检查无误后才能上机。

(2)上机输入和调试自己所编写的程序。一人一组,独立上机调试。若上机时出现问题,最好独立解决。

(3)上机结束后,整理出实验报告。实验报告应包括:题目、程序清单、运行结果、对运行情况所做的分析等。

实验一 递归与分治算法

1.1 实验目的与要求

1. 进一步熟悉C/C++语言的集成开发环境;

2. 通过本实验加深对递归与分治策略的理解和运用。

1.2 实验课时

4学时(课内2学时+课外2学时)

1.3 实验原理

分治(Divide-and-Conquer)的思想:一个规模为n的复杂问题的求解,可以划分成若干个规模小于n的子问题,再将子问题的解合并成原问题的解。

需要注意的是,分治法使用递归的思想。划分后的每一个子问题与原问题的性质相同,可用相同的求解方法。最后,当子问题规模足够小时,可以直接求解,然后逆求原问题的解。

1.4 实验题目

1. 范例:汉诺塔(hanoi)问题

设有A、B、C共3根塔座,在塔座A上堆叠n个金盘,每个盘大小不同,只允许小盘在大盘之上,最底层的盘最大,如附图1所示。现在要求将A上的盘全都移到C上,在移的过程中要遵循以下原则:每次只能移动一个盘;圆盘可以插在A、B和C任一个塔座上;在任何时刻,大盘不能放在小盘的上面。附图1所示为初始状态。

hanoi问题递归求解思想:

我们把一个规模为n的hanoi问题:1到n号盘按照移动规则从A上借助B移到C上表示为H(A,B,C,n);原问题划分成如下三个子问题:

(1)将1到n-1号盘按照移动规则从A上借助C移到B上H(A,C,B,n-1);

(2)将n号盘从A上直接移到C上;

(3)将1到n-1号盘按照移动规则从B上借助A移到C上H(B,A,C,n-1);

经过三个子问题求解,原问题的也即求解完成。

hanoi问题递归求解代码:

void H(char A,charB,charC,int n)

{

if(n>0)

{

H(A,C,B,n-1);

printf("%d from %c to %c",n,A,C);

H(B,A,C,n-1);

}

}

2. 上机题目:格雷码构造问题

Gray码是一个长度为2n的序列。序列无相同元素,每个元素都是长度为n的串,相邻元素恰好只有一位不同。试设计一个算法对任意n构造相应的Gray码(分治、减治、变治皆可)。

对于给定的正整数n,格雷码为满足如下条件的一个编码序列。

(1)序列由2n个编码组成,每个编码都是长度为n的二进制位串。

(2)序列中无相同的编码。

(3)序列中位置相邻的两个编码恰有一位不同。

1.5 思考题

(1)递归的关键问题在哪里?

(2)递归与非递归之间如何实现程序的转换?

(3)分析二分查找和快速排序中使用的分治思想。

(4)分析二次取中法和锦标赛算法中的分治思想。

实验二 贪心算法

2.1 实验目的与要求

1. 理解贪心算法的基本思想;

2. 运用贪心算法解决实际问题,加深对贪心算法的理解和运用。

2.2 实验课时

4学时(课内2学时+课外2学时)

2.3 实验原理

贪心算法的思想:

(1)贪心算法(Greedy Approach)能得到问题的最优解,要证明我们所做的第一步选择一定包含着一个最优解,即存在一个最优解的第一步是从我们的贪心选择开始。

(2)在做出第一步贪心选择后,剩下的子问题应该是和原问题类似的规模较小的子问题,为此我们可以用数学归纳法来证明贪心选择能得到问题的最优解。

2.4 实验题目

1. 范例:单源最短路径

在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V到其余各点的最短路径。

按路径长度递增次序产生最短路径算法。

首先把V分成两组:

(1)S:已求出最短路径的顶点的集合;

(2)V-S=T:尚未确定最短路径的顶点集合。

然后将T中顶点按最短路径递增的次序加入到S中,需保证:

(1)从源点V到S中各顶点的最短路径长度都不大于从V到T中任何顶点的最短路径长度;

(2)每个顶点对应一个距离值。S中顶点:从V到此顶点的最短路径长度;T中顶点:从V到此顶点的只包括S中顶点作中间顶点的最短路径长度。

依据:可以证明V到T中顶点Vk的最短路径,或是从V到Vk的直接路径的权值;或是从V经S中顶点到Vk的路径权值之和。(反证法可证)

单源最短路径代码:

void

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值