今天我们通过贪心算法的概念、过程、适用条件、实例解析四个部分来重新认识下贪心算法。
一、贪心算法的概念
贪心算法又称贪婪算法,是一种在每一步选择中都采取在当前状态下最好或最优的选择,从而希望导致结果是最好或最优的算法。
二、贪心算法的过程
1.建立问题的数学模型。
2.把求解的问题分成若干个子问题。
3.对每一子问题求解,得到子问题的局部最优解。
4.用子问题的解局部最优解堆叠出原问题的最优解。
三、贪心算法适用条件
一个问题是否适用贪心算法必须满足下面三个条件。
1.最优化原理(最优子结构性质)
各子问题具有最优解,就能求出原问题的最优解,这样我们就说问题满足最优化原理又称其具有最优子结构性质。
2.无后向性
以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。即“未来与过去无关”。
举例,求解f(5)需要知道f(1)、f(2)、f(2)、f(3)、f(4)。假如状态转移方程是f(n) = f(n-1) + 2, 那么f(5) = f(4) + 2。也就是说f(5)只与f(4)有关,或者说f(3)只能影响f(4)。只能通过当前的f(4)来影响f(5)的结果。
3.贪心选择性
我们可以做出局部最优选择来构造整体最优解。
也就是说,我们在做出选择时,总是以当前的情况为基础做出最优选择的,每一步所作的贪心选择最终导致问题的整体最优解。
是否适用贪心算法:一般对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析结合上面三个特性,就可以做出判断。
对于求解准确解:必须证明每一步所作的贪心选择最终导致问题的整体最优解。
对于求解近似解:有时候不需要准确求解,为了加快速度,可以考虑贪心算法求解近似解。
四、贪心算法举例
例如,从n个数中寻找最大值。
1.建立数学模型
max(n)= max(n个data)
2.分解子问题
max(n) = max( max(n-1),data[n] )
3.对每个子问题得到局部最优解
max(n) = max( max(n-1),data[n] )
max(n-1) = max( max(n-2),data[n-1] ) .....
4.用子问题中的最大值逐渐堆叠出原问题的最大值。
public static void main(String[] args) {
int[] numberArray = {2,4,8,16,32,64};
int maxNumber = -1;
for (int index=0; index < numberArray.length; index++) {
// 对每个子问题得到局部最优解,逐渐堆叠出原问题的最大值
maxNumber = max(maxNumber, numberArray[index]) ;
} //看不到文字 打开手机暗黑模式哦
System.out.println(maxNumber);
}
public static int max(int numberA, int numberB){
if(numberA > numberB){
return numberA;
}else{
return numberB;
}
}