计算机算法设计与分析第4章(1)

合集下载

算法设计与分析(王晓东)

算法设计与分析(王晓东)
方法 abs(x) ceil(x) cos(x) exp(x) floor(x) log(x) 功能 x的绝对值 不小于x的最小整数 x的余弦 ex 不大于x的最大整数 x的自然对数 方法 max(x,y) min(x,y) pow(x,y) sin(x) sqrt(x) tan(x) 功能 x和y中较大者 x和y中较小者 xy x的正弦 x的平方根 x的正切
a b a b
(2)方法重载:Java允许方法重载,即允许定义有不同签名的同名方法。
上述方法ab可重载为:
public static double ab(double a, double b) { return (a+b+Math.abs(a-b))/2.0; } 12
4.异常
1.3 描述算法
6
1.2 表达算法的抽象机制
2.抽象数据类型
抽象数据类型是算法的一个数据模型连同定义在该模型上 并作为算法构件的一组运算。
抽象数据类型带给算法设计的好处有:
(1)算法顶层设计与底层实现分离; (2)算法设计与数据结构设计隔开,允许数据结构自由选择; (3)数据模型和该模型上的运算统一在ADT中,便于空间和时间耗费的折衷; (4)用抽象数据类型表述的算法具有很好的可维护性; (5)算法自然呈现模块化; (6)为自顶向下逐步求精和模块化提供有效途径和工具; (7)算法结构清晰,层次分明,便于算法正确性的证明和复杂性的分析。
中国计算机学会 “21世纪大学本科计算机专业系列教材”
算法设计与分析
王晓东 编著
1
主要内容介绍
• • • • • • 第1章 第2章 第3章 第4章 第5章 第6章 算法引论 递归与分治策略 动态规划 贪心算法 回溯法 分支限界法

算法设计与分析第四章课件

算法设计与分析第四章课件
各活动的起始时间和 结束时间存储于数组s 和f中且按结束时间的 非减序排列

}
若被检查的活动i的开始时间Si小于最近选择 的活动j的结束时间fi,则不选择活动i,否则 选择活动i加入集合A中。


由于输入的活动以其完成时间的非减序排列, 所以算法每次总是选择具有最早完成时间的相 容活动加入集合A中。直观上,按这种方法选 择相容活动为未安排活动留下尽可能多的时间。 也就是说,该算法的贪心选择的意义是使剩余 的可安排时间段极大化,以便安排尽可能多的 相容活动。 算法的效率极高。当输入的活动已按结束时间 的非减序排列,算法只需θ (n)的时间安排n个 活动,使最多的活动能相容地使用公共资源。 如果所给出的活动未按非减序排列,可以用 θ (nlogn)的时间重排。
贪心算法的基本要素

最优子结构

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

贪心算法和动态规划算法都要求问题具 有最优子结构性质,这是两类算法的一 个共同点。但是,对于具有最优子结构 的问题应该选用贪心算法还是动态规划 算法求解?是否能用动态规划算法求解的 问题也能用贪心算法求解?
1 i n
All 0

All 0
因此,(y1,y2,…,yn)是一个满足贪心选择性质的最优解。

然后,证明该问题具有最优子结构性质。

设(x1,x2,…,xn)是最优装载问题的一个满足贪心选择 性质的最优解,则x1=1,(x2,…,xn)是轮船载重为cw1且待装船集装箱为{2,3,…,n}时相应最优装载问 题的一个最优解。

算法设计与分析第三版第四章课后习题答案

算法设计与分析第三版第四章课后习题答案

算法设计与分析第三版第四章课后习题答案4.1 线性时间选择问题习题4.1问题描述:给定一个长度为n的无序数组A和一个整数k,设计一个算法,找出数组A中第k小的元素。

算法思路:本题可以使用快速选择算法来解决。

快速选择算法是基于快速排序算法的思想,通过递归地划分数组来找到第k小的元素。

具体步骤如下: 1. 选择数组A的一个随机元素x作为枢纽元。

2. 使用x将数组划分为两个子数组A1和A2,其中A1中的元素小于等于x,A2中的元素大于x。

3. 如果k等于A1的长度,那么x就是第k小的元素,返回x。

4. 如果k小于A1的长度,那么第k小的元素在A1中,递归地在A1中寻找第k小的元素。

5. 如果k大于A1的长度,那么第k小的元素在A2中,递归地在A2中寻找第k-A1的长度小的元素。

6. 递归地重复上述步骤,直到找到第k小的元素。

算法实现:public class LinearTimeSelection {public static int select(int[] A, int k) { return selectHelper(A, 0, A.length - 1, k);}private static int selectHelper(int[] A, int left, int right, int k) {if (left == right) {return A[left];}int pivotIndex = partition(A, left, righ t);int length = pivotIndex - left + 1;if (k == length) {return A[pivotIndex];} else if (k < length) {return selectHelper(A, left, pivotInd ex - 1, k);} else {return selectHelper(A, pivotIndex + 1, right, k - length);}}private static int partition(int[] A, int lef t, int right) {int pivotIndex = left + (right - left) / 2;int pivotValue = A[pivotIndex];int i = left;int j = right;while (i <= j) {while (A[i] < pivotValue) {i++;}while (A[j] > pivotValue) {j--;}if (i <= j) {swap(A, i, j);i++;j--;}}return i - 1;}private static void swap(int[] A, int i, int j) {int temp = A[i];A[i] = A[j];A[j] = temp;}}算法分析:快速选择算法的平均复杂度为O(n),最坏情况下的复杂度为O(n^2)。

计算机算法设计与分析(第4版)[王晓东][电子教案]第1章

计算机算法设计与分析(第4版)[王晓东][电子教案]第1章

• (3)多项式函数 • p(n)= a0+a1n+a2n2+…+adnd; ad>0; • p(n) = (nd); • f(n) = O(nk) f(n)多项式有界; • f(n) = O(1) f(n) c; • k d p(n) = O(nk) ; • k d p(n) = (nk) ; • k > d p(n) = o(nk) ;
exp1?exp2:exp3 y= x>9 ? 100:200; 等价于: if (x>9) y=100; else y=200;
(1.3) switch语句:
switch (expression) { case 1: statement sequence; break; case 2: statement sequence; break; default: statement sequence;
• (1)最坏情况下的时间复杂性 • Tmax(n) = max{ T(I) | size(I)=n } • (2)最好情况下的时间复杂性 • Tmin(n) = min{ T(I) | size(I)=n } • (3)平均情况下的时间复杂性
• Tavg(n) = p(I)T(I) siz(eI)n
项留下的主项。它比T(n) 简单。
渐近分析的记号
• 在下面的讨论中,对所有n,f(n) 0,g(n) 0。 • (1)渐近上界记号O • O(g(n)) = { f(n) | 存在正常数c和n0使得对所有n n0有:
0 f(n) cg(n) } • (2)渐近下界记号 • (g(n)) = { f(n) | 存在正常数c和n0使得对所有n n0有:
int max(int x,int y) {

《算法设计与分析》(全)

《算法设计与分析》(全)
巢湖学院计算机科学与技术系
1.1、算法与程序
程序:是算法用某种程序设计语言的具体实现。 程序可以不满足算法的性质(4)。 例如操作系统,是一个在无限循环中执行的程序, 因而不是一个算法。 操作系统的各种任务可看成是单独的问题,每一个 问题由操作系统中的一个子程序通过特定的算法来实 现。该子程序得到输出结果后便终止。
渐近分析记号的若干性质
(1)传递性: ➢ f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n)); ➢ f(n)= O(g(n)), g(n)= O (h(n)) f(n)= O (h(n)); ➢ f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n)); ➢ f(n)= o(g(n)), g(n)= o(h(n)) f(n)= o(h(n)); ➢ f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n)); (2)反身性: ➢ f(n)= (f(n));f(n)= O(f(n));f(n)= (f(n)). (3)对称性: ➢ f(n)= (g(n)) g(n)= (f(n)) . (4)互对称性: ➢ f(n)= O(g(n)) g(n)= (f(n)) ; ➢ f(n)= o(g(n)) g(n)= (f(n)) ;
巢湖学院计算机科学与技术系
渐近分析记号的若干性质
规则O(f(n))+O(g(n)) = O(max{f(n),g(n)}) 的证明: ➢ 对于任意f1(n) O(f(n)) ,存在正常数c1和自然数n1,使得对
所有n n1,有f1(n) c1f(n) 。 ➢ 类似地,对于任意g1(n) O(g(n)) ,存在正常数c2和自然数
巢湖学院计算机科学与技术系
第1章 算法引论

大学_计算机算法设计与分析第4版(王晓东著)课后答案下载

大学_计算机算法设计与分析第4版(王晓东著)课后答案下载

计算机算法设计与分析第4版(王晓东著)课后答
案下载
计算机算法设计与分析第4版内容简介
第1章算法概述
1.1 算法与程序
1.2 算法复杂性分析
1.3 NP完全性理论
算法分析题1
算法实现题1
第2章递归与分治策略
2.1 递归的概念
2.2 分治法的基本思想
2.3 二分搜索技术
2.4 大整数的乘法
2.5 Strassen矩阵乘法
2.6 棋盘覆盖
2.7 合并排序
2.8 快速排序
2.9 线性时间选择
2.10 最接近点对问题
第3章动态规划
第4章贪心算法
第5章回溯法
第6章分支限界法
第7章随机化算法
第8章线性规划与网络流
附录A C++概要
参考文献
计算机算法设计与分析第4版目录
本书是普通高等教育“十一五”__规划教材和国家精品课程教材。

全书以算法设计策略为知识单元,系统介绍计算机算法的设计方法与分析技巧。

主要内容包括:算法概述、递归与分治策略、动态规划、贪心算法、回溯法、分支限界法、__化算法、线性规划与网络流等。

书中既涉及经典与实用算法及实例分析,又包括算法热点领域追踪。

为突出教材的`可读性和可用性,章首增加了学习要点提示,章末配有难易适度的算法分析题和算法实现题;配套出版了《计算机算法设计与分析习题解答(第2版)》;并免费提供电子课件和教学服务。

计算机算法设计与分析(第4版)[王晓东][电子教案]第1章

计算机算法设计与分析(第4版)[王晓东][电子教案]第1章
• f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n));
• (2)反身性: • f(n)= (f(n)); • f(n)= O(f(n)); • f(n)= (f(n)). • (3)对称性: • f(n)= (g(n)) g(n)= (f(n)) . • (4)互对称性: • f(n)= O(g(n)) g(n)= (f(n)) ;
算法(Algorithm)
• 算法是指解决问题的一种方法或一个过程。 • 算法是若干指令的有穷序列,满足性质: • (1)输入:有外部提供的量作为算法的输入。 • (2)输出:算法产生至少一个量作为输出。 • (3)确定性:组成算法的每条指令是清晰,无歧义的。 • (4)有限性:算法中每条指令的执行次数是有限的,执
• (1)最坏情况下的时间复杂性 • Tmax(n) = max{ T(I) | size(I)=n } • (2)最好情况下的时间复杂性 • Tmin(n) = min{ T(I) | size(I)=n } • (3)平均情况下的时间复杂性
• Tavg(n) = p(I)T(I) siz(eI)n
问题求解problemsolving证明正确性分析算法设计程序理解问题精确解或近似解选择数据结构算法设计策略设计算法算法复杂性分析算法复杂性算法所需要的计算机资源其中n是问题的规模输入大小
计算机算法设计与分析(第4版)
王晓东 编著 电子工业出版社
第1章 算法概述
学习要点: • 理解算法的概念。 • 理解什么是程序,程序与算法的区别和内在联系。 • 掌握算法的计算复杂性概念。 • 掌握算法渐近复杂性的数学表述。 • 掌握用C++语言描述算法的方法。
• 规则O(f(n))+O(g(n)) = O(max{f(n),g(n)}) 的证明:

大学计算机基础-04-算法分析与设

大学计算机基础-04-算法分析与设

4.1 算法的基本概念
用流程图表示算法直观形象,比较清楚地显示出各个框之间的 逻辑关系。但这种流程图占用篇幅较多,尤其当算法比较复杂时, 画流程图既费时又不方便。在结构化程序设计方法推广之后,经常 采用N-S结构化流程图代替传统的流程图。 N-S流程图是一种适于结构化程序设计的流程图。在N-S流程图 中,完全去掉了带箭头的流程线,全部算法写在一个矩形框内,在 该框内可以包含其它从属于它的框,或者说,由一些基本的框组成 一个大的框。
4.1 算法的基本概念
一个算法必须具备以下性质:
• 确定性。算法中每一个步骤都必须是确切定义的,不能产生二义性。 • 可行性。算法必须是由一系列具体步骤组成的,并且每一步都能被计算机所 理解和执行。 • 有穷性。一个算法必须在执行有穷步后结束,每一步必须在有穷的时间内完 成。 • 输入。一个算法可以有零个或多个输入,这取决于算法要实现的功能。 • 输出。一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有 输出的算法是毫无意义的。
4.1 算法的基本概念
对算法的学习包括5个方面的内容: • 设计算法 • 表示算法 • 确认算法 • 分析算法 • 验证算法
4.1 算法的基本概念
4.1.2 设计算法原则和过程 对于一个特定问题的算法在大部分情况下都不是唯一的。也就 是说,同一个问题,可以有多种解决问题的算法,而对于特定的问 题、特定的约束条件,相对好的算法还是存在的。因此,在特定问 题、特定的条件下,选择合适的算法,会对解决问题有很大帮助; 否则前人的智慧我们不能借鉴,凡事就都得自己从头研究了,这就 是所谓的要去“发明轮子(Invent the wheel)”。
4.1 算法的基本概念
对于这四层含义,第①层次要求最低,因为仅仅没有语法错误 实在谈不上是好算法。而第④层次是最困难的,我们几乎不可能逐 一验证所有的输入都得到正确的结果。 因此,算法的正确性在大部分情况下都不可能用程序来证明, 而是用数学方法证明的。证明一个复杂算法在所有层次上都是正确 的,代价非常昂贵。所以一般情况下,我们把层次③作为一个算法 是否正确的标准。

《计算机算法设计与分析》PPT第四章贪心算法资料

《计算机算法设计与分析》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
贪心算法的一般框架

计算机算法设计与分析第1章王晓东(第三版)第4章

计算机算法设计与分析第1章王晓东(第三版)第4章

计算机算法设计与分析第1章王晓东(第三版)第4章第4章贪心算法学习要点理解贪心算法的概念。

掌握贪心算法的基本要素(1)最优子结构性质(2)贪心选择性质理解贪心算法与动态规划算法的差异理解贪心算法的一般理论通过应用范例学习贪心设计策略。

(1)活动安排问题;(2)最优装载问题;(3)哈夫曼编码;(4)单源最短路径;(5)最小生成树;(6)多机调度问题。

顾名思义,贪心算法总是作出在当前看来最好的选择。

也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。

当然,希望贪心算法得到的最终结果也是整体最优的。

虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。

如单源最短路经问题,最小生成树问题等。

在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。

4.1活动安排问题活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子。

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

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

4.1活动安排问题设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。

每个活动i都有一个要求使用该资源的起始时间i和一个结束时间fi,且i<fi如果选择了活动i,则它在半开时间区间[i,fi)内占用资源。

若区间[i,fi)与区间[j,fj)不相交,则称活动i与活动j是相容的。

也就是说,当i≥fj或j≥fi时,活动i与活动j相容。

4.1活动安排问题下面给出解活动安排问题的贪心算法GreedySelector:template<claType>voidGreedySelector(intn,Type[],Typef[],boolA[]){A[1]=true;intj=1;for(inti=2;i<=n;i++){if([i]>=f[j]){A[i]=true;j=i;}eleA[i]=fale;}}各活动的起始时间和结束时间存储于数组和f中且按结束时间的非减序排列4.1活动安排问题由于输入的活动以其完成时间的非减序排列,所以算法greedySelector每次总是选择具有最早完成时间的相容活动加入集合A中。

计算机算法设计与分析第版王晓东电子优选文档

计算机算法设计与分析第版王晓东电子优选文档

问题求解(Problem Solving)
理解问题 精确解或近似解
选择数据结构 算法设计策略
设计算法 证明正确性
分析算法 设计程序
算法复杂性分析
• 算法复杂性=算法所需要的计算机资源 • 算法的时间复杂性T(n); • 算法的空间复杂性S(n)。 • 其中n是问题的规模(输入大小)。
算法的时间复杂性
default: statement sequence;
}
(2)迭代语句:
• (2.1) for循环: • for (init;condition;inc) statement; • (2.2) while循环: • while (condition) statement; • (2.3) do-while循环: • do{ • statement; • } while (condition);
(6.3)运算符delete:
• 当动态分配的存储空间已不再需要时应及时释放所占 用的空间。
• 用运算符delete来释放由new分配的空间。 • 例: • delete y; • delete [ ]x; • 分别释放分配给 y的空间和分配给一维数组x的空间。
(3)跳转语句:
• (3.1) return语句: • return expression; • (3.2) goto语句: • goto label; • • label:
(4)函数:
return-type function name(para-list) {
body of the function }
• >0使得对所有n n0有:0 f(n)<cg(n) } 等价于f(n) /g(n) 0,asn 。

• (4非紧下界记号) • (g(n)) = {f(n) |对于任何正常数c>0,存在正数和n0

计算机算法设计与分析(王晓东第4版)第4章

计算机算法设计与分析(王晓东第4版)第4章
School of Computer and Communication Engineer 30
23
最优解代价公式
c[i, j ]: Sij 最优解的大小 c[i, j ] = 0 if Sij = φ maxak ∈Sij {c[i, k ] + c[k, j ] + 1} if Sij = φ
School of Computer and Communication Engineer
24
活动选择问题动态规划方法
schoolcommunicationengineer一步一步构建问题的最优解决方案其中每一步只考虑眼前的最佳选择对解空间进行搜索时在局部范围内进行择优选取决定下一步搜索方向不是为了找到全部解而只是找出一种可行解在一定的情况下贪心算法找出的可行解将是最优解schoolcommunicationengineer42贪贪贪心心心算算算法法法基基基本本本要要要素素素算法包含一系列步骤每一步都有一组选择做出在当前看来最好的选择一个贪心算法是否产生最优解需要严格证明schoolcommunicationengineer最优子结构schoolcommunicationengineer贪贪贪心心心选选选择择择性性性质质质定定定义义义若若若一个优化问题的全局最优解可以通过局部最优选择得到则该问题称为具有贪贪贪心心心选选选择择择性性性
School of Computer and Communication Engineer 4
4.2 贪 心 算 法 基 本 要 素
• 算法包含一系列步骤, 每一步都有一组选择, 做出在 当前看来最好的选择 • 希望通过作出局部最优选择达到全局最优选择 • 一个贪心算法是否产生最优解, 需要严格证明
School of Computer and Communication Engineer

计算机算法设计与分析第4版

计算机算法设计与分析第4版

算法(Algorithm)
现代谜题
有4个人打算过桥,它们都在桥的某一端。我们有17分 钟让他们全部到达大桥的另一头。时间是晚上,他们 只有一只手电筒。最多只能有两个人同时过桥,而且 必须携带手电筒。必须步行将手电筒带来带去,不能 扔来扔去。每个人走路的速度是不同的:甲过桥需要1 分钟,乙要2分钟,丙要5分钟,丁要10分钟。两个人 一起走的速度等于其中较慢的人的速度。请给出过桥 的方案。
算法设计与分析的步骤
算法理论正确,但设计出的算法并不正确
例1:已知A=1012 B=-1012 C=1,计算A+B+C的值
计算方法有两个:A+B+C=1
A+C+B=0
出现上述情况原因:使用工具只能表示七位,即计算机的 精度问题
算法设计与分析的步骤
例2:求解方程x2-(1015+1)*x+1015=0的根
4.

简单性
含义:算法简单,程序结构简单。 好处:

容易验证正确性 便于程序调试

简单的算法效率不一定高。要在保证一定效率的 前提下力求得到简单的算法。
分析算法的基本原则
5. 最优性

含义:指求解某类问题中效率最高的算法 两种最优性(设A是解某个问题的算法)

最坏情况:如果在解这个问题的算法类中没有其它算法在最 坏情况下的时间复杂性比A在最坏情况下的时间复杂性低, 则称A是解这个问题在最坏情况下的最优算法。 平均情况:如果在解这个问题的算法类中没有其它算法在平 均情况下的时间复杂性比A在平均情况下的时间复杂性低, 则称A是解这个问题在平均情况下的最优算法。
算法设计与分析的步骤
3.
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

• 然后,证明该问题具有最优子结构性质。在贪心 选择了e1后,原问题简化为对E中所有与e1相容的 活动进行活动安排的子问题。
– 即证明,若A是原问题的一个最优解,则A’ = A - {e1}是 活动安排问题E’ = ,i∈E: si ≥ f1}的一个最优解。 – 如若不然,假设我们找到E’的一个解B’,它包含比A’更 多的活动,则将e1加入到B’中将产生E的一个解B,它包 含比A更多的活动。这与A是原问题的最优解相矛盾。 – 因此,每一步所作的贪心选择都将问题简化为一个更 小的与原问题具有相同形式的子问题。
设待安排的11个活动的开 始时间和结束时间按结束 时间的非减序排列如下:
i 1 si 1 fi 4
2
3 4 5 6 7 8 9 10 11
3
0 5 3 5 6 8 8 2 12
5
6 7 8 9 10 11 12 13 14
• 算法分析
– 算法的效率很高。当输入的活动已按结束时间 非减序排列时,算法只需O(n)的时间安排n个活 动,使最多的活动能相容地使用公共资源。如 果所给出的活动未按非减序排列,可以用 O(nlogn)的时间预排序。
• 例如活动安排问题中,B = A - {ek}∪{ej}
最优装载
• 有一批集装箱要装上一艘载重为c的轮船。 其中集装箱i的重量为wi。最优装载问题要 求确定,在装载体积不受限制的情况下, 应如何装载才能将尽可能多的集装箱装上 轮船。 • 形式化描述为: xi {0,1}, 1 i n 解向量
已证原问题的一个最优解是以贪心选择开始。假设i次贪心选择能够得到一 个最优解,那么i+1次贪心选择也能得到一个最优解。
• 对贪心选择次数用数学归纳法即知,该贪 心算法最终产生原问题的一个最优解。
i次贪心选择 非贪心策略所选 按结束时间排序 的结果
考察原问题的一个最优解A = {e1, … , ei, ek, … (修改A)令B = {e1, … , ei, ej, …
– 设(x1,x2,…,xn)是最优装载问题的一个满足贪心选 择性质的最优解,则x1=1,(x2,…,xn)是轮船载重 为c-w1且待装船集装箱为,2,3,…,n-时相应最优装 载问题的一个最优解。
• 因此,最优装载问题具有贪心选择性质和 最优子结构性质,采用“重量最轻者先装” 的贪心选择策略能够得到整体最优解。
… , x i , x k, … (修改A)令B={x1, … , xi, xj, …
-
证明用xj替换xk后能够得到另 一个最优解B,B=A-{xk}∪{xj}
第i+1次贪心选择的结果
贪心算法的基本思路
• 根据题意,选取一种贪心选择策略,然后按这种策略对n 个输入排序,按顺序一次输入一个值。如果这个输入和当 前已构成的部分最优解加在一起不能产生一个可行解,则 不把此输入加到这部分解中。
用ej替换ek,因fj<fk,故得到 另一个最优解B=A-{ek}∪{ej}
-
E-{e1,…,ei}中具有最早结束 时间且与ei相容的活动
最早结束时间 原 问 题 的 n 个 活 动 排 序 后 的 n 个 活 动 与最近一次加入的 活动相容 A’(1) A’(j) S(1) S(2) …
A(1) A(2) … A(n)
第四章 贪心算法
(Greedy)
背包问题
• 给定n种物品和一个背包。物品i的重量是wi,其价 值为vi,背包的容量为c。问应如何选择装入背包 的物品,使得装入背包中物品的总价值最大? • 在选择物品i装入背包时,可以选择物品i的一部分, 而不一定要全部装入。
约束条件
目标函数 解向量
w x
i 1 n
3. 若将这种物品全部装入背包后,背包内物品的总重量 未超过背包的载重M,则选择单位重量价值次高的物品 并尽可能多地装入 Knapsack_greedy(n, M, v[], w[], x[]) O(nlogn) Sort(n,v,w) for i = 1 to n do // 初始化解向量 x[i] = 0 c=M // c是背包当前载重 O(n) for i = 1 to n do if w[i] > c break x[i] = 1 c = c - w[i] if i ≤ n x*i+ = c/w*i+ // 装入第i个物品的一部分
– 最优子结构性质是该问题可用动态规划算法或 贪心算法求解的关键特征。
活动安排问题
• 要求高效地安排一系列争用某一公共资源(例如 会议室)的活动(使尽可能多的活动能兼容使用 公共资源)。
– 设有n个活动的集合E={e1,e2…en},其中每个活动都要求 使用同一资源,而在同一时间内只有一个活动能使用 这一资源。每个活动i都有一个要求使用该资源的起始 时间si和一个结束时间fi,且si<fi。如果选择了活动i,则 它在半开时间区间[si,fi)内占用资源。 – 若区间[si,fi)与区间[sj,fj)不相交,则称ei和ej是相容的。 也就是说,当si≥fj或sj≥fi时,活动i和活动j相容。
对于活动安排问题,每次选择具有最早结束时间的活动能够得 到整体最优解,即它最终所确定的相容活动集合A的规模最大。
设E={e1,e2…en}是按结束时间排序的活动集合, 则e1具有最早的结束时间。
• 首先,证明该问题具有贪心选择性质。也就是说, 该问题有一个最优解以贪心选择开始,即该最优 解中包含e1。
ith a1 , … , ai
, ai+1, … , an
ith
a1

ai
, ai+1, … , an
sorted
贪心算法 vs. 动态规划
• 在动态规划算法中,每步所做的选择往往依赖于 相关子问题的解,因而只有在解出相关子问题后, 才能做出选择。
根据子问题的解进行选择
• 而在贪心算法中,仅在当前状态下做出最好选择, 即局部最优选择,然后再去解做出这个选择后产 生的相应的子问题。
– 设A是所给活动安排问题的一个最优解。将A中活动也 按结束时间非减序排列,则A中的第一个活动是ek。 – 若k=1,则A就是一个以贪心选择开始的最优解。 – 若k>1,则我们设B = A - {ek}∪{e1}。//用e1替换ek – 由于f1≤fk,且A中活动是相容的,故B中的活动也是相容 的。又由于B中活动个数与A中活动个数相同,且A是最 优的,故B也是最优的。因此,总存在一个以贪心选择 开始的最优活动安排方案。
先选择,再得到子问题的解
动态规划的解题框架
贪心算法的解题框架
贪心算法的基本要素
• 贪心选择性质:所求问题的全局最优解可 以通过一系列局部最优的选择(即贪心选 择)来达到。
– 这是贪心算法与动态规划算法的主要区别。
• 最优子结构性质:当原问题的最优解包含 子问题的最优解时,称此问题具有最优子 结构性质。
n
i i
c
装满背包
max vi xi
i 1
X {x1 , x2 ,..., xn }
Xi ∈[0,1]


如何选择物品装入的优先级(贪心策略)?
价值贪心策略:优先选择价值最大的物品
• 如果所选择的物品重量很大,使得背包载重的消耗速度太快 不能保证目标函数的值快速增加


重量贪心策略:优先选择重量最小的物品
• 给定一个带权有向图G=(V,E),每条边的权是一个 非负实数,还给定V中的一个顶点,称为源。计算 从源到所有其他顶点的最短路径长度(即路上各 边权之和)。
v0
10 v1 30 15 20
v2
10 v3
4 v4
10
• Dijkstra’s algorithm
首先证明原问题的一个最优解是以贪心选择开始。然后假设i次贪心选择能 够得到一个最优解,那么证明i+1次贪心选择也能得到一个最优解。
• 证明kna排序后依次选择物品直到装满背包, 能够得到问题的一个整体最优解。
i次贪心选择 非贪心策略所选 的结果 将原问题的一个最优解A按照量度标准排序 A={x1,

价值重量比策略:将物品按单位重量价值降序排序, 从第一项开始装背包,然后是第二项,依此类推,尽 可能的多放,直到装满背包。
• 优先选择既使目标函数的值增加最快,又使背包载重的消耗 较慢的物品
• knapsack_greedy算法:选择物品单位重量的价值 作为物品装入的优先级
1. 计算每种物品单位重量的价值vi / wi O(n) 2. 将尽可能多的单位重量价值最高的物品装入背包 O(nlogn)
贪心算法的正确性证明
• 证明每一步所做的贪心选择最终能够得到问题的 一个整体最优解。
– 首先证明问题的一个最优解以贪心选择开始。
贪心选择 • 考察问题的一个整体最优解,并证明可修改这个最优解,使其 以贪心选择开始。// 例如活动安排问题中,B = A - {ek}∪{e1} 性质
– 进一步证明做了贪心选择后,原问题的最优解包含了 子问题的最优解。
• 活动安排问题就是要在所给的活动集合中选出最大的相容 活动子集合。
反例
• 贪心选择策略
– – – – – 选择具有最早开始时间的活动? 选择具有最早结束时间的活动? 选择具有最少占用时间的活动? 选择覆盖未选择活动最少的活动? ……
t
• 直观上,每次选择具有最早结束时间的相容活动,使剩余 的可安排时间段极大化,以便安排尽可能多的相容活动。
• 先假设由原问题的最优解导出的子问题的最优解不是最优的, 最优子结构 再说明在这个假设下可构造出比原问题最优解更好的解,从而 导致矛盾。//例如活动安排问题中,若A是原问题E的一个最优 性质 解,则A-{e1}是活动安排问题E’ = {i∈E: si≥f1}的一个最优解
– 然后,用数学归纳法证明,通过每一步贪心选择,最 终可得到问题的一个整体最优解。
相关文档
最新文档