【24K算法系列002】贪心算法

246 阅读2分钟

        今天我们通过贪心算法的概念、过程、适用条件、实例解析四个部分来重新认识下贪心算法。

一、贪心算法的概念

        贪心算法又称贪婪算法,是一种在每一步选择中都采取在当前状态下最好或最优的选择,从而希望导致结果是最好或最优的算法。

二、贪心算法的过程

        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;
    }
}

我的微信公众号