第4章 贪心算法
合集下载
第4章 贪心算法
2
【渴婴】
有一个非常渴的、但很聪明的小婴儿。她可能得到的东 西包括:一杯水、一小罐牛奶、多罐其它不同种类的 果汁……。即婴儿可能得到n种不同口味的饮料。
根据以前对这n种饮料的不同体验,这个婴儿知道其中 某种饮料更适合自己的胃口,因此婴儿采用如下方法 为每一种饮料赋予一个满意度值,即Si作为满意度赋 予第i种饮料。 通常,这个婴儿都会尽量饮用具有最大满意度的饮料来 最大限度地满足她解渴地需要,但不幸地是:她最满 意地饮料有时并没有足够地量来满足这个婴儿解渴地 需要。 3
对于一个具体问题,要确定它是否具有贪心选择性质, 必须证明每一步所作的贪心选择最终导致问题的整体最 23 优解。
4.2 贪心算法的基本要素
2、最优子结构性质
当一个问题的最优解包含其子问题的最优 解时,称此问题具有最优子结构性质。问题的 最优子结构性质是该问题可用动态规划算法或
贪心算法求解的关键特征。
20
4.1 活动安排问题
和活动安排问题类似的是“区间相 交问题”。
【区间相交问题】:给定x轴上n个 闭区间。去掉尽可能少的闭区间, 使剩下的闭区间都不相交。 算法:这个问题和“活动安排问题” 类似。每次选取右端点坐标最小的 闭区间,并将与其相交的闭区间删 去!
21
4.2 贪心算法的基本要素
本节着重讨论可以用贪心算法求解的问题 的一般特征。 对于一个具体的问题,怎么知道是否可用 贪心算法解此问题,以及能否得到问题的最 优解呢?这个问题很难给予肯定的回答。 但是,从许多可以用贪心算法求解的问题 中看到这类问题一般具有2个重要的性质: 贪心选择性质和最优子结构性质。
首先证明最优解A的构成: 前k步和剩下活动的最优
解;再根据剩下活动的最
优解和前k步一样,又包
【渴婴】
有一个非常渴的、但很聪明的小婴儿。她可能得到的东 西包括:一杯水、一小罐牛奶、多罐其它不同种类的 果汁……。即婴儿可能得到n种不同口味的饮料。
根据以前对这n种饮料的不同体验,这个婴儿知道其中 某种饮料更适合自己的胃口,因此婴儿采用如下方法 为每一种饮料赋予一个满意度值,即Si作为满意度赋 予第i种饮料。 通常,这个婴儿都会尽量饮用具有最大满意度的饮料来 最大限度地满足她解渴地需要,但不幸地是:她最满 意地饮料有时并没有足够地量来满足这个婴儿解渴地 需要。 3
对于一个具体问题,要确定它是否具有贪心选择性质, 必须证明每一步所作的贪心选择最终导致问题的整体最 23 优解。
4.2 贪心算法的基本要素
2、最优子结构性质
当一个问题的最优解包含其子问题的最优 解时,称此问题具有最优子结构性质。问题的 最优子结构性质是该问题可用动态规划算法或
贪心算法求解的关键特征。
20
4.1 活动安排问题
和活动安排问题类似的是“区间相 交问题”。
【区间相交问题】:给定x轴上n个 闭区间。去掉尽可能少的闭区间, 使剩下的闭区间都不相交。 算法:这个问题和“活动安排问题” 类似。每次选取右端点坐标最小的 闭区间,并将与其相交的闭区间删 去!
21
4.2 贪心算法的基本要素
本节着重讨论可以用贪心算法求解的问题 的一般特征。 对于一个具体的问题,怎么知道是否可用 贪心算法解此问题,以及能否得到问题的最 优解呢?这个问题很难给予肯定的回答。 但是,从许多可以用贪心算法求解的问题 中看到这类问题一般具有2个重要的性质: 贪心选择性质和最优子结构性质。
首先证明最优解A的构成: 前k步和剩下活动的最优
解;再根据剩下活动的最
优解和前k步一样,又包
4-贪心算法
二、TSP问题的贪心算法
min ci
i 1 n
从驻地城市开始,每次选择还没到的最近(费用最少)的城市去.
1 2 7
1 4 4
2 4 1
7 4 1
5 3 2 3
5
3
2
3
1
2
5
3
4
Cost=1+3+2+1+7=14
1
2
5
4
3
Cost=1+3+3+1+2=10
template <class Type> Type GreedyTSP(Type **C,int n,int k,int x[ ]){ //从城市k出发用贪心算法求解TSP问题. //最佳解放在x[ ]里,路程(费用)用函数值返回 x[1]=k; int u=k; Type cost=0; for(int i=2; i<=n;i++){ Type min=; int v=0; for(int j=1; j<=n;j++) if(C[u][j]<min){min= C[u][j]; v=j;} cost+= min;x[i]=v; C[v][u]= ;u=v; } cost+=C[u][k]; return cost; }
§4.5 最小生成树
一、最小生成树
设G=(V,E)是一个无向连通带权图(无向连通网),E中每条 边(v,w)的权为c[v][w]. 如果G的一个子图G’是一棵包含G的所有顶点的树,则称G’为 G的生成树. 生成树上各条边权的总和称为该生成树的耗费,在G的所有 生成树中,耗费最小的生成树称为G的最小生成树.
贪心算法讲义
float p[1..n], w[1..n], x[1..n], M, rc;
integer i, n; x:= 0; // 将解向量初始化为零
//w[1..n],它们元素的排列 //顺序满p[i]/w[i]≥p[i+1]/w[i+1] //M是背包容量,x[1..n]是解向量
rc:= M; // 背包的剩余容量初始化为M
作业调度问题
单机作业调度问题的贪心算法
将上述算法找到的作业集按作业期限升序排列,就产生一 个作业调度。
算法的复杂度分析
J {i}的相容性判断最坏|J|次,|J|最大i-1。所以 T(n)=1+2+…+n-1=O(n2)
例子: 设n=7,
(p1, p2,… ,pn)=(35,30,25,20,15,10,5), (d1, d2,… ,dn)=(4,2,4,3,4,8,3) 算法GreedyJob的执行过程 : 作业 1 ;2, 1; 2, 1, 3; 2, 4, 1, 3; 2, 4, 1, 3 , 6; 期限 4; 2, 4; 2,4, 4; 2, 3, 4, 4; 2, 3, 4, 4, 8;
带期限的单机作业安排问题
已知n项作业 E={1, 2, … ,n}要求使用同台机器完成, 而且每项作业需要的时间都是1。第k项作业要求在时 刻2, d…k之, n前。完成, 而且完成这项作业将获得效益pk,k=1,
作业集E的子集称为相容的如果其中的作业可以被安 排由一台机器完成。
带限期单机作业安排问题就是要在所给的作业集合中 选出总效益值最大的相容子集。
许多NP难组合优化问题,目前仍未找到有效的算法, 贪心策略常用于设计这些问题的近似算法。
贪心算法的基本思想
第4章贪心算法(002)
设A属于E是所给的活动安排问题的一个最优解,且A中活 动也按结束时间非减序排列,A中的第一个活动是活动k。 若k=1,则A就是一个以贪心选择开始的最优解。若k>1,则 设B=A-{k} ∪{1}。由于f1<fk,且A中活动是相容的,故 B 中的活动也是相容的。又由于B中活动个数与A中活动个 数相同,且A是最优的,故B也是最优的。也就是说,B是 以贪心选择活动1开始的最优活动安排。由此可见,总存 在以贪心选择开始的最优活动安排方案。
本章主要知识点: 4.1 活动安排问题 4.2 贪心算法的基本要素 4.3 最优装载 4.4 哈夫曼编码 4.5 单源最短路径 4.6 最小生成树 4.7 多机调度问题 4.8 贪心算法的理论基础
第4章 贪心算法
4.1 活动安排问题
活动安排问题要求高效地安排一系列争用某一公共资 源的活动。贪心算法提供了一个简单、漂亮的方法使 得尽可能多的活动能兼容地使用公共资源。
}
4.1 活动安排问题
由于输入的活动以其完成时间的非减序排列,所以算法 每次总是选择具有最早完成时间的相容活动加入集合A 中。直观上,按这种方法选择相容活动为未安排活动留 下尽可能多的时间。也就是说,该算法的贪心选择的意 义是使剩余的可安排时间段极大化,以便安排尽可能多 的相容活动。
算法greedySelector的效率极高。当输入的活动已按结束 时间的非减序排列,算法只需O(n)的时间安排n个活动 ,使最多的活动能相容地使用公共资源。如果所给出的 活动未按非减序排列,可以用O(nlogn)的时间重排。
4.1 活动安排问题
2. 进一步,在做了贪心选择,即选择了活动1后,原问 题就简化为对E中所有与活动1相容的活动进行活动 安排的子问题。即若A是原问题的最优解,则A’=A{1}是活动安排问题E’={i∈E:si>=f1}的最优解。事实 上,如果能找到E’的一个解B’,它包含比A’更多的 活动,则将活动1加入到B’中将产生E的一个解B,它 包含比A更多的活动。这与A的最优性矛盾。因此, 每一步所做的贪心选择都将问题简化为一个更小的 与原问题具有相同形式的子问题。对贪心选择次数 用数学归纳法即知,贪心算法GreedySelector最终产 生原问题的最优解。
本章主要知识点: 4.1 活动安排问题 4.2 贪心算法的基本要素 4.3 最优装载 4.4 哈夫曼编码 4.5 单源最短路径 4.6 最小生成树 4.7 多机调度问题 4.8 贪心算法的理论基础
第4章 贪心算法
4.1 活动安排问题
活动安排问题要求高效地安排一系列争用某一公共资 源的活动。贪心算法提供了一个简单、漂亮的方法使 得尽可能多的活动能兼容地使用公共资源。
}
4.1 活动安排问题
由于输入的活动以其完成时间的非减序排列,所以算法 每次总是选择具有最早完成时间的相容活动加入集合A 中。直观上,按这种方法选择相容活动为未安排活动留 下尽可能多的时间。也就是说,该算法的贪心选择的意 义是使剩余的可安排时间段极大化,以便安排尽可能多 的相容活动。
算法greedySelector的效率极高。当输入的活动已按结束 时间的非减序排列,算法只需O(n)的时间安排n个活动 ,使最多的活动能相容地使用公共资源。如果所给出的 活动未按非减序排列,可以用O(nlogn)的时间重排。
4.1 活动安排问题
2. 进一步,在做了贪心选择,即选择了活动1后,原问 题就简化为对E中所有与活动1相容的活动进行活动 安排的子问题。即若A是原问题的最优解,则A’=A{1}是活动安排问题E’={i∈E:si>=f1}的最优解。事实 上,如果能找到E’的一个解B’,它包含比A’更多的 活动,则将活动1加入到B’中将产生E的一个解B,它 包含比A更多的活动。这与A的最优性矛盾。因此, 每一步所做的贪心选择都将问题简化为一个更小的 与原问题具有相同形式的子问题。对贪心选择次数 用数学归纳法即知,贪心算法GreedySelector最终产 生原问题的最优解。
第4章_贪心算法_Second_Part_
编码的前缀性质可以使译码方法非常简单。 表示最优前缀码的二叉树总是一棵完全二叉树,即树 中任一结点都有2个儿子结点。 平均码长定义为: B(T ) f (c)d T (c)
cC
使平均码长达到最小的前缀码编码方案称为给定编码 字符集C的最优前缀码。
4.4 哈夫曼编码
2、构造哈夫曼编码
哈夫曼提出构造最优前缀码的贪心算法,由此产生的 编码方案称为哈夫曼编码。 哈夫曼算法以自底向上的方式构造表示最优前缀码的 二叉树T。 算法以|C|个叶结点开始,执行|C|-1次的“合并” 运算后产生最终所要求的树T。
4.6 最小生成树
1、最小生成树性质 用贪心算法设计策略可以设计出构造最小生成树 的有效算法。本节介绍的构造最小生成树的Prim算法 和Kruskal算法都可以看作是应用贪心算法设计策略的 例子。尽管这2个算法做贪心选择的方式不同,它们都 利用了下面的最小生成树性质: 设G=(V,E)是连通带权图,U是V的真子集。如果 (u,v)E,且uU,vV-U,且在所有这样的边中, (u,v)的权c[u][v]最小,那么一定存在G的一棵最小生 成树,它以(u,v)为其中一条边。这个性质有时也称为 MST性质。 证明MST性质。P125
4.6 最小生成树
利用最小生成树性质 和数学归纳法容易证明, 上述算法中的边集合T始终 包含G的某棵最小生成树中 的边。因此,在算法结束 时,T中的所有边构成G的 一棵最小生成树。 例如,对于右图中的 带权图,按Prim算法选取 边的过程如下页图所示。
4.6 最小生成树
4.6 最小生成树
在上述Prim算法中,还应当考虑如何有效地找出满 足条件iS,jV-S,且权c[i][j]最小的边(i,j)。实现 这个目的的较简单的办法是设置2个数组closest和 lowcost。 在Prim算法执行过程中,先找出V-S中使lowcost值 最小的顶点j,然后根据数组closest选取边 (j,closest[j]),最后将j添加到S中,并对closest和 lowcost作必要的修改。 用这个办法实现的Prim算法所需的计算时间为O(n 2 )
cC
使平均码长达到最小的前缀码编码方案称为给定编码 字符集C的最优前缀码。
4.4 哈夫曼编码
2、构造哈夫曼编码
哈夫曼提出构造最优前缀码的贪心算法,由此产生的 编码方案称为哈夫曼编码。 哈夫曼算法以自底向上的方式构造表示最优前缀码的 二叉树T。 算法以|C|个叶结点开始,执行|C|-1次的“合并” 运算后产生最终所要求的树T。
4.6 最小生成树
1、最小生成树性质 用贪心算法设计策略可以设计出构造最小生成树 的有效算法。本节介绍的构造最小生成树的Prim算法 和Kruskal算法都可以看作是应用贪心算法设计策略的 例子。尽管这2个算法做贪心选择的方式不同,它们都 利用了下面的最小生成树性质: 设G=(V,E)是连通带权图,U是V的真子集。如果 (u,v)E,且uU,vV-U,且在所有这样的边中, (u,v)的权c[u][v]最小,那么一定存在G的一棵最小生 成树,它以(u,v)为其中一条边。这个性质有时也称为 MST性质。 证明MST性质。P125
4.6 最小生成树
利用最小生成树性质 和数学归纳法容易证明, 上述算法中的边集合T始终 包含G的某棵最小生成树中 的边。因此,在算法结束 时,T中的所有边构成G的 一棵最小生成树。 例如,对于右图中的 带权图,按Prim算法选取 边的过程如下页图所示。
4.6 最小生成树
4.6 最小生成树
在上述Prim算法中,还应当考虑如何有效地找出满 足条件iS,jV-S,且权c[i][j]最小的边(i,j)。实现 这个目的的较简单的办法是设置2个数组closest和 lowcost。 在Prim算法执行过程中,先找出V-S中使lowcost值 最小的顶点j,然后根据数组closest选取边 (j,closest[j]),最后将j添加到S中,并对closest和 lowcost作必要的修改。 用这个办法实现的Prim算法所需的计算时间为O(n 2 )
贪心算法-ppt
[算法缺点]需证明是最优解.
[适用问题] 具备贪心选择和最优子结构性质的最优化问题 贪心选择性质:整体的最优解可通过一系列局部最优解达到,即 贪心选择到达。
贪心算法通常以自顶向下的方式进行,以迭代的方式作出相
继的贪心选择,每做一次贪心选择就将所求解的问题化简为规模 更小的问题 对于一个具体问题,要确定它是否具有贪心选择的性质,我 们必须证明每一步所作的贪心选择最终导致问题的最优解。通常 可以首先证明问题的一个整体最优解,是从 贪心选择开始的,而 且作了贪心选择后,原问题简化为一个规模更小的类似子问题。 然后,用数学归纳法证明,通过每一步作贪心选择,最终可得到 问题的一个整体 最优解。 最优子结构性质:当一个问题的最优解包含其子问题的最优解时
算法设计与分析 > 贪心算法
4-4 背包问题 (Knapsack Problem) [问题描述]设有n个物体和一个背包,物体i的重量为wi ,价值 为vi ,背包的容量为C.若将物体i的xi部分(1in, 0xi1)装 入背包,则具有价值为vi xi. 目标是找到一个方案,使放入背 包的物体总价值最高.
算法设计与分析 > 贪心算法
贪心方法的数据选择策略(2)
2、若以容量作为量度,可让背包容量尽可能慢地 被消耗。这就要求按物品重量的非降次序来把物品放入 背包,即(w3,w2,w1)=(10,15,18)。 先装入物品3, x3=1, p3x3 =15,再装入重量为10的 物品2, ∑vixi =15+24*10/15=31。 由刚才的方法可得这种情况下的总效益值为31,仍 是一个次优解,原因是容量在漫漫消耗的过程中,效益 值却没有迅速的增加。
算法设计与分析 > 贪心算法
[例] n=3,c=20 (v1,v2,v3)=(25,24,15),(w1,w2,w3)=(18,15,10) {x1,x2,x3}{1,2/15,0}{ 0,2/3,1}{0,1,1/2} {...}
《计算机算法设计与分析》PPT第四章贪心算法资料
11
假设活动已按结束时间的单调非递减顺序排序 f0≤f1≤f2≤… ≤fn<fn+1
则,当i≥j时, Sij=φ。
假设存在一活动ak∈Sij,其中i≥j,则在已排的序列中 ai在aj后面。
因fi≤sk<fk≤sj<fj ,与在已排的序列中ai在aj后面的 假设相矛盾。
所以,设活动按结束时间的单调非递减顺序排序,子 问题空间被用来从sij中选择最大相容活动子集,其中 0≤i<j≤n+1,而且所有其它的sij是空的。
14
步骤2:递归地定义最优解的值 设c[i, j]为Sij中最大相容子集中的活动数。当 Sij=φ时,c[i, j] = 0。对于一个非空子集Sij, 如果ak在Sij的最大相容子集中被使用,则子问 题Sik和Skj的最大相容子集也被使用。从而:
c[i, j] = c[i, k] + c[k, j] + 1
活动安排问题:要在所给的活动集合中选出最大 的相容活动子集合。
10
用动态规划方法求解
步骤1:分析最优解的结构特征 构造子问题空间 Sij={ ak∈S: fi≤sk<fk≤sj} Sij是S中活动的子集,其中每个活动都在活动ai 结束之后开始,且在活动aj开始之前结束。 Sij包含了所有与ai和aj相容的活动,并且与不迟 于ai结束和不早于aj开始的活动相容。此外, 虚构活动a0和an+1,其中f0=0, Sn+1=∞。原 问题即为寻找S0,n+1中最大相容活动子集。
(5)约束函数constraint:检查解集合中加入一 个候选对象是否满足约束条件。例如,在找零钱 问题中,约束函数是每一步选择的货币和已付出 的货币相加不超过应找零钱。
7
贪心算法的一般框架
假设活动已按结束时间的单调非递减顺序排序 f0≤f1≤f2≤… ≤fn<fn+1
则,当i≥j时, Sij=φ。
假设存在一活动ak∈Sij,其中i≥j,则在已排的序列中 ai在aj后面。
因fi≤sk<fk≤sj<fj ,与在已排的序列中ai在aj后面的 假设相矛盾。
所以,设活动按结束时间的单调非递减顺序排序,子 问题空间被用来从sij中选择最大相容活动子集,其中 0≤i<j≤n+1,而且所有其它的sij是空的。
14
步骤2:递归地定义最优解的值 设c[i, j]为Sij中最大相容子集中的活动数。当 Sij=φ时,c[i, j] = 0。对于一个非空子集Sij, 如果ak在Sij的最大相容子集中被使用,则子问 题Sik和Skj的最大相容子集也被使用。从而:
c[i, j] = c[i, k] + c[k, j] + 1
活动安排问题:要在所给的活动集合中选出最大 的相容活动子集合。
10
用动态规划方法求解
步骤1:分析最优解的结构特征 构造子问题空间 Sij={ ak∈S: fi≤sk<fk≤sj} Sij是S中活动的子集,其中每个活动都在活动ai 结束之后开始,且在活动aj开始之前结束。 Sij包含了所有与ai和aj相容的活动,并且与不迟 于ai结束和不早于aj开始的活动相容。此外, 虚构活动a0和an+1,其中f0=0, Sn+1=∞。原 问题即为寻找S0,n+1中最大相容活动子集。
(5)约束函数constraint:检查解集合中加入一 个候选对象是否满足约束条件。例如,在找零钱 问题中,约束函数是每一步选择的货币和已付出 的货币相加不超过应找零钱。
7
贪心算法的一般框架
第四章 贪心算法1
定义2(greedy选择性质)
若一个优化问题的全局优化解可通过局部优化 选择得到,则该问题称为具有greedy选择性质。
6
Greedy算法正确性证明方法
• 证明算法所求解的问题具有优化子结构性质 • 证明算法所求解的问题具有Greedy选择性 • 说明算法确实按照Greedy选择性进行局部 优化选择的
8
二、活动安排问题 (An activity-selection problem)
<1>问题的定义
活动安排问题是可以用贪心算法有效求解的一 个很好的例子。 •活动 设有n个活动的集合E={1,2,…,n},其中每个 活动都要求使用同一资源,如演讲会场等,而在 同一时间内只允许一个活动使用这一资源。每个 活动i都有一个要求使用该资源的起始时间si和一 个结束时间fi,且si < fi。如果选择了活动i,则它 在半开的时间区间(si,fi]内占用资源。
22
问题定义
给定编码字符集C及其概率分布f,即C中任意字符c以 概率f(c)在数据文件中出现。C的一个前缀编码方案对应 一棵二叉树T。字符c在树T中的深度记为dT(c)。dT(c)也 是字符c的前缀码长。该编码方案的平均码长定义为:
B(T) f(c) dT (c )。
cC
目标:
求出使平均码长最小的前缀编码方案――哈夫曼编码。
19
算法:
Template <class Type> void Loading(int x[ ], Type w[ ], Type c, int n) { int *t= new int[n+1]; Sort(w, t, n); //数组元素t[i] 存放重量第i轻的集装箱号。 for ( int i=1;i<=n; i++) x[i]=0; // 数组元素x[i]=0表示不装入集装箱i。 for ( int i=1; i<=n &&w[t[i]]<= c; i++) {x[t[i]] =1; c- = w[t[i]]; } }
第4章 贪心算法1
◎Software College, NEU 3
什么是贪心方法
• 上面的找币算法是: 首先选出1个不超过5角3分的面值最大 的钱币,即2角; 然后从5角3分中减去2角,剩下3角3分; 再选出1个不超过3角3分的面值最大的 钱币,即又一个2角,如此一直做下去。 • 这个找钱币的算法就是贪心方法。
◎Software College, NEU 4
◎Software College, NEU 20
4.1活动安排问题
• 作了贪心选择后,原问题简化为对E中所有与活动 1相容的活动进行活动安排的子问题。即若A是原 问题的一个最优解,则A’= A - {1} 是活动安排 问题 E’={i E: si ≥ f1}的一个最优解。 • 事实上,如果我们能找到E’的一个解B’,它包含 比A’活动更多的活动,则将活动1加入到B’中将产 生E的一个解B,它包含比A更多的活动,这与A的 最优性矛盾。 • 因此,每一步所作的贪心选择都将问题简化为一 个更小的与原问题具有相同形式的子问题。
什么是贪心方法
• 对于一个问题把满足条件的任何一组解称 为可行解。 • 如上面找钱币问题:拿出1个2角,3个1角 和3个1分;五个1角和3个1分;10个五分和 3个1分等等都是可行解。 • 使目标取极值(极大或极小)的可行解, 称为最优解。 • 如上面找钱币问题:拿出2个2角,1个1角 和3个1分的可行解就是最优解。
◎Software College, NEU 22
4.2 贪心算法的基本要素 贪心算法的基本要素
贪心方法描述
• 根据问题选取一种量度标准。
• 按量度标ቤተ መጻሕፍቲ ባይዱ对n个输入排序, 设为:A ' (1), A ' (2), ……, A ' (n) 。 按序输入。 • 假设在输入A ' (1), A ' (2), ……, A ' (j)后已选择
什么是贪心方法
• 上面的找币算法是: 首先选出1个不超过5角3分的面值最大 的钱币,即2角; 然后从5角3分中减去2角,剩下3角3分; 再选出1个不超过3角3分的面值最大的 钱币,即又一个2角,如此一直做下去。 • 这个找钱币的算法就是贪心方法。
◎Software College, NEU 4
◎Software College, NEU 20
4.1活动安排问题
• 作了贪心选择后,原问题简化为对E中所有与活动 1相容的活动进行活动安排的子问题。即若A是原 问题的一个最优解,则A’= A - {1} 是活动安排 问题 E’={i E: si ≥ f1}的一个最优解。 • 事实上,如果我们能找到E’的一个解B’,它包含 比A’活动更多的活动,则将活动1加入到B’中将产 生E的一个解B,它包含比A更多的活动,这与A的 最优性矛盾。 • 因此,每一步所作的贪心选择都将问题简化为一 个更小的与原问题具有相同形式的子问题。
什么是贪心方法
• 对于一个问题把满足条件的任何一组解称 为可行解。 • 如上面找钱币问题:拿出1个2角,3个1角 和3个1分;五个1角和3个1分;10个五分和 3个1分等等都是可行解。 • 使目标取极值(极大或极小)的可行解, 称为最优解。 • 如上面找钱币问题:拿出2个2角,1个1角 和3个1分的可行解就是最优解。
◎Software College, NEU 22
4.2 贪心算法的基本要素 贪心算法的基本要素
贪心方法描述
• 根据问题选取一种量度标准。
• 按量度标ቤተ መጻሕፍቲ ባይዱ对n个输入排序, 设为:A ' (1), A ' (2), ……, A ' (n) 。 按序输入。 • 假设在输入A ' (1), A ' (2), ……, A ' (j)后已选择
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
提 纲 第4章 贪心算法
应用背景和动机 贪心算法的基本思想 背包问题 最小生成树 单源最短路径 哈夫曼编码
应用背景和动机
最优化问题
—— 优化问题和贪心算法
找钱币的贪心算法
例子:有面值为5元、2元、1元、5角、2角、1角的货币,需要找给顾 客4元6角现金 目标:找出的货币的数量最少 贪心算法: 多步决策:根据总额,每步确定不超过总额的最大面额货币数(贪
多步决策:每步选择一项活动加入A
(3)把活动按照截止时间从小到大排序,使得f1≤f2≤…≤fn, 然后从前向后挑选,只要与前面选的活动相容,就可以把这项活 动选入A。
贪心选择策略: (1)把活动按照开始时间从小到大排序,使得s1≤s2≤…≤sn, 然后从前向后挑选,只要与前面选的活动相容,就可以把这项活 动选入A。 (2)计算每个活动的占用时间,即fi-si,然后,按照占用时间从 小到大对活动排序,使得f1-s1≤f2-s2≤…≤fn-sn,然后从前向后挑 选,只要与前面选的活动相容,就可以把这项活动选入A。
心选择:最快地满足支付要求,其目的是使付出的货币张数最慢地增加),
做出一组选择以达到一个最优解,而不仅仅是一个解
贪心算法
贪心算法通常应用于最优化问题,目标也是获得一个最优解 (不是总能如愿)
总额中减去已找面额获得新的总额(子问题);重复上述过程直到剩 余总额为0。 选择: •选出2元*2,余6角 •选出5角,余1角 •选出1角,余0 •总共付出4张货币
例:
i s[i] f[i] 1 1 4 2 3 5 3 0 6 4 5 7 5 3 8 6 5 9 7 6 10 8 8 11 9 8 12 10 2 13 11 12 14
最优解:A={1, 4, 8, 11} 总共可安排的最大活动数是4个。 最优解不唯一:A={2, 4, 8, 11}
2
定理: 该算法执行到第k步,选择k项活动i1=1, i2,…, ik,那么存 在最优解A包含i1=1, i2,…, ik 证明:将S中的活动按截止时间递增顺ห้องสมุดไป่ตู้排列,1, 2, … , n 归纳基础:k=1时,算法选择活动1。证明:存在一个最优解包 含了活动1,设A={i1, i2,…, ij}是一个最优解,如果i1≠1,那么用 1替换i1,得到A′,即
目标函数:
maximize
1 i n
约束:
i i 1 i n
vx
wx C
i i
3
• 例子:n=3, C=20, (v1,v2,v3)=(25,24,15), (w1,w2,w3)=(18,15,10) 至少有三种看似合理的贪心策略: (1)选择价值最大的物品 (2)选择重量最轻的物品 (3)选择单位重量价值最大的物品
• 问题的最优解包含其子问题的最优解 • 在原问题中做了一个贪心选择而得到一个子问题, 证明:子问题最优解=原问题的最优解-贪心选择
证明贪心算法的正确性(针对最优化问题的求解):
- 证明每一步所作的贪心选择最终导致问题的整体最优解 - 数学归纳法
结论:贪心算法的过程一般是通过一系列的贪心选择,逐渐构造
整体最优解是3张货币:1个3元和2个8角:
P1 P2 P3
20 18 15
10 11 14
3 6 5
结论:贪心算法能获得可行解,但不一定是最优解!
完成时间: 18 + 11 + 6 = 35 这个解不错,不过可能有更好的解
1
• 最优解 • 如果贪心策略采用最短处理时间作业优先 P1 P2 P3 3 5 6 10 11 14 15 18 20 P1 P2 P3
算法:
• 按照vi/wi进行非升序排序
for(int i=0;i<n;i++) d[i]v[i]/w[i]; mergeSort(d);
• 初始化
(x1, x2, x3) (1) (1, 2/15, 0) (2) (0, 2/3, 1) (3) (0, 1, 1/2) 贪心选择:
∑wixi 20 20 20
贪心算法如何工作
• 多阶段决策,做出一序列选择以获得一个最优解 • 每步选择都以局部最优(贪心选择)的方式来做出,希望通过 多步的局部最优选择,达到最终的全局最优
得到的是整体最优解!!
多机调度问题
例子:如果某一货币系统中,面值改为3元、1元、8角、5角、1角, 同样需要找给顾客4元6角 • 有9个作业需要在处理机上运行,其运行时间分别是:3, 5, 6, 10, 11, 14, 15, 18, 20 • 有3台处理机可运行作业,目标:用最短时间处理完所有作业 贪心算法: 找给顾客的是1个3元、1个1元、1个5角和1个1角共4张货币 • 多机调度问题是NP难问题,到目前为止还没有有效的解法。 • 贪心选择是最长处理时间作业优先,即把处理时间最长的作业分配 给最先空闲的机器。
A ( A {i1 }) {1}
那么A′和A的活动个数相等,且活动1比i1结束的更早,因 此和i2,…, ij等活动相容,于是A′也是问题的一个最优解。
A {i1 1, i 2 ,..., i k } B {i1 1, i 2 ,..., i k , i k 1 } ( B {i k 1 })
贪心算法的关键:贪心选择标准 贪心算法的困难:对于最优化问题,算法是否求解了所要解决的问题 (证明问题的贪心算法是正确的)
最小生成树——问题的提出
• 穷举搜索
应用背景和动机:
若图G的顶点表示城市,边(v,w)的权表示城市v和w之间通信线路所 需的费用,如何建立代价费用最低的通信网络?
寻找所有可能的边的子集,直到找到最小生成树 考虑时间
贪心选择
时间复杂度
G=(V, E), |V|=n, O(n2)
怎样实现算法?
算法:
输入:G=(V,E); 输出:TE: MST 1.按照非降序权重将E中的边排序 2.for 每条边vV do 3. makeSet(v); 4.end for 5.TE={} 6.while |TE|<n-1 do 7. 令(x,y)为E中下一条边 8. if find(x)find(y) then 9. 将(x,y)加入TE 10. end if 11.end while
C 4 A 2 B 3 E 5 F 6 G 1 D F 6 G C 4 A 2 B 3 E 5 1 D F 6 G C 4 A 2 B 3 E 5 1 D
基本思想
1. 初始化:V中每个顶点自成一个连通分量。 TE={ } 2. 循环直到图中的连通分量个数为1 2.1 在E中寻找最短边(u,v); 2.2 如果顶点u、v位于图中的两个不同连通分量,则 2.2.1 将边(u,v)并入TE; 2.2.2 将这两个连通分量合为一个; 2.3 E=E-{(u,v)};
∑vixi 28.2 31 31.5
价值最大 ! 重量最轻 ! 单位重量价值最大
for (i=0;i<n;i++) x[i]0;
• 背包问题用贪心算法 能够得到最优解 • 主要计算时间 单位重量价值的排序: O(nlogn)
• 贪心选择
for (i=0;i<n;i++) { if (d[i].w>c) break; x[i]1; optopt+v[i]; cc-w[i]; } if (i<n){ x[i]c/w[i]; opt+=x[i]*v[i]; }
在少量的计算基础上做出猜想而不急于考虑以后的情况
提 纲
应用背景和动机 贪心算法的基本思想 背包问题 最小生成树 单源最短路径 哈夫曼编码
0-1背包:第k阶段的决策用到前面1~k-1阶段决策的结果 • 背包: 自顶向下每一步都扩大解的规模 0-1背包:自底向上计算最优值 结论:
贪心选择 算法:
T= S={1} while(S!=V){ (i,j)=iS且jV-S的c[i,j]最小的边 T=T{(i,j)} S=S{j} }
A 4 C F 5
2 D
B 6
3 G
E 7
C 4 A 2 B 3 E 5 F 6 D 7 G
Kruskal 算法
• 接上页 • 根据边构造最小生成树
出最优解!!
提 纲
应用背景和动机 贪心算法的基本思想 背包问题 最小生成树 单源最短路径 哈夫曼编码
背包问题
背包问题
- 背包容量为 C - n 种物品,重量分别是 {w1, …, wi, …, wn} - 物品的总重量大于 C -求一个n元量{x1, x2, …, xn} (0≤xi≤1)(可以部分装入) - 问题:使得装入背包中物品的总价值最大
20+14=34 这个解明显是最优解 完成时间: 6 + 14 + 20 = 40 这个贪心策略的结果不好 贪心算法足够快,每次决策仅仅需要挑出最大或最小的作业 最优解不唯一 怎样获得最优解 • 尝试所有可能安排 • 不幸的是,这是指数时间
20 18 15 10 11
14 5 6 3
n 1 - G=(V, E), |V|=n, |E|=m,包含n-1条边的子集数 Cm
问题:
对连通网来说,最小生成树( Minimum Spanning Tree ,MST)是 它的一个极小连通子图: - 包含所有顶点 - 包含n-1条边 - 连通 - 边的权值相加最小
- 找到一个子集,是否连接了所有顶点,计算总的权值 - 指数阶
归纳步骤:假设对于任意正整数k,命题正确。令i1=1, i2,…, ik是算法前k步顺序选
择的活动,那么存在一个最优解 A={i1=1, i2,…, ik}∪B 如果令S′是S中剩下的与i1=1, i2,…, ik相容的活动,即
S { j | s j f ik , j S }
应用背景和动机 贪心算法的基本思想 背包问题 最小生成树 单源最短路径 哈夫曼编码
应用背景和动机
最优化问题
—— 优化问题和贪心算法
找钱币的贪心算法
例子:有面值为5元、2元、1元、5角、2角、1角的货币,需要找给顾 客4元6角现金 目标:找出的货币的数量最少 贪心算法: 多步决策:根据总额,每步确定不超过总额的最大面额货币数(贪
多步决策:每步选择一项活动加入A
(3)把活动按照截止时间从小到大排序,使得f1≤f2≤…≤fn, 然后从前向后挑选,只要与前面选的活动相容,就可以把这项活 动选入A。
贪心选择策略: (1)把活动按照开始时间从小到大排序,使得s1≤s2≤…≤sn, 然后从前向后挑选,只要与前面选的活动相容,就可以把这项活 动选入A。 (2)计算每个活动的占用时间,即fi-si,然后,按照占用时间从 小到大对活动排序,使得f1-s1≤f2-s2≤…≤fn-sn,然后从前向后挑 选,只要与前面选的活动相容,就可以把这项活动选入A。
心选择:最快地满足支付要求,其目的是使付出的货币张数最慢地增加),
做出一组选择以达到一个最优解,而不仅仅是一个解
贪心算法
贪心算法通常应用于最优化问题,目标也是获得一个最优解 (不是总能如愿)
总额中减去已找面额获得新的总额(子问题);重复上述过程直到剩 余总额为0。 选择: •选出2元*2,余6角 •选出5角,余1角 •选出1角,余0 •总共付出4张货币
例:
i s[i] f[i] 1 1 4 2 3 5 3 0 6 4 5 7 5 3 8 6 5 9 7 6 10 8 8 11 9 8 12 10 2 13 11 12 14
最优解:A={1, 4, 8, 11} 总共可安排的最大活动数是4个。 最优解不唯一:A={2, 4, 8, 11}
2
定理: 该算法执行到第k步,选择k项活动i1=1, i2,…, ik,那么存 在最优解A包含i1=1, i2,…, ik 证明:将S中的活动按截止时间递增顺ห้องสมุดไป่ตู้排列,1, 2, … , n 归纳基础:k=1时,算法选择活动1。证明:存在一个最优解包 含了活动1,设A={i1, i2,…, ij}是一个最优解,如果i1≠1,那么用 1替换i1,得到A′,即
目标函数:
maximize
1 i n
约束:
i i 1 i n
vx
wx C
i i
3
• 例子:n=3, C=20, (v1,v2,v3)=(25,24,15), (w1,w2,w3)=(18,15,10) 至少有三种看似合理的贪心策略: (1)选择价值最大的物品 (2)选择重量最轻的物品 (3)选择单位重量价值最大的物品
• 问题的最优解包含其子问题的最优解 • 在原问题中做了一个贪心选择而得到一个子问题, 证明:子问题最优解=原问题的最优解-贪心选择
证明贪心算法的正确性(针对最优化问题的求解):
- 证明每一步所作的贪心选择最终导致问题的整体最优解 - 数学归纳法
结论:贪心算法的过程一般是通过一系列的贪心选择,逐渐构造
整体最优解是3张货币:1个3元和2个8角:
P1 P2 P3
20 18 15
10 11 14
3 6 5
结论:贪心算法能获得可行解,但不一定是最优解!
完成时间: 18 + 11 + 6 = 35 这个解不错,不过可能有更好的解
1
• 最优解 • 如果贪心策略采用最短处理时间作业优先 P1 P2 P3 3 5 6 10 11 14 15 18 20 P1 P2 P3
算法:
• 按照vi/wi进行非升序排序
for(int i=0;i<n;i++) d[i]v[i]/w[i]; mergeSort(d);
• 初始化
(x1, x2, x3) (1) (1, 2/15, 0) (2) (0, 2/3, 1) (3) (0, 1, 1/2) 贪心选择:
∑wixi 20 20 20
贪心算法如何工作
• 多阶段决策,做出一序列选择以获得一个最优解 • 每步选择都以局部最优(贪心选择)的方式来做出,希望通过 多步的局部最优选择,达到最终的全局最优
得到的是整体最优解!!
多机调度问题
例子:如果某一货币系统中,面值改为3元、1元、8角、5角、1角, 同样需要找给顾客4元6角 • 有9个作业需要在处理机上运行,其运行时间分别是:3, 5, 6, 10, 11, 14, 15, 18, 20 • 有3台处理机可运行作业,目标:用最短时间处理完所有作业 贪心算法: 找给顾客的是1个3元、1个1元、1个5角和1个1角共4张货币 • 多机调度问题是NP难问题,到目前为止还没有有效的解法。 • 贪心选择是最长处理时间作业优先,即把处理时间最长的作业分配 给最先空闲的机器。
A ( A {i1 }) {1}
那么A′和A的活动个数相等,且活动1比i1结束的更早,因 此和i2,…, ij等活动相容,于是A′也是问题的一个最优解。
A {i1 1, i 2 ,..., i k } B {i1 1, i 2 ,..., i k , i k 1 } ( B {i k 1 })
贪心算法的关键:贪心选择标准 贪心算法的困难:对于最优化问题,算法是否求解了所要解决的问题 (证明问题的贪心算法是正确的)
最小生成树——问题的提出
• 穷举搜索
应用背景和动机:
若图G的顶点表示城市,边(v,w)的权表示城市v和w之间通信线路所 需的费用,如何建立代价费用最低的通信网络?
寻找所有可能的边的子集,直到找到最小生成树 考虑时间
贪心选择
时间复杂度
G=(V, E), |V|=n, O(n2)
怎样实现算法?
算法:
输入:G=(V,E); 输出:TE: MST 1.按照非降序权重将E中的边排序 2.for 每条边vV do 3. makeSet(v); 4.end for 5.TE={} 6.while |TE|<n-1 do 7. 令(x,y)为E中下一条边 8. if find(x)find(y) then 9. 将(x,y)加入TE 10. end if 11.end while
C 4 A 2 B 3 E 5 F 6 G 1 D F 6 G C 4 A 2 B 3 E 5 1 D F 6 G C 4 A 2 B 3 E 5 1 D
基本思想
1. 初始化:V中每个顶点自成一个连通分量。 TE={ } 2. 循环直到图中的连通分量个数为1 2.1 在E中寻找最短边(u,v); 2.2 如果顶点u、v位于图中的两个不同连通分量,则 2.2.1 将边(u,v)并入TE; 2.2.2 将这两个连通分量合为一个; 2.3 E=E-{(u,v)};
∑vixi 28.2 31 31.5
价值最大 ! 重量最轻 ! 单位重量价值最大
for (i=0;i<n;i++) x[i]0;
• 背包问题用贪心算法 能够得到最优解 • 主要计算时间 单位重量价值的排序: O(nlogn)
• 贪心选择
for (i=0;i<n;i++) { if (d[i].w>c) break; x[i]1; optopt+v[i]; cc-w[i]; } if (i<n){ x[i]c/w[i]; opt+=x[i]*v[i]; }
在少量的计算基础上做出猜想而不急于考虑以后的情况
提 纲
应用背景和动机 贪心算法的基本思想 背包问题 最小生成树 单源最短路径 哈夫曼编码
0-1背包:第k阶段的决策用到前面1~k-1阶段决策的结果 • 背包: 自顶向下每一步都扩大解的规模 0-1背包:自底向上计算最优值 结论:
贪心选择 算法:
T= S={1} while(S!=V){ (i,j)=iS且jV-S的c[i,j]最小的边 T=T{(i,j)} S=S{j} }
A 4 C F 5
2 D
B 6
3 G
E 7
C 4 A 2 B 3 E 5 F 6 D 7 G
Kruskal 算法
• 接上页 • 根据边构造最小生成树
出最优解!!
提 纲
应用背景和动机 贪心算法的基本思想 背包问题 最小生成树 单源最短路径 哈夫曼编码
背包问题
背包问题
- 背包容量为 C - n 种物品,重量分别是 {w1, …, wi, …, wn} - 物品的总重量大于 C -求一个n元量{x1, x2, …, xn} (0≤xi≤1)(可以部分装入) - 问题:使得装入背包中物品的总价值最大
20+14=34 这个解明显是最优解 完成时间: 6 + 14 + 20 = 40 这个贪心策略的结果不好 贪心算法足够快,每次决策仅仅需要挑出最大或最小的作业 最优解不唯一 怎样获得最优解 • 尝试所有可能安排 • 不幸的是,这是指数时间
20 18 15 10 11
14 5 6 3
n 1 - G=(V, E), |V|=n, |E|=m,包含n-1条边的子集数 Cm
问题:
对连通网来说,最小生成树( Minimum Spanning Tree ,MST)是 它的一个极小连通子图: - 包含所有顶点 - 包含n-1条边 - 连通 - 边的权值相加最小
- 找到一个子集,是否连接了所有顶点,计算总的权值 - 指数阶
归纳步骤:假设对于任意正整数k,命题正确。令i1=1, i2,…, ik是算法前k步顺序选
择的活动,那么存在一个最优解 A={i1=1, i2,…, ik}∪B 如果令S′是S中剩下的与i1=1, i2,…, ik相容的活动,即
S { j | s j f ik , j S }