算法设计与分析 第五章 贪心算法

合集下载

算法设计与分析中的贪心算法与回溯法

算法设计与分析中的贪心算法与回溯法

算法设计与分析中的贪心算法与回溯法算法设计与分析领域中,贪心算法和回溯法是两种常用的解题方法。

本文将介绍这两种算法,并比较它们在不同场景下的优势和劣势。

一、贪心算法贪心算法是一种在每一步都选择当前最优解的策略,希望通过局部最优解的选择最终达到全局最优解。

贪心算法的实现较为简单,时间复杂度较低,适用于解决一些最优化问题。

贪心算法的基本思想是每次都选择当前状态下的最优解,并将其加入到解集中。

例如,在求解最小生成树的问题中,贪心算法会选择当前具有最小权值的边,并将其添加到最终结果中,直到生成树完成。

然而,贪心算法的局限性在于它只考虑了当前的最优解,无法保证找到全局最优解。

在某些问题中,贪心算法可能会陷入局部最优解而无法跳出。

因此,需要在具体问题中综合考虑问题的性质和约束条件来确定是否适合采用贪心算法。

二、回溯法回溯法是一种通过不断尝试可能的步骤来寻找问题解的方法。

它通常基于递归的思想,在每一步都尝试所有的可能选择,并逐步构建解空间,直到找到解或确定无解。

回溯法的核心思想是深度优先搜索,通过遍历解空间树来寻找解。

在每一步,回溯法都会考虑当前状态下的所有可能选择,并递归地进入下一步。

如果某一步的选择无法达到目标,回溯法会回退到上一步进行其他可能的选择。

回溯法常用于解决一些全排列、子集和组合等问题。

例如,在解决八皇后问题时,回溯法通过逐个放置皇后并进行合法性判断,直到找到所有解或遍历完所有可能的情况为止。

然而,回溯法的缺点在于其时间复杂度较高,其搜索过程包含了大量的重复计算。

因此,在使用回溯法解决问题时,需注意适当剪枝以减少搜索空间,提高算法效率。

三、贪心算法与回溯法的比较贪心算法和回溯法都是常用的算法设计与分析方法,但其适用场景和效果有所差异。

贪心算法在解决问题时能够快速找到局部最优解,并且具有较低的时间复杂度。

它适用于一些满足最优子结构性质的问题,例如最小生成树、单源最短路径等。

然而,贪心算法无法保证一定能找到全局最优解,因此需根据具体问题的特点来判断是否使用。

算法分析与设计实验报告 实验5:贪心算法的应用

算法分析与设计实验报告 实验5:贪心算法的应用
scanf("%d %d",&d[i].l,&d[i].r); if(d[i].l>d[i].r) swap(d[i].l,d[i].r); }
sort(d,d+n,cmp);//按纵坐标升序排列 last=d[0].r;//记录当前线段被覆盖的最大坐标值
for(int i=1;i<n;i++) { if(d[i].l<=last && d[i].r>=last)//线段 d[i]的右坐标在 last 之后, 左坐标在 Last 之前的情况,即产生了覆盖。此时还要更新 last 坐标
} cout<<n.substr(0,l-s+x)<<endl;//只打印剩下的左边 l-(s-x)个数字 } return 0; } 2. #include<iostream> #include<cstdio> #include <algorithm> using namespace std; struct point {
课程实验报告
课程名称 算法分析与设计 班级 计算 161 实验日期
姓名
何严鸿
学号 20160701 实验成绩 9
实验名称
实验 5:贪心算法的应用

1.理解贪心算法的概念;


2.掌握贪心算法的基本思想。





操作系统:Windows


IDE:Visual C++

(1)删数问题
2018/5/06
{
length=d[i].r-d[i-1].l; last=d[i].r; } else if (d[i].r<=last) //线段 d[i]的右坐标在 last 之内,不产生覆盖 continue; else if (d[i].l>=last) //线段 d[i]的左坐标在 Last 之后,此时 last 之后的部分不会对之前的部分产生影响,更新 last 坐标。length 的值加上之 前的部分 { last=d[i-1].r; length=length+d[i].r-d[i].l; } } cout<<last<<endl; return 0; }

常用算法与程序设计第五章贪心算法

常用算法与程序设计第五章贪心算法
5.3 删数字问题
➢ 对给定的n位高精度正整数,去掉其中k(k<n)个数 字后,按原左右次序将组成一个新的正整数,使 得剩下的数字组成的新数最大。
➢ 操作对象是一个可以超过有效数字位数的n位高 精度数,存储在数组a中。
➢ 每次删除一个数字,选择一个使剩下的数最大的数 字作为删除对象。之所以选择这样“贪心”的操 作,是因为删k个数字的全局最优解包含了删一个 数字的子问题的最优解。
作业: 一个数列由n个正整数组成,对该数列进行
一次操作:去除其中两项a、b,添加一项 a*b+1。经过n-1次操作后该数列剩一个数a, 试求a的最大值。
18
Visual FoxPro
5.5 覆盖问题
二分图是一个无向图,它的n 个顶点可二分为集 合A和集合B,且同一集合中的任意两个顶点在图中 无边相连(即任何一条边都是一个顶点在集合A中, 另一个在集合B中)。当且仅当B中的每个顶点至少 与A中一个顶点相连时,A的一个子集A‘ 覆盖集合B (或简单地说,A’ 是一个覆盖)。覆盖A‘ 的大小即 为A’ 中的顶点数目。当且仅当A‘ 是覆盖B的子集中最 小的时,A’ 为最小覆盖。
15
Visual FoxPro
物品可拆背包问题C程序设计代码如下:
➢ for(i=1;i<=n-1;i++) 大到小排序 */
/* 对n件物品按单位重量的效益从
➢ for(j=i+1;j<=n;j++)
➢ if(p[i]/w[i]<p[j]/w[j])
➢ { h=p[i];p[i]=p[j]; p[j]=h;
5.1 贪心算法概述
5.1.1 贪心算法
有一艘大船准备用来装载货物。所有待装货物都装在 货箱中且所有货箱的大小都一样,但货箱的重量都各不相 同。设第i个货箱的重量为wi(1≤i≤n),而货船的最大载 重量为c,我们的目的是在货船上装入最多箱的货物。

算法设计与分析第5章 贪心算法

算法设计与分析第5章 贪心算法

*
精品文档
河南工程学院
算法设计与分析
• 设y[n]是Knapsack算法得出的向量解 • 1 如果任意的yi=1,那么这个解肯定是问题的最优解 • 2 否则,设j是yi<>1的最小下标。 • 可知1<=i<j 时, yi=1 • j<i<=n时,yi=0; • i=j时, 0<=yi<1 • 3 如果y[n]不是问题的最优解,则肯定存在一个可
*
精品文档
河南工程学院
算法设计与分析
• 设有 n个作业,并且完成每个作业所需要的时间 都是相同的,将这个时间设为单位时间;同时, 每个作业i(1<=i<=n)的截止期限di>0,当作业i在它 的截止期限di之前完成时,会获得效益值pi>0.
• 设J 是由GreedyJob算法得到的一个作业的集合, 而W是由最优解组成的作业集合
• 9 r Find(min (n,d(i)));
• 10 if F(r)<>0
• 11 then {
• 12 k k+1;J(k) i;
• 14
l Find(F(r)-1);
• 15
Union(l,i);
• 16
F(r) F(l);
• 17
}
• 18 }
• 19 return k
*
精品文档
河南工程学院
算法设计与分析
*
算法greedySelector 的 计算过程如左图所示。 图中每行相应于算法 的一次迭代。阴影长 条表示的活动是已选 入集合A的活动,而 空白长条表示的活动 是当前正在检查相容 性的活动。
精品文档
河南工程学院
算法设计与分析

第5章 贪心法

第5章 贪心法

5.1 引言
三、背包问题
1.背包问题 给定一个承重量为C的背包,n个重量分别为 w1,w2,…,wn的物品。已知物品i放入背包能产生vi的价 值(放入单位重量的物品i,产生的价值为vi/wi), i=1,2,…,n。如何装包才能获得最大价值? 实际上,就是要求找到一组非负且不超过1的实数
x1,x2,…,xn满足∑xiwi≤C,且使得∑xivi达到最大值。
三、背包问题
Sort(n,v,w); int i; for (i=1;i<=n;i++) x[i]=0; float c=M; for (i=1;i<=n;i++) { if (w[i]>c) break;
5.1 引言
算法knapsack的 主要计算时间在于将 各种物品依其单位重 量的价值从大到小排 序。因此,算法的计 算时间上界为 O(nlogn)。 为了证明算法的正确 性,还必须证明背包 问题具有贪心选择性 质。
5.1 引言
三、背包问题
3.求解思想 贪心准则2——根据物品的重量由小到大来放。
从剩下的物品中选择可装入背包的重量最小的物品。 虽然这种规则对于前面的例子能产生最优解,但在一般 情况下则不一定能得到最优解。 (由上面实例可知,它不是最优贪心准则)
5.1 引言
三、背包问题
3.求解思想 贪心准则3——根据价值/重量(即单位价值)由大 到小来放。 每一项计算yi=vi/Wi,即该项值和大小的比,再按 比值的降序来排序,从第一项开始装背包,然后是第二 项,依次类推。尽可能的多放,直到装满背包。 (可以证明它是最优贪心准则)
5.2单源最短路问题
五、Dijkstra算法
算法中图使用邻接表表示,其示意图如下。

第五章 贪心算法

第五章 贪心算法

贪心法解活动安排问题
按fi非减序对活动排序 相容活动子集合最大—贪心选择与已选活动相容, 且fi小者.
例:设待安排的11个活动的开始时间和结束时间按 结束时间的非减序排列如下:
i si fi 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
贪心法解背包问题解法2 贪心法解背包问题解法2

贪心选择价值 重量大者 价值/ 2. 价值最大 — 贪心选择价值/重量大者 例:背包重量10 背包重量 物体1:重量9 物体 :重量 物体2:重量4 物体 :重量 物体3:重量3 物体 :重量 价值5 价值 价值4 价值 价值2 价值
①初始:背包剩余重量m=M=10
有两类背包问题: 物体可分割—本节研究 物体不可分割—0/1背包问题,后续章节研究
背包问题的数学描述
假设: x i 是物体 i被装入背包的部分, 0 ≤ x1 ≤ 1. 根据问题要求,背包问 题的数学描述为: max
nБайду номын сангаас
∑px
i =1 i i
n
i i
∑ω x
i =1
=M
即求X=(x1,x2,…,xn),满足上述优化方程.
其中 x i = 1表示装入集装箱 i, x i = 0 表示不装入集装箱 i.
贪心法解最优装载问题
目标是装入集装箱个数最多—贪心选择重量轻者优先
例:c=100吨 w1=10吨 w2=30吨 w3=20吨 w4=40吨 ① 初始剩余载重g=100 装入个数k=0 ② 贪心选择w1 w1<g 故x1=1 g=g-w1=90 k=1 ③ 贪心选择w2 w2<g 故x2=1 g=g-w2=60 k=2 同理,继续.得X={1,1,1,1}

计算机算法设计与分析-贪心算法

计算机算法设计与分析-贪心算法

2023/10/8
计算机算法设计与分析
4
树的基本性质
连通无回路的图G称为树。 树是点比边多一的连通图,G连通且q=p–1 。 树是点比边多一的无回路图:G无回路且q=p–1 树若添条边就有回路:G无回路,但对任意的u,
v∈V(G),若uvE(G),则G+uv中恰有一条回路 树若减条边就不连通:G连通,但对e∈E(G),
图条 出且边 权该。 重回这 较路n小中–的1包n条含–边1e必条1。定边该包(回括在路了实中G现必的中有n体个条现顶不为点是n。e个的这 边样 顶e就 点i。得 的令到 选T’了择={G)T的+。e一1}棵–ei最。小T’生也成是树G的。生成树。又
cc矛K次不 要 是这((TTr盾选行 保 连u’’样))s。≤k择=! 证 通c做a故(cl权因 这 的T算(是T)必重为 或n,法)否定–+较不者T的1c’有可是小能是条(做e图1以G的保无边法) 的G–n证回构呢:的c最–(这路成在?e最1小1条的n树)保,小生–边。,证c生1成(。必条无e成1树)须边回树≤且使构路c包含(这成e的含i有)n树,前了边–?从提e1e1条而下1。。边依
初始化:Path中仅含有源v。
2023/10/8
计算机算法设计与分析
21
最临近算法中的数据结构
图用连接矩阵W[i][j]给出,即W[i][j]为 结点i到结点j的权重。
Path[]记录依次连接的城市,p记录当前 到达的最后一个顶点,cost为当前路径 长度。
如果节点k已经到达,则arrived[k]=true。
3
最小生成树
设G = (V, E)是一个无向连通带权图,即一个网 络。E的每条边(v, w)的权为c[v][w]。

算法课件(五)贪心算法

算法课件(五)贪心算法

最大值。
• 贪心算法在每一步的决策中虽然没有完全顾忌到问题整体 优化,但在局部择优中是朝着整体优化的方向发展的。为 此,贪心算法首先要确定一个度量准则(称为贪心准则), 每一步都是按这个准则选取优化方案。
贪心算法抽象化控制流程
Greedy(A, n) // A[1:n]代表那个输入 1. solution={}; //解向量初始化为空集 2. for i to n do 3. x:=Select(A) 4. if Feasible(solution, x) then 5. solution:=Union(solution, x) 6. end if 7. End for 8. Return (solution)
• 据此,贪心准则应当是:在未安排的活动中挑选结束时间
最早的活动安排。 • 在贪心算法中,将各项活动的开始时间和结束时间分别用 两个数组s和f存储,并使得数组中元素的顺序按结束时间 非减序排列:f1≤ f2≤…≤ fn。
[算法思路]将n个活动按结束时间非减序排列,依次考虑活动i,
若i与已选择的活动相容,则添加此活动到相容活动子集. [例]设待安排的11个活动起止时间按结束时间的非减序排列

作业集E的子集称为相容的,如果其中的作业可以被安排
由一台机器完成。带限期单机作业安排问题就是要在所 给的作业集合中选出总效益值最大的相容子集。

例如:n=4,(p1,p2,p3,p4)={100,10,15,20},
(d1,d2,d3,d4)={2,1,2,1}
• 例子 设n=7, (p1, p2,… , pn)=(35,30,25,20,15,10,5), (d1, d2,… ,dn)=(4,2,4,3,4,8,3), • 算法GreedyJob的执行过程可描述如下: d1; d2, d1; d2, d1,d3; d2, d4, d1,d3; d2, d4, d1,d3, d6; 4 ; 2, 4 ; 2, 4, 4 ; 2, 3, 4, 4 ; 2, 3, 4, 4, 8;

算法设计与分析讲义贪心法

算法设计与分析讲义贪心法
特点
贪心算法在每一步选择时都采取在当前状态下最好或最优( 即最有利)的选择,而不考虑可能出现的后果。
贪心算法与动态规划
贪心算法是一种局部最优策略,即每一步选择在当前状态下 是最优的,但不一定能够得到全局最优解。
动态规划是一种全局最优策略,通过将问题分解为子问题, 逐步求解得到全局最优解。
贪心算法的历史与发展
选择适当的贪心策略
选择适当的贪心策略可以最大程度 地减少计算时间。
空间优化
通过优化算法的空间复杂度,减少 算法的空间占用,以提高算法的效 率。
并行计算
利用并行计算技术,将算法并行化 ,以提高算法的运行速度。
数据结构优化
使用合适的数据结构可以加快算法 的执行速度,如哈希表、堆等。
06
贪心算法的应用扩展
贪心算法的优化策略
总结词
记忆化搜索、动态规划优化、全局状态决策
详细描述
贪心算法虽然能够得到问题的近似解,但在某些情况 下可能无法得到最优解。为了提高贪心算法的性能, 可以采用一些优化策略,例如记忆化搜索,将已经计 算过的状态存储下来,避免重复计算;动态规划优化 ,将问题分解为子问题,通过解决子问题来解决原问 题;全局状态决策,将问题的所有状态作为一个整体 来考虑,利用问题的整体性质来得到更好的解。
在资源分配问题中,贪心算法可以用于求解具有单位资源的最大权值
组合问题、分数背包问题等。
05
贪心算法的实现技巧
贪心算法的编程实现
确定贪心策略
根据问题特性确定贪心策略,通常选择最优解或近似最优解。
编码实现
将贪心策略转化为代码实现,通常使用循环和条件语句实现算 法。
测试样例
设计测试样例,覆盖各种情况,提高算法的健壮性和正确性。

贪心算法PPT课件

贪心算法PPT课件
且有||B’-{k}||>||B-{1}||,这与假设2°矛盾。 ▌
安排方案
f1
B
安排方案
fk
B’
…… 共j个活动
可能 相同 不存在
……
可能
如果 B’包 含这 个活, 则B 一定 包含
9
(2) 时间复杂度分析: 因为排序过程可以在O(nlogn)时间内完成,而求最优活动子 集的过程只需O(n)次比较,因此这个算法的时间复杂度为 O(nlogn)。 (3) 贪心策略设计算法的一般特点
·选Si最小的,这样可以增大场地的利用率; ·选fi最小的,使得下一个活动可以更早开始。
由于活动的占用时间长度没有限制,因此后一选择更合理。
6
为了在每一次选择时取当前可以安排的活动中最早结束的活动,应首先把 n项活动按结束时间的先后进行升序排序。即,使f1≤f2≤…≤fn,然后在Si值 不小于当前时刻的活动中取fi值最小者。 算法:
·算法的设计比较简单; ·算法一般比较快速; ·算法的正确性一般不明显,需要论证;如果正确性不能保 证,那么它往往可以得到近似最优解。
10
5.2 背包(Knapsack)问题
1. 问题描述
已知:n个(应为n种)物体{1,2,…,n}与一个背包。物体i的重量 (或体积)为Wi>0,价值为Pi>0(i=1,2,…,n),背包容量为 M>0。
计算机算法 ——设计与分析导论
刘璟
1
Chapter 5. 贪心(Greedy)技术
❖ 5.1 贪心策略的思想 ❖ 5.2 背包(Knapsack)问题 ❖ 5.3 Huffman编码 ❖ 5.4 多机调度问题的近似解法 ❖ 5.5 单源最短路径的Dijkstra算法

算法设计与分析2篇

算法设计与分析2篇

算法设计与分析2篇第一篇:贪心算法贪心算法是求解最优化问题的一种常用算法,其核心思想是在每一步选择中都采取当前状态下最好或最优的选择,从而希望最终得到全局最好或最优的解。

一、贪心算法的基本概念贪心算法的基本概念包括“贪心选择性质”和“最优子结构性质”。

1. 贪心选择性质:所谓的贪心选择性质是指,当使用贪心策略进行问题求解时,每一次选择所采用的策略都是局部最优的,即当前情况下最好或最优的选择。

可以通过数学归纳法证明。

2. 最优子结构性质:最优子结构性质是指,当一个问题的最优解包含其子问题的最优解时,该问题具有最优子结构性质。

这种情况下,可以使用贪心算法来求解子问题的最优解,从而推导出原问题的最优解。

二、贪心算法的优缺点1. 优点:贪心算法的实现通常比其他算法简单,计算时间较短。

对于一些求解最优化问题的情况,贪心算法可以得出较好的解。

2. 缺点:贪心算法可能会得到次优解,因为其仅仅关注当前状态下最好或最优的选择,并不能保证得到全局最好或最优的解。

对于一些复杂问题,贪心算法不能得到正确结果。

三、经典贪心算法应用1. 钞票找零问题:假设有一定面额的钞票,如1元、5元、10元和50元,现在需要找零n元,如何使用最少的钞票?解决方法:使用贪心算法,每次找零都选择当前面额最大的钞票。

此方法可以得到最少的钞票数量。

2. 区间调度问题:假设有若干区间,每个区间起始时间为S,终止时间为T,需要将尽可能多的完整区间安排在一条时间轴上。

解决方法:使用贪心算法,每次选择结束时间最早的区间,然后过滤掉与该区间相交的区间。

此方法可以得到最多的完整区间。

以上两个问题均是经典的贪心算法问题,可以通过贪心选择性质和最优子结构性质进行求解。

四、总结贪心算法是一种常用的求解最优化问题的算法,其核心思想是在每一步选择中都采取当前状态下最好或最优的选择,从而希望最终得到全局最好或最优的解。

虽然贪心算法具备一定的优点,但也存在其缺点。

在实际问题求解过程中,需要结合具体情况选择合适的算法。

《算法设计与分析》第5章贪心法PPT课件

《算法设计与分析》第5章贪心法PPT课件

template<class Type>
void Loading(int x[], Type w[], Type c, int n)
{
int *t = new int [n+1];
Sort(w, t, n);
的重量为wi。
最优装载问题要求确定在装载体积不受限制的情况下,将
尽可能多的集装箱装上轮船。
2021/4/25
成都学院计算机系
-36-
最优装载问题可用贪心算法求解。采用重 量最轻者先装的贪心选择策略,可产生最优装 载问题的最优解。具体算法描述如下:
2021/4/25
成都学院计算机系
-37-
5.4.1 最优装载
} return s;
2021/4/25
成都学院计算机系
-16-
在初始状态下,解向量solution=φ,其中未 包含任何分量。使用最优度量标准,一次选择 一个分量,逐步形成解向量(x0,x1,…,xn-1).算 法执行过程中生成的向量(x0,x1,…,xk),k<n,称 为部分解向量或部分向量。
动态规划算法通常以自底向上的方式解各子问题,而贪 心算法则通常以自顶向下的方式进行,以迭代的方式作 出相继的贪心选择,每作一次贪心选择就将所求问题简 化为规模更小的子问题。
2021/4/25
成都学院计算机系
-13-
贪心算法的一般框架
GreedyAlgorithm (parameters) { 初始化; 重复执行以下的操作:
成都学院计算机系
-5-
若硬币面值改为:一角一分、五分和一分,而要 找给顾客一角五分钱。
用贪心算法将找给1个一角一分和4个一分的硬币。 然而,3个五分硬币是最好的找法。

算法设计与分析-贪心法

算法设计与分析-贪心法

(5)可行函数feasible:检查解集合中加入一个候 选对象是否可行,即解集合扩展后是否满足约束条 件。例如,在付款问题中,可行函数是每一步选择 的货币和已付出的货币相加不超过应付款。
4.1.4 贪心法的求解过程
利用贪心算法求解问题的的过程通常包括如下三个步骤。 (1)分解 将原问题分解为若干相互独立的阶段; (2)求解 对于每个阶段求局部最优解,即进行贪心选 择。在每个阶段,选择一旦做出就不可更改。做出贪心 选择的依据称为贪心准则。贪心准则的制定是用贪心算 法解决最优化问题的关键,它关系到问题能否得到成功 解决及解决质量的高低。 (3)合并 将更改阶段的解合并为原问题的一个可行解。
例:用贪心法求解付款问题。
假设有面值为5元、2元、1元、5角、2角、1角的 货币,需要找给顾客4元6角现金,使付出的货币 的数量最少。
【首先选出1张面值不超过4元6角的最大面值的货 币,即2元,再选出1张面值不超过2元6角的最大面 值的货币,即2元,再选出1张面值不超过6角的最 大面值的货币,即5角,再选出1张面值不超过1角 的最大面值的货币,即1角,总共付出4张货币】。
至少有三种看似合理的贪心策略: (1)选择价值最大的物品,因为这可以尽可能快
地增加背包的总价值。但是,虽然每一步选择获得 了背包价值的极大增长,但背包容量却可能消耗得 太快,使得装入背包的物品个数减少,从而不能保 证目标函数达到最大。
(2)选择重量最轻的物品,因为这可以装入尽可 能多的物品,从而增加背包的总价值。但是,虽然 每一步选择使背包的容量消耗的慢了,但背包的价 值却没能保证迅速增长,从而不能保证目标函数达 到最大。
4.1.2 贪心法的设计思想
贪心法在解决问题的策略上目光短浅,只根据当 前已有的信息就做出选择,而且一旦做出了选择,不 管将来有什么结果,这个选择都不会改变。换言之, 贪心法并不是从整体最优考虑,它所做出的选择只是 在某种意义上的局部最优。

算法设计与分析讲义贪心法

算法设计与分析讲义贪心法

贪心算法的历史与发展
01
贪心算法源于1944年数学家John von Neumann在博弈论中的“Oligopoly” 算法,用于解决多人零和博弈问题;
02
1954年,Garey和Johnson提出了贪心算法的基础概念和方法,并成功应用于 解决一些组合优化问题;
03
随着计算机科学和人工智能的快速发展,贪心算法在许多领域得到了广泛应用 和发展,例如最短路径问题、最小生成树问题、作业调度问题等。
找零问题
总结词
最优找零策略,时间复杂度为O(logn)
详细描述
在找零时,贪心算法可以帮助我们制定最优找零策略,通过计算货币单位的最小公倍数,将找零的货 币单位从小到大排序,然后依次考虑每个货币单位,直到找零的总额达到商品价格为止。
背包问题
总结词
最优解,时间复杂度为O(nW),其中n为物品数量,W为背包容量
06
总结与展望
贪心算法的优缺点
• 优点 • 简单易懂:贪心算法的思路通常比较直观,易于理解,适合初学者快速上手。 • 高效:在某些情况下,贪心算法的执行效率可以非常高,例如对于一些最优子结构的问题,时间复杂度可
以达到 O(n)。 • 适用范围广:贪心算法可以应用于许多不同类型的问题,具有较广的适用性。 • 缺点 • 正确性难以保证:对于某些问题,贪心算法可能无法得到正确的结果,因为它们不能保证全局最优。 • 不一定收敛:贪心算法在某些情况下可能不收敛,不能得到最终的解。 • 需要良好的初始化:贪心算法通常需要一个良好的初始化,否则可能会陷入局部最优解。
贪心算法未来的发展方向
• 理论研究 • 研究贪心算法的理论基础,探讨其适用范围和限制,以更好地理解其性质和行为。 • 深入研究贪心算法在不同类型问题中的应用,拓展其应用范围。 • 研究贪心算法与其他算法之间的关系和比较,以更全面地了解各种算法的优势和劣势。 • 应用研究 • 在实际应用中,研究如何更好地利用贪心算法来解决各种问题,提高其解决问题的效率和性能。 • 研究如何将贪心算法与其他算法相结合,以充分发挥各自的优势,提高解决问题的效率和正确性。 • 计算复杂性研究 • 研究贪心算法的时间复杂度和空间复杂度,以更好地了解其计算效率和资源占用情况。 • 研究如何优化贪心算法的实现,提高其计算效率和可扩展性。

《算法设计与分析》第5章贪心法概述

《算法设计与分析》第5章贪心法概述

出相继的贪心选择,每作一次贪心选择就将所求问题简
化为规模更小的子问题。
2019/2/27 成都学院计算机系 -13-
贪心算法的一般框架
GreedyAlgorithm (parameters) { 初始化; 重复执行以下的操作: 选择当前可以选择的最优解; 将所选择的当前解加入到问题的解中去; 直至满足问题求解的结束条件。 }
一般来讲,如果一个问题可以用贪心法求解,则问题
的解可表示成: (x0,x1,……,xn-1) 其中每个分量xi取自某个值集S,所有允许的n元组 组成一个候选解集。

2019/2/27
成都学院计算机系
-10-
贪心法通过一系列步骤来构造问题的解,每一 步对目前构造的部分解做一个扩展,直到获得 问题的完整解为止。
(2)贪心选择性质
理解贪心算法与动态规划算法的差异 理解贪心算法的一般理论
通过应用范例学习贪心设计策略。
(1)活动安排问题、(2)最优装载问题、(3)哈夫曼编码; (4)单源最短路径、(5)最小生成树等。
2019/2/27
成都学院计算机系
-4-
讨论
找零问题:用当地面额为d1>d2>……>dn的最
少数量的硬币找出金额为n的零钱。
2019/2/27
成都学院计算机系
-6-
5.1 一般方法
1. 问题的一般特征
问题有n个输入,问题的解是由这n个输入的某个子集组成,这个子集 必须满足某些事先给定的条件。 约束条件:子集必须满足的条件; 可行解:满足约束条件的子集;可行解可能不唯一; 目标函数:用来衡量可行解优劣的标准,一般以函数的形式给出; 最优解:能够使目标函数取极值(极大或极小)的可行解。 分类:根据描述问题约束条件和目标函数的数学模型的特性和问题的 求解方法的不同,可分为:线性规划、整数规划、非线性规划、动态规 划等。 贪心方法:一种改进的分级的处理方法,可对满足上述特征的某些问 题方便地求解。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第五章 贪心算法§1.贪心算法基本思想找零钱 假如售货员需要找给小孩67美分的零钱。

现在,售货员手中只有25美分、10美分、5美分和1美分的硬币。

在小孩的催促下,售货员想尽快将钱找给小孩。

她的做法是:先找不大于67美分的最大硬币25美分硬币,再找不大于67-25=42美分的最大硬币25美分硬币,再找不大于42-25=17美分的最大硬币10美分硬币,再找不大于17-10=7美分的最大硬币5美分硬币,最后售货员再找出两个1美分的硬币。

至此,售货员共找给小孩6枚硬币。

售货员的原则是拿尽可能少的硬币个数找给小孩。

从另一个角度看,如果售货员将捡出的硬币逐一放在手中,最后一起交给小孩,那么售货员想使自己手中的钱数增加的尽量快些,所以每一次都尽可能地捡面额大的硬币。

装载问题 有一艘大船用来装载货物。

假设有n 个货箱,它们的体积相同,重量分别是n w w w ,,21 ,货船的最大载重量是c 。

目标是在船上装最多货箱该怎样装?如果用1=i x 表示装第i 个货箱,而0=i x 表示不装第i 个货箱,则上述问题是解优化问题:求n x x x ,,,21 ,∑=ni i x 1max (5.1.1)c x i ni i ≤∑=1w (5.1.2)贪心方法,顾名思义,是在决策中总是作出在当前看来是最好的选择。

例如找零钱问题中,售货员每捡一个硬币都想着使自己手中的钱尽快达到需要找钱的总数。

在装载问题中,每装一个货箱都想着在不超重的前提下让船装更多的箱子。

但是贪心方法并未考虑整体最优解,它所作出的选择只是在某种意义上的局部最优选择。

当然,在采用贪心算法时未必不希望结果是整体最优的。

事实上,有相当一部分问题,采用贪心算法能够达到整体最优,如前面的找零钱问题以及后面将要讲到的单点源最短路径问题、最小生成树问题、工件排序问题等。

为了更好理解贪心算法,我们将装载问题稍加推广,考虑可分割的背包问题。

背包问题 已知容量为M 的背包和n 件物品。

第i 件物品的重量为i w ,价值是i p 。

因而将物品i 的一部分i x 放进背包即获得i i x p 的价值。

问题是:怎样装包使所获得的价值最大。

即是如下的优化问题:∑≤≤ni i i x p 1max (5.1.3)ni w p x Mx w i i i ni i i ≤≤>>≤≤≤∑≤≤1,0,0,101 (5.1.4)采用贪心方法,有几种原则可循:a ).每次捡最轻的物品装;b ).每次捡价值最大的装;c ).每次装包时既考虑物品的重量又考虑物品的价值,也就是说每次捡单位价值i i w p 最大的装。

按原则a 来装只考虑到多装些物品,但由于单位价值未必高,总价值不能达到最大;按原则b 来装,每次选择的价值最大,但同时也可能占用了较大的空间,装的物品少,未必能够达到总价值最大。

比较合理的原则是c )。

事实上,按照原则c )来装,确实能够达到总价值最大。

程序5-1-1 背包问题贪心算法GreedyKnapsack(p, w, M, x, n) //价值数组p[1:n]、重量数组w[1:n],//它们元素的排列顺序满足p[i]/w[i]≥p[i+1]/w[i+1]; M 是背包容量, // x 是解向量real p[1:n], w[1:n], x[1:n], M, rc; integer i, n;x=0; // 将解向量初始化为零 rc=M; // 是背包剩余容量初始化为M for i from 1 to n doif w[i] > rc then exit endif x[i]=1; rc=rc-w[i]; endfor if i ≤n thenx[i]=rc/w[i]; endifend GreedyKnapsack例子 n=3, M=20, p=(25, 24, 15), w=(18,15,10)(说明该算法的执行情况) 定理5.1.1 如果][/][]2[/]2[]1[/]1[n w n p w p w p ≥≥≥ ,则GreedyKnapsack 对于给定的背包问题实例生成一个最优解。

证明 设),,,(21n x x x x =是GreedyKnapsack 所生成的解,但不是最优解。

因而必有某个i x 不为1。

不妨设j x 是第一个这样的分量。

于是,当j i <≤1时,1=i x ;当j i =,10<≤i x ;当n i j ≤<时,0=i x 。

不妨假定M x w i i =∑。

因为x 不是最优解,必存在解向量),,,(21n y y y y =,使得∑∑>i i i i x p y p 。

设k 是使得k k x y ≠的最小下标,则y k < x k . 这是因为:当j k <时,1=k x ,上述不等式自然成立;当j k ≥时,因为 ,11y x =,0,0,111===+--n k k k x x y x 所以由 ,k k y x <可推出M x w y w ni i i n i i i =>∑∑==11,y 不是解向量,矛盾。

由k k x y <,可以假定M y w ni i i =∑=1,进而有)(1k k k nk i i i y x w y w -≥∑+=。

现在取新的向量),,,(21n z z z z =满足k k k k x z y x y z ===--,,,1111 ,n n k k y z y z ≤≤≤≤++0,,011 而且)()(1k k k ni k i i i y z w z y w -=-∑≤≤+由上段的不等式,这样的向量z 是存在的,而且是背包问题的可行解,因为My w y w y w z w z w y w z w ni i i ni k ii k i i i ni k ii k k k i i i ni i i ≤=+=++=∑∑∑∑∑∑≤≤≤≤-≤≤≤≤+-≤≤≤≤1111111至此,我们找到一个新的解向量z 。

以下证明它的总价值不小于y 的总价值:∑∑∑∑∑∑≤≤≤≤+≤≤≤<≤≤≤≤=⎪⎭⎫ ⎝⎛---+≥---+=ni ii kk ni k i i i k k k ni i i ii ni k i i i k k k k k ni i i ni i i y p w p w z y w y z y p w p w z y w p w y z y p z p 11111/)()(/)(/)(中间的不等式是由于当k i >时有][/][][/][i w i p k w k p ≥而得。

但是z 与x 的不同分量的个数比y 与x 的不同分量的个数至少减少一个。

以z 代替y 进行上面的讨论,我们又可以找到新的解向量'z ,如此等等,由于分量的个数n n 有限,必到某一步停止,最后找到解向量*y ,它和x 有相同的分量,又与y 有不同的总价值(大于x的总价值),矛盾。

这个矛盾源于x不是最优解的假设。

故,x是最优解。

证毕贪心算法主要用于处理优化问题。

每个优化问题都是由目标函数和约束条件组成。

满足约束条件的解称为可行解,而那些使得目标函数取得最大(最小)值的可行解称为最优解。

如背包问题是一个优化问题,式(5.3)中的函数是目标函数,而(5.4)式描述的要求是约束条件,这里优化是使目标函数取最大值。

贪心算法在每一步的决策中虽然没有完全顾忌到问题整体优化,但在局部择优中是朝着整体优化的方向发展的。

为此,贪心算法首先要确定一个度量准则(称为贪心准则),每一步都是按这个准则选取优化方案。

如背包问题的贪心准则是选取单位价值p/w最大物品;而装载问题的贪心的准则是选取最轻的货箱;找零钱问题所用的贪心准则是选取面值最大的硬币。

对于一个给定的问题,初看起来,往往有若干种贪心准则可选,但在实际上,其中的多数都不能使贪心算法达到问题的最优解。

如背包问题的下面实例:n=3, M=20, p=(25, 24, 15), w=(18,15,10)如果以价值最大为贪心准则,则贪心算法的执行过程是:首先考虑将物品1装包,此时获得效益值25,包的剩余容量是2。

然后考虑将物品2装包,但物品2的重量15超出包的剩余容量,只能装入该种物品的2/15,此时获得的总效益值为25+24×2/15=28.2。

这样得到的可行解(1,2/15,0)并不是最优解。

事实上,如果以单位价值最大为贪心准则,则贪心算法的执行过程是:先计算出各个物品的单位价值(25/18, 24/15, 15/10)=(1.389, 1.6, 1.5)。

首先考虑单位价值大的物品装包,即将物品2装包,此时获得效益值24,背包的剩余容量是5。

然后考虑装物品3,由于物品3的重量超出背包的剩余容量,只能装入该物品5/15=1/2, 至此背包已经装满,所得的总的效益值为24+15/2=31.5。

比前面的装法的效益值大。

实践证明,选择能产生最优解的贪心准则是设计贪心算法的核心问题。

以下给出贪心算法流程的伪代码。

程序5-1-2 贪心算法抽象化控制流程Greedy(A, n) // A[1:n]代表那个输入solution={}; //解向量初始化为空集for i from 1 to n dox=Select(A);if Feasible(solution, x) thensolution=Union(solution, x);endifendforreturn(solution);end Greedy这里Select(A)是按照贪心准则选取A中的输入项; Feasible(solution, x)是判断已知的解的部分solution与新选取的x的结合Union(solution, x)是否是可行解。

过程Greedy描述了用贪心策略设计算法的主要工作和基本控制流程。

一旦给出一个特定的问题,就可将Select,Feasible和Union具体化并付诸实现。

§2. 作业排序问题活动安排问题我们首先从活动安排这一简单问题入手。

该问题要求高效地安排一系列争用某一公共资源的活动。

贪心算法提供了一个简单、漂亮的方法使得尽可能多的活动能够兼容地使用公共资源。

问题:已知n个活动 E={1, 2, … ,n},要求使用同一资源,第k个活动要求的开始和结束时间为sk , fk, 其中sk< fk, k=1, 2, … , n .活动k与活动j称为相容的如果sk > fj或者sj> fk。

活动安排问题就是要在所给的活动集合中选出最大的相容活动子集。

解决这个问题的基本思路是在安排时应该将结束时间早的活动尽量往前安排,好给后面的活动安排留出更多的空间,从而达到安排最多活动的目标。

相关文档
最新文档