贪心法会做出当前看来最好的选择结果,但是并不从整体考虑最优,它做出的只是局部最优。虽然贪心算法不能对所有问题都得到整体最优解,但是对许多问题它能产生整体最优解,如:单源最短路径问题,最小生成树。
2个重要性质:
1.贪心选择性质:
所求问题的最优解可以通过一系列局部最优的选择
2.最优子结构性质 :
当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质
贪心算法和 动态规划算法都具有 此性质
例题:
假定有N个班级,都需要使用音乐教室上课,他们的上课起止时间不同,求 该时间段内 音乐教师能容纳最多的活动时间段?
假定活动已按结束时间 fi 的单调递增顺序排序
JAVA代码演示:
/**
* @Author wuxiaotian
* @Date 2021/8/26 11:00
* @Version C1.4
*/
public class Test03 {
int[] OptimalSubset = new int[10];
int[] s = new int[] {1,3,0,5,3,5,6,8,8,2,12};
int[] f = new int[] {4,5,6,7,8,9,10,11,12,13,14};
public int GreedyActivitySelector(int[] s, int[] f,int n){ /**迭代贪心算法**/
int activityNum = 0;
OptimalSubset[activityNum ++] = 1;//第一个活动是必选的
int index = 1;
int m;
for (m = 2; m <= n; m++) {
if(s[m] >= f[index]){ //寻找下一个开始时间 > 当前活动结束时间的
OptimalSubset[activityNum++] = m; //存储找到的活动
index = m;//继续寻找下一个开始时间
}
}
return activityNum;
}
public static void main(String[] args) {
Test03 test03 = new Test03();
// test03.f.length - 1 )下标从0开始的
int i = test03.GreedyActivitySelector(test03.s, test03.f, test03.f.length - 1);
System.out.println(i);
}
}