第10章 算法设计策略和应用实例
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相同的子问题; 子问题的规模缩小到一定的程度,就不需要再 分解,可以很容易地求解; 所有子问题的解能够合并成原问题的解。
10.1.2 算法设计步骤和程序模式
原问题 问题分解 子问题 求解子问题 子问题解 子问题 求解子问题 子问题解 合并子解 原问题的解 … … 子问题 求解子问题 子问题解
图10-1 分治策略示意图
分治策略的一般程序模式如下: divide-and-conquer(P) { if ( Small(P) ) return S(P); else { //把问题 P 分解成成子问题P1,P2,...,Pk (k 1); for(i=1;i<=k;i++) yi=divide-and-conquer(Pi); return combine(y1,...,yk); } }
如图10-1所示,采用分治策略的算法设计都包括分解、求 解和合并三个步骤: (1)分解:将原问题分解为若干个规模较小、相互独立、 与原问题类型相同或相似的子问题; (2)求解:若子问题缩小到容易解决的规模,则直接求 解,否则递归地求解子问题; (3)合并:将各个子问题的解合并为原问题的解。
10.1.2 算法设计步骤和程序模式
10.2.3 算法设计步骤及程序模式
贪心策略的算法设计步骤一般分为四步:
建立数学模型来描述问题;
把求解的问题分成若干个子问题;
求解子问题,得到子问题的局部最优解; 通过贪心选择,扩展子问题的局部最优解,直到
构成问题的完整解。
10.2.3 算法设计步骤及程序模式
贪心策略的程序模式一般为: Greedy(C) //C是问题的输入集合,即候选集合 { S={ }; //初始解集合为空集 while (not Solution(S)) //集合S没有构成问题的一个解 { x=Select(C); //在候选集合C中做贪心选择 if Feasible(S, x) //判断集合S中加入x后的解是否可行 { S=S+{x}; C=C-{x}; } } return S; }
10.2.4 贪心策略应用实例
由于输入的活动是以其完成时间的非递减序排列 ,所以贪心算法每次总是选择具有最早完成时间 的相容活动加入A中。直观上,按这种方法选择 相容活动就为未安排的活动留下尽可能多的时间 。也就是说,该算法的贪心选择是使剩余的可安 排时间极大化,以便安排尽可能多的相容活动。 贪心策略求解活动安排问题的时间复杂度为O(n) 。在GreedySelector算法中,集合A用来存储所选 择的活动。活动i在集合A中,当且仅当A[i]的值为 true。变量j用以记录最近一次加入到A中的活动 。
最后,矩阵乘积的结果由7个矩阵得出。
10.1.3 分治策略应用实例
C11 C12 M 1 M 4 M 5 M 7 C M2 M4 C21 C22 M1 M 3 M 2 M 6 M3 M5
分析:按照矩阵的定义,两个n阶矩阵乘积 中有n2个元素,计算每个元素需要n次乘法和 (n-1)次加法,所以需要n3次乘法和n2(n-1)次加 法,其时间复杂度为O(n3),而通过分治策略设 计的矩阵乘积算法可以降低时间复杂度为 O(n2.81)。
10.1.3 分治策略应用实例
【例10-2】大整数乘法。在一些像密码技术的应用中, 需要进行超过100位的十进制整数的乘法运算。因为计 算机对于整数字节数的限制,所以无法直接运算大整 数乘积,这就需要研究高效的大整数乘法算法。 设X和Y是两个n位的大整数,采用分治策略的大整 数乘法的基本思想是将n位的整数X和Y都分成两部分, m m ,则 n / 2 X A 10 B 每部分的长度约为 和 Y C 10m D。 因此
问题具有最优子结构性质,也称此问题满足最优化原 理。问题的最优子结构性质是该问题可以用贪心策略 或者动态规划策略求解的关键特征。 贪心选择性 若一个问题的全局最优解可以通过一系列局部最优的 选择,即贪心选择来获得,则称该问题具有贪心选择 性。
10.2.2 贪心策略概述
贪心选择性可从如下三个方面来理解:
图10-3 拟建运动场示意图
10.2.1最优化问题与最优化原理
2.最优化原理 1951年,美国数学家R.E.Bellman等人根据多阶段决 策问题的特点,提出了解决这类问题的最优化原理 (Principle of optimality)。 最优化原理的数学语言描述为:假设为了解决某一优 化问题,需要依次作出n个决策D1、D2、…、Dn。如果 这个决策序列是最优的,那么对于任何一个整数k(1 < k < n),则Dk+1、Dk+2、…、Dn也是最优的,因为不论 前面k个决策是怎样的,以后的最优决策只取决于前面 决策所确定的当前状态。
10.2.4 贪心策略应用实例
【例10-5】任务调度问题。每项任务需要一个单 位的工作时间,并且每项任务都有一个截止时间 和奖励。如果任务在截止时间之前开始,就可以 获得奖励,否则就不能获得奖励。问题是如何安 排任务以获得最多的奖励。注意不需要完成所有 任务。
10.2.4 贪心策略应用实例
例如,表10-1所示的任务调度问题实例,任务1的截止时间为2指 的是任务1要在时间1或者时间2开始,否则就超过截止时间。任务 2的截止时间为1意味着任务2只能在时间1开始。因此,可能的任 务调度有[1, 3]、[2, 1]、[2, 3]、[3, 1]、[4, 1]、[4, 3]。通过观察发 现,一种合理的贪心选择策略如下:先按照任务的奖励从高到低 排序,根据这个顺序检查每个任务,如果满足截止时间的约束就 加入该任务。 表10-1任务调度问题实例 任务 截止时间 奖励 1 2 30 2 1 35 3 2 25 4 1 40
10.2.4 贪心策略应用实例
【例10-4】用贪心策略求解活动安排问题。设有n 个活动的集合E={1,2, …,n},其中每个活动都要 求使用同一资源,而在同一时间内只有一个活动 能使用这一资源。每个活动i都有一个要求使用该 资源的起始时间si 和结束时间fi 且si < fi 。如果选 择了活动i,则它在半开时间区间 [si ,fi ) 内占用资 源。若区间[si ,fi )与区间[sj ,fj ) 不相交,则称活动 i与活动j是相容的。也就是说,当si ≥ fj或sj ≥ fi时 ,活动i与活动j相容。 活动安排问题就是要在所给的活动集合中选出数 量最多的相容活动子集合。
C11 C12 A11 C 21 C22 A21 A12 B11 A22 B21 B12 B22
10.1.3 分治策略应用实例
Strassen计算如下7个矩阵。
10.1.3 分治策略应用实例
M 1 ( A11 A22 )( B11 B22 ) M 2 ( A21 A22 ) B11 M 3 A11 ( B12 B22 ) M 4 A22 ( B21 B11 ) M 5 ( A11 A12 ) B22 M 6 ( A21 A11 )( B11 B12 ) M 7 ( A12 A22 )( B21 B22 )
10.1.1 概述
分治策略是一类算法设计策略,它将原问 题分解成若干部分,从而产生若干子问题,这 些子问题互相独立且与原问题类型相同,然后 解决这些子问题,最后把这些子问题的解合并 成原问题的解。
10.1.1 概述
分治策略所能解决的问题,一般具有以下 三个特征:
原问题可以分解成规模较小、相互独立和类型
分析:按照整数乘法的定义,两个n位整数的时间复 杂度为O(n2),而简单的分治策略把两个n位整数的乘法转 换需要4次乘法的m位整数的乘法,并没用降低时间复杂 度,但是通过把乘法次数降为3次,大整数乘法的时间复 杂度为O(n1.58)。
10.1.3 分治策略应用实例
【例10-3】计算一个数列的逆序数量。例如, 已知一个数列3、1、2、5、4,则其中存在三个 逆序:(3,1),(3,2),(5,4),如图 10-2所示。穷举法的用时为O(n2),而采用分治策 略设计的算法时间复杂度为O(nlogn)。 采用分治策略计算逆序数量的基本思想:假 设数列保存在数组a中,将数组a中的元素划分成 大致相等的前后两部分a1和a2,然后分别计算a1 和a2中逆序的数量,最后计算逆序对(ai,aj)的 数量,其中ai是a1中的元素,aj是a2中的元素。
XY ( A 10m B) (C 10m D) AC102 m ( AD BC )10m BD
10.1.3 分治策略应用实例
直接用此公式计算并不是很有效,而用如下的方法可 以减少乘法的次数。
R ( A B) (C D) AC AD BC BD AD BC R AC BD XY ( A 10m B) (C 10m D) AC102 m ( R AC BD)10m BD
百度文库
10.2.2 贪心策略概述
贪心策略通过一系列步骤来构造问题的解,每一步
都做出当前来看最好的选择,扩展已知的部分解, 直到获得问题的完整解。这种“当前来看最好的选 择”的策略就是该策略名称的来源。 贪心策略求解的问题一般具有以下两个重要的性质
最优子结构性
当一个问题的最优解包含其子问题的最优解时,称此
10.2 贪心策略
贪心策略是比较容易的算法设计策略,虽然 它看上去既直观又简单,但是它却可以广泛地应 用于很多问题的求解,如最短路径问题、最小生 成树、Huffman编码、作业调度问题等。本节主 要介绍贪心策略的基本知识,然后给出了贪心策 略应用实例。
10.2.1最优化问题与最优化原理
1.最优化问题 最优化问题是在满足一定的限制条件下,对于一个 给定的优化函数,寻找一组参数值,使得函数值最大或 最小。每个最优化问题都包含一组限制条件和一个优化 函数,符合限制条件的求解方案称为可行解,使优化函 数取得最大(小)值的可行解称为最优解。
10.2.1最优化问题与最优化原理
建运动场的问题可以抽象为最优化问题: (1)限制条件是建筑材料为300米。设x和y分别是矩 形的长和宽,限制条件为:x+2y<=300,x>0,y>0。 (2)代表问题解的优劣是矩形面积,即优化函数表示: f(x,y)=xy。 任何一组满足限制条件“x+2y<=300”的x和y都是可 行解,而使“xy”最大的是最优解。
【例10-1】矩阵乘积问题。因为矩阵可以方便地表示 两个集合中元素之间的关系,所以被用于通信网络和交通 运输系统等模型,在这些模型中经常用到矩阵的乘法。根 据矩阵乘积的定义,两个 n 阶矩阵乘积的时间复杂度为 O(n3) 。 Strassen 根据分治策略设计矩阵乘积的算法,降 低时间复杂度。 假设 n为 2的整数幂, A、 B、 C都是 n 阶的矩阵,每个 矩阵可以分解成4个n/2阶的矩阵。
第10章算法设计策略及应用实例 (4课时)
本章介绍了算法设计策略和应用实例,主要 目的有两个:首先,让读者知道每种算法的适用 条件,即何时可以使用和何时不能使用某种算 法设计策略;其次,让读者学习基本的算法设 计策略,即掌握如何描述自己的问题和高效、 快速地解决问题。 本章将进一步介绍五种常用算法设计策略的 基本思想和实现方法,这些策略包括分治策略、 贪心策略、动态规划策略、回溯策略和分支限 界策略,以及它们的具体应用实例。
可行性,即贪心选择必须满足问题的约束;
局部最优性,即贪心选择是当前步骤中所有可行
选择中最佳的局部选择; 不变性,即一旦做出选择,在算法的后面步骤中 就无法改变。
10.2.2 贪心策略概述
总结
贪心策略求解的问题需要具备两个性质: 第一,最优子结构性质; 第二,贪心选择性质。
第一条性质是应用贪心策略的基础,而第二条 性质是决定使用贪心策略的关键。具备第一条 性质的问题,如果不具备贪心选择性,而是具 备子问题重叠性,则考虑用动态规划策略设计 算法。