贪心算法详解(基本思想优缺点及经典例子)

贪心算法详解(基本思想优缺点及经典例子)-mikechen

贪心算法是一种常用的算法,本文会以详细介绍贪心算法的基本思想及其代码实现例子@mikechen

贪心算法定义

贪心算法,英文名为Greedy Algorithm,又名贪婪法,是指在对问题求解时,总是做出在当前看来是最好的选择,从而希望能够导致结果是最好或者最优的算法。

也就是说,贪心算法中,无需考虑全局最优解,仅考虑每一步最优即可,这就是贪心算法。

 

贪心算法原理思想

贪心算法的基本思路,主要分为如下4步:

基本思路:

1)建立数学模型来描述问题;

2)把求解的问题分成若干个子问题。

3)对每一子问题求解,得到子问题的局部最优解。

4)把子问题的解局部最优解合成原来解问题的一个解。

 

贪心算法的优缺点

1.优点

直观、易懂,实现简单,算法一旦做出决定,就不用回过头来去重新检查前面计算过的那些值。

 

2.缺点

并非所有问题都能那么解决,对于很多问题,在某个小范围内所做的最优决策,未必是整个问题的最优决策。

 

贪心算法经典例子

1.找零钱的例子

1)题目

指定币值和相应的数量,用最少的数量凑齐某金额。

 

2)思路

利用贪心算法,基本思路:我们优先选择面值大的钱币,以此类推,直到凑齐总金额。

 

3)算法实现

贪心算法详解(基本思想优缺点及经典例子)-mikechen

 

2.活动选择例子

1)题目

有这么一堆数,按照金字塔排列下来,如下图所示:

贪心算法详解(基本思想优缺点及经典例子)-mikechen

我们从顶点开始,求从顶部到底部的最大路径之和。

 

2)思路

利用贪心算法,基本思路:要是用眼瞅,比较容易能看出来最佳路径是9-7-3-4-5,但是如果数一多,眼瞅就不好使了,此时就得靠代码去算。

 

3)算法实现

// 注意,下面的代码只是表意,不能直接扒过去用
// a[i][j]表示数组,maxJ表示数组的最大层数,temp表示临时数值
// maxJ表示总列数,maxI表示当前列的最大行数
 
for(j=0; j<maxJ; j++){
    for(i=0; i<maxI; i++){
        temp1 = a[i][j] + a[i][j+1];
        temp2 = a[i][j] + a[i+1][j+1];
        temp = max(temp1, temp2);
    }
    maxSum = maxSum + temp;
}
return maxSum;

 

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法