贪心算法

总是选择当前看起来最优的选择(局部最优解),得到的结果是一个整体最优解。

但是总是选择局部最优解并不总是能得到整体最优解,需要在问题具有:贪心选择性和优化子结构时才成立。

贪心选择性:第一次做出贪心选择是正确的;

优化子结构:第一次做完贪心选择后,得到一个与原问题定义相同(但输入不同)的子问题;

贪心算法的基本要素

贪心选择性质

1.贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。

2.贪心算法通常以自顶向下的方式进行,一迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。动态规划通常以自底向上的方式解决子问题。

最优子结构性质

当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。

贪心算法的求解过程

问题的定义
优化解的结构分析
算法设计
算法复杂性
算法正确性证明

活动安排问题定义

定义(活动)

设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,而在同一时间内只有一个活动能使用这个资源。

定义(相容活动)

若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的。也就是说,当si≥fj或sj≥fi时,活动i与活动j相容。
在这里插入图片描述
输入:

活动安排问题的贪心算法思路

1.将各个活动按照活动结束时间fi排序,且f1<=f2<=f3…

2.选择活动1,要求该活动的结束时间最早

3.从2开始按顺序比较各个活动,选择第一个与活动1相容的活动i

4.从i+1开始按顺序考察各个活动,选择第一个与活动 i 相容的活动 j

**每次选择与现有活动相容的结束时间最早的活动 **

举例详解算法过程

现在给出下列活动,s表示开始时间,f表示结束时间;

在这里插入图片描述
根据算法,我们首选选择结束时间最早的活动作为第一个活动,第一个活动为:1

然后选择开始时间大于第一个活动的结束时间的活动,而且该活动的结束时间要求最早。显然是活动4;

同理,寻找开始时间晚于活动4的结束时间且结束时间最早的活动,一直到到无活动可选为止。

在这里插入图片描述

复杂度分析

在这里插入图片描述

算法可以得到最优解的证明

证明贪心算法可以得到最优解要求:

  1. 证明第一次选择是正确的
  2. 证明第一次选择后,问题输入变为与第一个活动相容的活动的子问题
    (因为第二个选择的活动 i 是 E’ 中结束时间最早的,所以活动 i 是正确的
    依次类推所有的选择都是正确的)
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐