《算法导论》读书笔记之第16章 贪心算法—活动选择问题
2013-03-16 18:10
603 查看
前言:贪心算法也是用来解决最优化问题,将一个问题分成子问题,在现在子问题最优解的时,选择当前看起来是最优的解,期望通过所做的局部最优选择来产生一个全局最优解。书中先从活动选择问题来引入贪心算法,分别采用动态规划方法和贪心算法进行分析。本篇笔记给出活动选择问题的详细分析过程,并给出详细的实现代码进行测试验证。关于贪心算法的详细分析过程,下次在讨论。
1、活动选择问题描述
有一个需要使用每个资源的n个活动组成的集合S= {a1,a2,···,an },资源每次只能由一个活动使用。每个活动ai都有一个开始时间si和结束时间fi,且 0≤si<fi<∞ 。一旦被选择后,活动ai就占据半开时间区间[si,fi)。如果[si,fi]和[sj,fj]互不重叠,则称ai和aj两个活动是兼容的。该问题就是要找出一个由互相兼容的活动组成的最大子集。例如下图所示的活动集合S,其中各项活动按照结束时间单调递增排序。View Code
程序测试结果如下所示:
![](http://images.cnitblog.com/blog/305504/201303/16180914-81d074bb197a47db9eef153b26f7b3b4.png)
4、总结
活动选择问题分别采用动态规划和贪心算法进行分析并实现。动态规划的运行时间为O(n^3),贪心算法的运行时间为O(n)。动态规划解决问题时全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解。贪心算法的主要思想就是对问题求解时,总是做出在当前看来是最好的选择,产生一个局部最优解。
1、活动选择问题描述
有一个需要使用每个资源的n个活动组成的集合S= {a1,a2,···,an },资源每次只能由一个活动使用。每个活动ai都有一个开始时间si和结束时间fi,且 0≤si<fi<∞ 。一旦被选择后,活动ai就占据半开时间区间[si,fi)。如果[si,fi]和[sj,fj]互不重叠,则称ai和aj两个活动是兼容的。该问题就是要找出一个由互相兼容的活动组成的最大子集。例如下图所示的活动集合S,其中各项活动按照结束时间单调递增排序。View Code
#include <stdio.h> #include <stdlib.h> #define N 11 void recursive_activity_selector(int *s,int* f,int i,int n,int *ret); void greedy_activity_selector(int *s,int *f,int *ret); int main() { int s[N+1] = {-1,1,3,0,5,3,5,6,8,8,2,12}; int f[N+1] = {-1,4,5,6,7,8,9,10,11,12,13,14}; int c[N+1][N+1]={0}; int ret ={0}; int i,j; //recursive_activity_selector(s,f,0,N,ret); greedy_activity_selector(s,f,ret); printf("最大子集为:{ "); for(i=0;i<N;i++) { if(ret[i] != 0) printf("a%d ",ret[i]); } printf(" }\n"); system("pause"); return 0; } void recursive_activity_selector(int *s,int* f,int i,int n,int *ret) { int *ptmp = ret; int m = i+1; //在i和n中寻找第一个结束的活动 while(m<=n && s[m] < f[i]) m = m+1; if(m<=n) { *ptmp++ = m; //添加到结果中 recursive_activity_selector(s,f,m,n,ptmp); } } void greedy_activity_selector(int *s,int *f,int *ret) { int i,m; *ret++ = 1; i =1; for(m=2;m<=N;m++) if(s[m] >= f[i]) { *ret++ = m; i=m; } }
程序测试结果如下所示:
![](http://images.cnitblog.com/blog/305504/201303/16180914-81d074bb197a47db9eef153b26f7b3b4.png)
4、总结
活动选择问题分别采用动态规划和贪心算法进行分析并实现。动态规划的运行时间为O(n^3),贪心算法的运行时间为O(n)。动态规划解决问题时全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解。贪心算法的主要思想就是对问题求解时,总是做出在当前看来是最好的选择,产生一个局部最优解。
相关文章推荐
- 算法导论第16章 贪心算法-活动选择问题
- 算法导论 第16章 活动选择问题的递归和迭代贪心算法
- 算法导论-第16章-贪心算法-16.1 活动选择问题
- 《算法导论》之 贪心算法—活动选择问题
- 活动选择问题(算法导论第16章(贪心算法)
- 算法导论,贪心算法 —— 活动选择问题(python示例)
- 算法导论--贪心算法与动态规划(活动选择问题)
- 算法导论 第16章 贪心算法-活动选择问题C++实现
- 算法导论第16章 贪心算法之活动选择
- 算法导论程序40--贪心算法(活动选择问题)
- 《算法导论》笔记 第16章 16.1 活动选择问题
- 活动选择问题(算法导论第十六章贪心算法)
- 贪心算法之活动选择问题
- 贪心算法与活动选择问题和背包问题
- 算法导论之贪心算法:活动选择问题
- 动态规划——贪心算法——活动选择问题 收藏
- 算法导论-16.1-4 活动教室选择问题
- 活动选择问题 (动态规划、贪心算法)
- 算法导论 16-1.1活动选择问题 动态规划解
- 算法学习(贪心算法一)活动选择问题