一,贪心算法的思想
贪心算法通过一系列的选择得到问题的最优解,它做出的每一个选择都是当前状态下的局部最优解,即贪心选择。
二,贪心算法的基本要素
贪心算法求解的问题的一般特征
1,贪心选择性质
是指所解问题的最优解可以通过一系列局部最优解的选择,即贪心选择来达到。
2,最优子结构性质
当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。
三,贪心算法与动态规划的区别
1,贪心算法和动态规划算法都要求问题具有最优子结构性质,这是两类算法的共同点。
2,贪心选择性质是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。在动态规划算法中,每步所作出的选择往往依赖于相关子问题的解,因而只有在解出相关子问题后,才能作出选择。在贪心算法中,仅在当前状态下作出最优选择,即局部最优选择,然后再去解出做出这个选择后产生的相关子问题。正是由于这种差别,动态规划算法通常以自底向上的方式解各个子问题,而贪心算法通常以自顶向下的方式进行,以迭代方式做出相继的贪心选择,每做一次贪心选择就将所求问题转换为规模更小的子问题。
四,常见的使用贪心算法求解的问题
1,活动安排问题
struct Interval{
int start;
int end;
};
void GreedySelector(vector<Interval> &intervals, vector<bool> &A){
int pre = 0;
A[0] = true;
for(int i = 1; i < intervals.size(); i ++){
if(intervals[i].start >= intervals[pre].end){
A[i] = true;
pre = i;
} else {
A[i] = false;
}
}
}