1、算法设计与分析实验指导书算法设计与分析实验指导书邵阳学院信息工程系2010年3月实验1 最大子段和(分治法)一、实验内容运用分治法,编制程序求解如下问题:给定由n个整数(可能有负整数)组成的序列(a1,a2,an),最大子段和问题要求该序列形如的最大值(1=i=j=n),当序列中所有整数均为负整数时,其最大子段和为0。二、实验要求1进一步掌握递归算法的设计思想以及递归程序的调式技术;2理解这样一个观点,分治与递归经常同时应用在算法设计之中。三、主要仪器设备装有TC或Visual C+的PC机四、实验步骤1算法分析最大子段和问题的分治策略是:(1)划分:按照平衡子问题的原则,将序列(a1, a2
2、, , an)划分成长度相同的两个子序列(a1, , an/2)和(an/21, , an),则会出现以下三种情况: a1, , an的最大子段和a1, , an/2的最大子段和; a1, , an的最大子段和an/21, , a的最大子段和; a1, , an的最大子段和,且(2)求解子问题:对于划分阶段的情况和可递归求解,情况需要分别计算:, 则s1+s2为情况的最大子段和。(3)合并:比较在划分阶段的三种情况下的最大子段和,取三者之中的较大者为原问题的解。分析算法的时间性能,对应划分得到的情况和,需要分别递归求解,对应情况,需要两个并列for循环,时间复杂性是O(n),所以,存在如下递推
3、式:时间复杂性为O(nlogn)。 2参考代码#include int MaxSum(int a, int left, int right) int sum=0, leftsum=0, rightsum=0; int center, i, j; int s1, s2, lefts, rights; if (left=right) /如果序列长度为1,直接求解 if (aleft0) sum=aleft; else sum=0; else center=(left+right)/2; /划分 /对应情况,递归求解 leftsum=MaxSum(a, left, center); /对应情况,递归
4、求解 rightsum=MaxSum(a, center+1, right); /以下对应情况,先求解s1 s1=0; lefts=0; for (i=center; i=left; i-) lefts+=ai; if (leftss1) s1=lefts; /再求解s2 s2=0; rights=0; for (j=center+1; js2) s2=rights; sum=s1+s2; /计算情况的最大子段和 /合并,在sum、leftsum和rightsum中取较大者 if (sumleftsum) sum=leftsum; if (sumrightsum) sum=rightsum;
5、return sum;int main() int a=-20, 11, -4, 13, -5, -2; int left=0, right=5; coutMaxSum(a, left, right) 0 ; xi = yi 时, cij = ci-1j-1 + 1当 i , j 0 ; xi != yi 时, cij = max cij-1, ci-1j 2参考代码#include using namespace std;#define max 100int Lmaxmax; /长度矩阵int Smaxmax; /状态矩阵int CommonOrder(int m, int n, char
6、x, char y, char z) int i, j, k; for (j=0; j=n; j+) L0j=0; / 初始化第0行 for (i=0; i=m; i+) Li0=0; / 初始化第0列 for (i=1; i=m; i+) for (j=1; j=Li-1j) Lij=Lij-1; Sij=2; else Lij=Li-1j; Sij=3; i=m; j=n; k=Lmn; while (i0 & j0) if (Sij=1) zk=xi; k-; i-; j-; else if (Sij=2) j-; else i-; return Lmn;int main() char
7、xmax=x, a, b, c, b, d, b; char ymax=y, a, c, b, b, a, b, d, b, b; char zmax; int m=6, n=9; int len=0, i, j; cout序列X:endl; for (i=1; i=m; i+) coutxit; coutendl; cout序列Y:endl; for (i=1; i=n; i+) coutyit; coutendlendl; len=CommonOrder(m, n, x, y, z); cout最长公共子序列长度:lenendl; cout最长公共子序列为:endl; for (i=1;
8、i=len; i+) coutzit; coutendlendl; cout长度矩阵:endl; for (i=0; i=m; i+) for (j=0; j=n; j+) coutLijt; coutendl; coutendl; cout状态矩阵:endl; for (i=0; i=m; i+) for (j=0; j=n; j+) coutSijt; coutendl; coutendl; return 0;实验3 多机调度问题一、实验内容利用贪心法设计算法求解如下问题:要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。约定,每个作业均可在任何一台机器上
9、加工处理,但未完工前不允许中断处理。作业不能拆分成更小的子作业。分析算法执行效率。二、实验要求1了解多机调度问题,学会分析该问题,并设计相应算法;2掌握贪心算法设计思想。三、主要仪器设备装有TC或Visual C+的PC机四、实验步骤1算法分析这个问题是一个NP完全问题,到目前为止还没有一个有效的解法。对于这一类问题,用贪心选择策略有时可以设计出较好的近似算法。可以考虑以下的贪心策略:(1)最长处理时间作业优先的贪心选择策略。(2)最短处理时间作业优先的贪心选择策略。(3)作业到达时间优先的贪心选择策略。2运行Visual C+集成开发环境,建立控制台工程。3编写代码,实现一种贪心算法。4假设
10、7个独立的作业由3台机器加工处理,各作业所需的处理时间为:2,14,4,6,16,5,3,写出以上算法求解此问题的结果。5分析算法的运行效率。五、注意事项1对作业进行排序可以使用C+提供的泛型函数sort()来实现。2实验报告中,算法分析需要写出算法实现的具体步骤。3实验报告中,只需要提供算法实现的主要代码。实验4 01背包(贪心法)一、实验内容运用贪心法,设计贪心策略,编制程序求解如下问题:给定n个物品和一个容量为C的背包,物品i的重量是Wi,其价值是Vi,0-1背包问题是如何选择装入背包的物品(物品不可以分割),使得装入背包中的物品的总价值最大?二、实验要求1掌握贪心法的设计思想;2掌握贪
11、心策略的设计方法以及如何针对特定问题,选取合适的贪心策略。 三、主要仪器设备:装有TC或Visual C+的PC机四、实验步骤1算法分析这个问题是一个NP完全问题,到目前为止还没有一个有效的解法。对于这一类问题,用贪心选择策略有时可以设计出较好的近似算法。可以考虑以下的贪心策略:(1)重量最轻的物品优先的贪心选择策略。(2)重量最重的物品优先优先的贪心选择策略。(3)价值最大的物品优先的贪心选择策略。(4)单位价值最大的物品优先的贪心选择策略。2运行Visual C+集成开发环境,建立控制台工程。3编写代码,实现一种贪心算法。4自定义n个物品的重量和价值,以及背包容量C,写出以上算法求解此问题的结果。5分析算法的运行效率。五、注意事项1排序可以使用C+提供的泛型函数sort()来实现。2实验报告中,算法分析需要写出算法实现的具体步骤。3实验报告中,只需要提供算法实现的主要代码。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1