贪心算法 ppt
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最大相容活动子集(1, 4, 8, 11), 也可表示为等长n元数组:(1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1)
算法设计与分析 > 贪心算法
活动安排问题贪心算法 template< class Type > void GreedySelector(int n, Type s[ ], Type f[ ], bool A[] ) { A[ 1 ] = true; int j = 1; 各活动的起始时间和结 //从第二个活动开始检查是否与前一个相容 束时间存储于数组s和f for (int i=2;i< =n;i+ +) { 中且按结束时间的非减 序排列 if (s[i]>=f[j]) { A[i] = true; j=i;} else A[ i] = false;} }
4.1 基本思想
将问题的求解过程看作是一系列选择,每次选择一个 输入,每次选择都是当前状态下的最好选择(局部最优解 ).每作一次选择后,所求问题会简化为一个规模更小的子 问题.从而通过每一步的最优解逐步达到整体的最优解。
[常见应用]背包问题,最小生成树,最短路径,作业调度等等 [算法优点]求解速度快,时间复杂性有较低的阶.
,称此问题具有最优子结构性质。
算法设计与分析 > 贪心算法
某一问题的n个输入
A(1)
是A的一 个子集
A(2)
满足一定 的条件
…
A(n1)
约束条件
A(n)
B1(1) B1(2)
…
B1(m)
…
Bk(1) Bk(2)
…
Bk(m)
取极值
该问题的一种解(可 行解)
最优解
目标函数
算法设计与分析 > 贪心算法
i 1
[算法思路] 将装船过程划为多步选择,每步装一个货箱,每次从 剩下的货箱中选择重量最轻的货箱.如此下去直到所有货箱均装上 船或船上不能再容纳其他任何一个货箱。 [例]
设n=8,[w1,…w8]=[100, 200, 50, 90, 150, 50, 20, 80],c=400。 所考察货箱的次序为 :7, 3, 6, 8, 4, 1, 5, 2。货箱7, 3, 6, 8, 4, 1的
算法greedySelector 的计算过程如左图所示。 图中每行相应于算法的 一次迭代。阴影长条表 示的活动是已选入集合 A的活动,而空白长条 表示的活动是当前正在 检查相容性的活动。
由于输入的活动以其完成时间的非减序排列,所以 算法greedySelector每次总是选择具有最早完成时间的 相容活动加入集合A中。直观上,按这种方法选择相容活 动为未安排活动留下尽可能多的时间。也就是说,该算法 的贪心选择的意义是使剩余的可安排时间段极大化,以便 安排尽可能多的相容活动。 算法greedySelector的效率极高。当输入的活动已 按结束时间的非减序排列,算法只需O(n)的时间安排n个 活动,使最多的活动能相容地使用公共资源。如果所给出 的活动未按非减序排列,可以用O(nlogn)的时间重排。
[算法缺点]需证明是最优解.
[适用问题] 具备贪心选择和最优子结构性质的最优化问题 贪心选择性质:整体的最优解可通过一系列局部最优解达到,即 贪心选择到达。
贪心算法通常以自顶向下的方式进行,以迭代的方式作出相
继的贪心选择,每做一次贪心选择就将所求解的问题化简为规模 更小的问题 对于一个具体问题,要确定它是否具有贪心选择的性质,我 们必须证明每一步所作的贪心选择最终导致问题的最优解。通常 可以首先证明问题的一个整体最优解,是从 贪心选择开始的,而 且作了贪心选择后,原问题简化为一个规模更小的类似子问题。 然后,用数学归纳法证明,通过每一步作贪心选择,最终可得到 问题的一个整体 最优解。 最优子结构性质:当一个问题的最优解包含其子问题的最优解时
{ int *t = new int [n + 1]; Sort(w, t, n) ; //按货箱重量排序/ for (int i = 1; i < = n; i ++) x[i] = 0; for (int i = 1;i<= n && w[t[i]] <= c; i++) { x[t[i]] = 1; c-= w[t[i]]; //调整剩余空间 }
总重量为390个单位且已被装载, 剩下的装载能力为10 ,小于任意
货箱.所以得到解[x1,...x8]=[ 1, 0, 1, 1, 0, 1, 1, 1]
算法设计与分析 > 贪心算法
1、最优装载的贪心算法
template < class Type > void Loading(int x[], Type w[], Type c, int n )
[算法证明] 算法达到最优解. [算法分析] T(n)=O(n) (排序时) T(n)=O(nlogn) (未排序时)
算法设计与分析 > 贪心算法
4.3 最优装载
[问题描述] 输入:(x1,x2,...xn), xi=0,货箱i不装船; xi=1,货箱i装船 n 可行解: 满足约束条件 wi xi ≤c 的输入 i 1 n 优化函数: xi 最优解:使优化函数达到最大值的一种输入.
活动都要求使用同一资源,如演讲会场等,而在同一时间 内只有一个活动能使用这一资源。每个活动i都有一个要求 使用该资源的起始时间si和一个结束时间fi,且si <fi 。如果 选择了活动i,则它在半开时间区间[si, fi)内占用资源。若 区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的。 也就是说,当si≥fj或sj≥fi时,活动i与活动j相容。
[算法思路]将n个活动按结束时间非减序排列,依次考虑活动i, 若i 与已选择的活动相容,则添加此活动到相容活动子集. [例] 设待安排的11个活动起止时间按结束时间的非减序排列 i 1 s[i] 1 f[i]
2 3
3 0
4 5
5 3
6 5
7 6
8 8
9 8
10 11 2 12
4 5
6
7
8
Fra Baidu bibliotek
9 10 11 12 13 14
4.2.活动安排问题 活动安排问题就是要在所给的活动集合中选出最大的 相容活动子集合,是可以用贪心算法有效求解的很好例子。 该问题要求高效地安排一系列争用某一公共资源的活动。 贪心算法提供了一个简单、漂亮的方法使得尽可能多的活 动能兼容地使用公共资源。
[问题陈述]设有n个活动的集合E={1,2,…,n},其中每个