贪心算法实现思路及其代码演示

一、什么是贪心算法?

去百度上搜索一下,它会给你提供下面一段话:

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

由此我们可以进行一个简单的总结:所谓贪心算法,不就是解决问题时,选出最简单的、最快捷的方式嘛!
那么在解决哪些问题上时,我们可以使用上呢?以及其具体的实现思路是什么呢?这篇文章将会对贪心算法进行仔细地分析,让你领会到算法的魅力~

二、实例分析

首先上一张图:
贪心算法实现思路及其代码演示_第1张图片
如果我们没学习过贪心算法,肯定第一反应是慢慢组合嘛!

如果只有一个广播台A,那么只有一种组合方式:A。
如果有两个广播台,分别为A、B,那么将会有三种组合方式:A、B、AB。
如果有三个广播台,分别为A、B、C,那么将会有七种组合方式:A、AB、AC、ABC、B、BC、C。

由此我们可以很简单的得到一个结论:我们假设广播台有n个,那么可以得知一共有2∧n-1种组合方式。但是这样做往往耗时耗力,程序的时间复杂度会非常高,不推荐使用。这时候就要引出我们的贪心算法了!

三、贪心算法思路分析

  1. 还是按照上面那个图来说。我们将K1-K5遍历以后,可以得到一个包含所有城市的集合(“北京”“上海””天津““广州”“深圳”“成都”“杭州“”大连“)
  2. 之后遍历所有的广播台,找到一个覆盖了最多未覆盖区域的电台。
  3. 然后将这个广播台放入一个数组中,比如ArrayList。并将这个电台覆盖的区域在下次比较时去掉。
  4. 重复第一步操作。

你可能将以上步骤看完,并不懂什么意思,那么我下面就来进行详细的图解:

  1. 首先,我们可以得知每个广播台覆盖区域的城市,占所有区域中的几个。
    贪心算法实现思路及其代码演示_第2张图片
    然后我们将占区域最多的广播台,放入ArrayList数组中,得到:
    ArrayList[K1];

(这时候可能会有小伙伴问K2,K3 不是个K1所占区域数是一样的吗?在这里,我们每次取第一个元素)

2.这时候,我们将总的区域中,与K1覆盖区域相同的城市去掉,并重新获取每个广播台所占几个,就变成下图这样:
贪心算法实现思路及其代码演示_第3张图片
这时候我们继续将所占区域最多的广播台放入数组中,得到:
ArrayList[K1,K2];

3.我们继续重复上面的操作,就得到下图:
贪心算法实现思路及其代码演示_第4张图片
我们继续将占有数最高的广播台,放入数组中,得到:
ArrayList[K1,K2,K3];

4.继续之前的操作,得到下图:
贪心算法实现思路及其代码演示_第5张图片
继续将占有最多的广播台,放入数组中,得到:
ArrayList[K1,K2,K3,K5];

5.其实第五步有点多余了,因为我们肯定知道,最后一步他们的占有数都是零,但是我继续上张图吧!
贪心算法实现思路及其代码演示_第6张图片
这时候就不需要将任何数放进数组了!

所以我们用很高效、简单的方式就得到了最优解,即:

ArrayList[K1,K2,K3,K5];

这就是贪心算法的相关思路。相信看到这里的小伙伴,应该对整个过程都有一定的了解了!有了思路,那么代码的实现也是非常的简单,我们下面直接上代码!

四、贪心算法代码实现

贪心算法实现思路及其代码演示_第7张图片

整个贪心算法的实现代码,如上图所示~

每一个过程基本上我都添加了注释,理解起来应该不会太难~

当然你也可以选择用加断点的方式,来一步步进行调试,从而帮助你进一步理解~

学习算法的过程是很枯燥、乏味的,但是希望大家都能够不放弃,一起继续加油呀~!

你可能感兴趣的:(数据结构与算法学习,java,算法,数据结构)