实验1 贪心算法应用及设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一贪心算法应用及设计
实验课时:6学时
二、实验目的:
(1)理解贪心选择算法的思想
(2)熟悉单源、哈夫曼、最小生成树等问题的算法;
(3)通过对例题分析、设计、调试,体会和掌握贪心法在程序设计中的应用,并进行贪心优化的相应练习。
二、实验原理:
贪心选择算法思想:
(1)贪心选择能得到问题的最优解,要证明我们所做的第一步选择一定包含在一个最优解,即存在一个最优解的第一步是从我们的贪心选择开始。
(2)在做出第一步贪心选择后剩下的子问题应该是和原问题类似的规模较小的子问题 为此我们可以用数学归纳法来证明贪心选择能得到问题的最优解。
三、实验内容:
1、活动安排问题。
问题:有n个活动的集合A={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。
求解:安排尽量多项活动在该场地进行,即求A的最大相容子集。
设待安排的11个活动的开始时间和结束时间按结束时间的升序排列如下:
将此表数据作为实现该算法的测试数据。
(1)给出算法基本思想;
(2)给出用C/C++或java语言实现程序的代码;
public class actionarrange {
public static void main(String []args) {
int start[]={1,3,0,5,3,5,6,8,8,2,12};
int finish[]={4,5,6,7,8,9,10,11,12,13,14};
boolean arrange[]=new boolean[10];
for(int i=0;i<10;i++){
arrange[i]=false;
}
int cout=greedySelector(start,finish,arrange);
System.out.println("安排的活动数目:"+cout);
}
public static int greedySelector(int s[],int f[], boolean a[]) {
int n=s.length-1;
a[0]=true;
System.out.println("活动安排情况如下:");
System.out.println("活动序号开始时间结束时间");
System.out.println(" "+0+" "+s[0]+" "+f[0]);
int j=1;
int count=1;
for (int i=1;i { if (s[i]>=f[j]) { a[i]=true; j=i; count++; System.out.println(" "+i+" "+s[i]+" "+f[i]); } else a[i]=false; } return count; } }
(3)分析运行结果
2、设计贪心算法求单源最短路径编码方案
(1)采用C/C++或java语言实现算法,写出程序的编码;
(2)分析算法的时间复杂性;
(3)根据实验结果撰写实验报告。
3、设计贪心算法求解Huffman编码方案;
(1)采用C/C++或java语言实现算法,写出程序的编码;
(2)分析算法的时间复杂性;
(3)根据实验结果撰写实验报告。
4、用Prim算法或Kruskal算法实现最小生成树.
(1)采用C/C++或java语言实现算法,写出程序的编码;
(2)分析算法的时间复杂性;
(3)根据实验结果撰写实验报告。
四、思考问题:
贪心算法与动态规划思想解题的区别?