算法设计与分析 第四章ppt
合集下载
算法设计与分析课堂PPT
105 秒
11
算法算设法计设与计分与析分>析算法>教概学述安排
算法设计与分析
2、对给定的算法如何分析它的运行效率(复杂 性)
在给定的计算模型下,研究算法或问题的 复杂性:上界、下界、平均以及问题固有 复杂性
12
算法算设法计设与计分与析分>析算法>教概学述安排
课程目标
使学生掌握计算机算法的通用设计方法 ,学会分析算法的空间和时间复杂性。对一 定的实际问题,能够设计求解算法并分析算法 的效率。
5
算算法法设设计计与与分分析析>算>教法学概安述排
例如:第17周上交报告的安排如下,16周周日早上发现 什么报告都没有写,如何安排时间以确保每门课的报告
都能如期完成?若不能全部按期完成,也能尽量使迟交
报告的数目减到最小?
学科
算法设 计与分
析
数据库 原理
计算机 体系结
构
微机原 理
生物认 证技术
高级程 序设计 原理
算法设计与分析>算法概述
2.算法设计过程(程序设计过程)
1.问题的陈述 理解问题,并用科学规范的语言把所求解问题进行准
确的描述,包括所有已知条件和输出要求.
2.建立数学模型 通过对问题分析,找出其中所有操作对象以及对象之
间的关系,并用数学语言加以描述. 对非数值型解法来说, 数学模型通常是链表,树,图,集合等数据结构.
基本内容:
第一章 算法概述 第二章 递归与分治 第三章 动态规划 第四章 贪心算法 第五章 回朔法 第六章 分支限界法 第七章 随机化算法
预备知识: 离散数学、数据结构、程序设计语言C、C++
15
算法算设法计设与计分与析分>析算法>教概学述安排
《算法设计与分析》课件
常见的贪心算法包括最小生成树算法 、Prim算法、Dijkstra算法和拓扑排 序等。
贪心算法的时间复杂度和空间复杂度 通常都比较优秀,但在某些情况下可 能需要额外的空间来保存状态。
动态规划
常见的动态规划算法包括斐波那契数列、背包 问题、最长公共子序列和矩阵链乘法等。
动态规划的时间复杂度和空间复杂度通常较高,但通 过优化状态转移方程和状态空间可以显著提高效率。
动态规划算法的时间和空间复杂度分析
动态规划算法的时间复杂度通常为O(n^2),空间复杂度为O(n)。
04 经典问题与算法实现
排序问题
冒泡排序
通过重复地遍历待排序序列,比较相邻元素的大小,交换 位置,使得较大的元素逐渐往后移动,最终达到排序的目 的。
快速排序
采用分治策略,选取一个基准元素,将比基准元素小的元 素移到其左边,比基准元素大的元素移到其右边,然后对 左右两边的子序列递归进行此操作。
动态规划是一种通过将原问题分解为若干个子 问题,并从子问题的最优解推导出原问题的最 优解的算法设计方法。
动态规划的关键在于状态转移方程的建立和状态 空间的优化,以减少不必要的重复计算。
回溯算法
01
回溯算法是一种通过穷举所有可能情况来求解问题的算法设计方法。
02
常见的回溯算法包括排列组合、八皇后问题和图的着色问题等。
空间换时间 分治策略 贪心算法 动态规划
通过增加存储空间来减少计算时间,例如使用哈希表解决查找 问题。
将问题分解为若干个子问题,递归地解决子问题,最终合并子 问题的解以得到原问题的解。
在每一步选择中都采取当前状态下最好或最优(即最有利)的 选择,从而希望导致结果是最好或最优的。
通过将问题分解为相互重叠的子问题,并保存子问题的解,避 免重复计算,提高算法效率。
算法分析与设计动态规划ppt课件
问题的描述 1)二分检索树定义
二分检索树T是一棵二元树,它或者为空,或者其每个 结点含有一个可以比较大小的数据元素,且有:
·T的左子树的所有元素比根结点中的元素小; ·T的右子树的所有元素比根结点中的元素大; ·T的左子树和右子树也是二分检索树。 注: ·二分检索树要求树中所有结点的元素值互异
29
二分检索树
COST(n)0
for jn -1 to 1 by –1 do
设r是一个这样的结点,<j, r>∈E且使c(j,r)+COST(r)取小值
COST(j)c(j,r)+COST(r)
D(j)r repeat P(1)1;P(k)n
计算出COST(j)的值, 并找出一条最小成本 路径
for j2 to k-1 do
12
4.2 多段图
多段图向前处理的算法
– 设P(i, j)是一条从Vi中的节点j 到汇点t 的最小 成本路径,COST(i, j)表示这条路径的成本, 根据向前处理方法有公式4.5:
13
多段图的向前处理算法
因为,若<j, t> ∈E成立,有COST(k-1,j)=c(j,t), 若<j, t> ∈E不成立,则有COST(k-1,j)=∞,所以 可以通过如下步骤解式公式(4.5),并求出 COST(1,s)。 首先对于所有j∈Vk-2,计算COST(k-2, j),然后对 所有的j∈Vk-3,计算计算COST(k-3, j)等等,最后 计算出计算COST(1, s)
BCOST(2,4)=3; BCOST(2,5)=2;
21
V1
V2
V3
V4
V5
24
9
1
3
二分检索树T是一棵二元树,它或者为空,或者其每个 结点含有一个可以比较大小的数据元素,且有:
·T的左子树的所有元素比根结点中的元素小; ·T的右子树的所有元素比根结点中的元素大; ·T的左子树和右子树也是二分检索树。 注: ·二分检索树要求树中所有结点的元素值互异
29
二分检索树
COST(n)0
for jn -1 to 1 by –1 do
设r是一个这样的结点,<j, r>∈E且使c(j,r)+COST(r)取小值
COST(j)c(j,r)+COST(r)
D(j)r repeat P(1)1;P(k)n
计算出COST(j)的值, 并找出一条最小成本 路径
for j2 to k-1 do
12
4.2 多段图
多段图向前处理的算法
– 设P(i, j)是一条从Vi中的节点j 到汇点t 的最小 成本路径,COST(i, j)表示这条路径的成本, 根据向前处理方法有公式4.5:
13
多段图的向前处理算法
因为,若<j, t> ∈E成立,有COST(k-1,j)=c(j,t), 若<j, t> ∈E不成立,则有COST(k-1,j)=∞,所以 可以通过如下步骤解式公式(4.5),并求出 COST(1,s)。 首先对于所有j∈Vk-2,计算COST(k-2, j),然后对 所有的j∈Vk-3,计算计算COST(k-3, j)等等,最后 计算出计算COST(1, s)
BCOST(2,4)=3; BCOST(2,5)=2;
21
V1
V2
V3
V4
V5
24
9
1
3
算法设计与分析第04章 贪心算法PPT课件
9
4.1 活动安排问题
若被检查的活动i的开始时间Si小于最近选择的活动j 的结束时间fi,则不选择活动i,否则选择活动i加入集 合A中。
贪心算法并不总能求得问题的整体最优解。但对 于活动安排问题,贪心算法greedySelector却总能求 得的整体最优解,即它最终所确定的相容活动集合A的 规模最大。这个结论可以用数学归纳法证明。
•}
6
4.1 活动安排问题
由于输入的活动以其完成时间的非减序排列,所 以算法greedySelector每次总是选择具有最早完成 时间的相容活动加入集合A中。直观上,按这种方法 选择相容活动为未安排活动留下尽可能多的时间。也 就是说,该算法的贪心选择的意义是使剩余的可安排 时间段极大化,以便安排尽可能多的相容活动。
算法greedySelector的效率极高。当输入的活 动已按结束时间的非减序排列,算法只需O(n)的时间 安排n个活动,使最多的活动能相容地使用公共资源。 如果所给出的活动未按非减序排列,可以用O(nlogn) 的时间重排。
7
4.1 活动安排问题
例:设待安排的11个活动的开始时间和结束时间按结 束时间的非减序排列如下:
13
4.2 贪心算法的基本要素
3.贪心算法与动态规划算法的差异
贪心算法和动态规划算法都要求问题具有最优子结构 性质,这是2类算法的一个共同点。但是,对于具有最 优子结构的问题应该选用贪心算法还是动态规划算法 求解?是否能用动态规划算法求解的问题也能用贪心算 法求解?下面研究2个经典的组合优化问题,并以此说 明贪心算法与动态规划算法的主要差别。
11
4.2 贪心算法的基本要素
1.贪心选择性质
所谓贪心选择性质是指所求问题的整体最优解可以通 过一系列局部最优的选择,即贪心选择来达到。这是 贪心算法可行的第一个基本要素,也是贪心算法与动 态规划算法的主要区别。
4.1 活动安排问题
若被检查的活动i的开始时间Si小于最近选择的活动j 的结束时间fi,则不选择活动i,否则选择活动i加入集 合A中。
贪心算法并不总能求得问题的整体最优解。但对 于活动安排问题,贪心算法greedySelector却总能求 得的整体最优解,即它最终所确定的相容活动集合A的 规模最大。这个结论可以用数学归纳法证明。
•}
6
4.1 活动安排问题
由于输入的活动以其完成时间的非减序排列,所 以算法greedySelector每次总是选择具有最早完成 时间的相容活动加入集合A中。直观上,按这种方法 选择相容活动为未安排活动留下尽可能多的时间。也 就是说,该算法的贪心选择的意义是使剩余的可安排 时间段极大化,以便安排尽可能多的相容活动。
算法greedySelector的效率极高。当输入的活 动已按结束时间的非减序排列,算法只需O(n)的时间 安排n个活动,使最多的活动能相容地使用公共资源。 如果所给出的活动未按非减序排列,可以用O(nlogn) 的时间重排。
7
4.1 活动安排问题
例:设待安排的11个活动的开始时间和结束时间按结 束时间的非减序排列如下:
13
4.2 贪心算法的基本要素
3.贪心算法与动态规划算法的差异
贪心算法和动态规划算法都要求问题具有最优子结构 性质,这是2类算法的一个共同点。但是,对于具有最 优子结构的问题应该选用贪心算法还是动态规划算法 求解?是否能用动态规划算法求解的问题也能用贪心算 法求解?下面研究2个经典的组合优化问题,并以此说 明贪心算法与动态规划算法的主要差别。
11
4.2 贪心算法的基本要素
1.贪心选择性质
所谓贪心选择性质是指所求问题的整体最优解可以通 过一系列局部最优的选择,即贪心选择来达到。这是 贪心算法可行的第一个基本要素,也是贪心算法与动 态规划算法的主要区别。
算法分析与设计PPT教学课件 Algorithms Chapter 4 分治法
n>1
Memory 冒泡 合并 Time
15
Example of merge sort
Example of merge sort sorting a list of random numbers
16
练习 p98-11 Tromino谜题
如何将右图中L型瓦片覆盖到一个缺了一 个方块的2n × 2n的棋盘?
//输入:两个有序数组B[0..p-1]和C[0..q-1]
//输出:非降序列数组A-0..p+q-1] i0; j0; k0; while (i<p and j<q do){
if (n>1){
copy A[0.. [n/2]-1] to B[0..[n/2]-1] ; copy A[[n/2]..n-1] to C[0..[n/2]-1]; Mergesort(B[0..[n/2]-1]);
5
分治法的抽象化控制
1. 2. 3. 4. 5. 6. 7. Divide-and-Conquer(P) if |P|≤n0 判断输入规模是否足够的小 then return(ADHOC(P))//直接解小规模的问题P 将P分解为较小的子问题 P1 ,P2 ,...,Pk for i←1 to k do yi ← Divide-and-Conquer(Pi)//递归解决Pi T ← MERGE(y1,y2,...,yk) // 合并子问题 return(T)
...... ......
I2=(n-[n/2], A[[n/2]-1…n-1])
...... ......
Ih=(1,A[0])
Ii=(1,A[1])
Ij=(1,A[m])
Ik=(1,A[n])
《算法设计与分析教学资料》第4章-PPT课件
6
贪心算法的引入--找币问题
一种更简单可行的方法:
1. 先取2.5 2枚
价值2.5+2.5=5.0
余6.3-5=1.3
2. 再取1.0 1枚
价值1.0
余1.3-1=0.3
3. 不取0.5 0枚
因为0.5>0.3
4. 再取0.1 3枚
价值0.1×3=0.3
余0.3-0.3=0
5. 找零完毕。
6. 得最优解X={ 2, 1, 0, 3 } ,共需最少的硬币数6枚。
方法总结:在不超余额的前提下,每次都找最大面 值的硬币。这种找币的方法叫做贪心算法。
思考:有没有可能不是最好的方法?
7
贪心算法—描述
顾名思义,贪心算法总是作出在当前看来最好的 选择。也就是说贪心算法并不从整体最优考虑, 它所作出的选择只是在某种意义上的局部最优选 择。
当然,希望贪心算法得到的最终结果也是整体最 优的。虽然贪心算法不能对所有问题都得到整体 最优解,但对许多问题它能产生整体最优解。如 单源最短路经问题,最小生成树问题等。
新学期来临,为迎接新生,各院系都要举办迎新晚 会。时间将近,各院系在申请使用学院礼堂进行彩 排。为了提高礼堂使用率,决定白天不间断的开放, 各院系可以上报各自使用的时间区间(开始时间以 及终止时间,时间长短不限),由礼堂管理人员安 排尽可能多的院系在同一天里彩排。
请根据以下时间段尽可能多安排几个院系: [8:00,10:30), [9:00,11:30), [7:00,11:00), [11:30-14:00), [12:00,13:30) , [13:00,15:30), [15:00,16:00), [14:30,16:00), [16:00,18:00)
贪心算法的引入--找币问题
一种更简单可行的方法:
1. 先取2.5 2枚
价值2.5+2.5=5.0
余6.3-5=1.3
2. 再取1.0 1枚
价值1.0
余1.3-1=0.3
3. 不取0.5 0枚
因为0.5>0.3
4. 再取0.1 3枚
价值0.1×3=0.3
余0.3-0.3=0
5. 找零完毕。
6. 得最优解X={ 2, 1, 0, 3 } ,共需最少的硬币数6枚。
方法总结:在不超余额的前提下,每次都找最大面 值的硬币。这种找币的方法叫做贪心算法。
思考:有没有可能不是最好的方法?
7
贪心算法—描述
顾名思义,贪心算法总是作出在当前看来最好的 选择。也就是说贪心算法并不从整体最优考虑, 它所作出的选择只是在某种意义上的局部最优选 择。
当然,希望贪心算法得到的最终结果也是整体最 优的。虽然贪心算法不能对所有问题都得到整体 最优解,但对许多问题它能产生整体最优解。如 单源最短路经问题,最小生成树问题等。
新学期来临,为迎接新生,各院系都要举办迎新晚 会。时间将近,各院系在申请使用学院礼堂进行彩 排。为了提高礼堂使用率,决定白天不间断的开放, 各院系可以上报各自使用的时间区间(开始时间以 及终止时间,时间长短不限),由礼堂管理人员安 排尽可能多的院系在同一天里彩排。
请根据以下时间段尽可能多安排几个院系: [8:00,10:30), [9:00,11:30), [7:00,11:00), [11:30-14:00), [12:00,13:30) , [13:00,15:30), [15:00,16:00), [14:30,16:00), [16:00,18:00)
算法分析与设计-2016-第4讲PPT课件
NP
NPC
多项式变换的符号:
引理3.2:12,23,则13 定义3.10:12,21,则称1和2多项式等价。
定义3.11:NP,1NP,1,则称是NP-Complete的。 NP-完全的。其他人有很多叫法。
简称NPC问题。若是NPC问题,
定义的含义:
有多项式时间算法,则任意NP-问题都有多项式时间求解算法10。
-
8
该说明什么是NP-Complete问题了。
期望:若有一个特殊NP问题,
每个NP问题都存
任则意该一问个题N非P常问特题殊均,可称多为项N式P时-C间om归pl约ete到问该题问。题在算,多法项吗式?时间解答
要求是NP类问题。
若NP-Complete问题可以多项式时间解决, 则其他所有NP问题都可以在多项式时间解决。 所有NP问题都能多项式时间可解,这件事其实很大的重任。 几乎不可能的,所以NP-C问题多项式时间可解, 也是不可能的。
Rabin与Scott两个人最先在IBM做的工作,最先定义的非确定计算。
企图把算法分为两大类,多项式时间的和指数时间的, 其实这样分类是有局限性的,不- 一定完美,但能说明问题。 2
,SAT实例符号集合 L,回答是的SAT实例集合
判定:x *,是否属于L
-
3
多项式变换与NPC类,上次讲到什么是多项式变换。 我们需要什么?定义多项式变换,达到如下目标:
引理3.1:若12,2P,则1P。 注意一点,当多项式可解时,
否的实例也能在多项式时间回答。
证明:回答是的实例能够变换,回答否的实例也能够变换。
当2P时,是和否都能多项式时间回答。
当然1实例回答是和否也能多项式时间回答
下面又要回忆前面的内容了!
算法设计与分析 ppt
算法设计与分析 >目录
第一章 算法概述 第二章 递归与分治策略 第三章 动态规划 第四章 贪心算法 第五章 回朔法 第六章 分支限界法 第七章 随机化算法
1
算法设计与分析 >第一章 目录
1.1 算法与程序 1.2 算法复杂度分析 1.3 NP完全性理论
2
算法设计与分析>算>法算概法述概述
1.1 算法与程序 1 算法定义及其特性
A
是
否
条件成立?
条件成立?
是
否
B
A
B
A
C
14
算法设计与分>析算>法算概法述概述
5. 算法分类
从解法上 数值型算法:算法中的基本运算为算术运算. 非数值型算法:算法中的基本运算为逻辑运算.
从处理方式上 串行算法:串行计算机上执行的算法. 并行算法:并行计算机上执行的算法.
本课程主要介绍非数值型的串行算法.
如果存在一个函数 ~T(n)使得当n ,有
(T(n) - ~T(n)) / T(n)0
称 ~T(n)是T(n)当 n 时的渐进性态 或 渐进复杂性
27
算法设计与分>>析算算法>法算复概法杂述概性分述析 >渐进性态
在数学上,T(n)与 ~T(有n)相同的最高阶项.可取 为~T(略n去) T(n)的低阶项后剩余的主项. 例如 T(n)=3n2+4nlogn+7, 则 ~T(n) 可以是3n2 当n充分大时用 ~T(n)代替T(n)作为算法复杂性的度量, 以简化分析 比较两个算法时,如果他们的阶不同,就可分出效率高低 。故此时只需关心 ~T最(n高) 限的阶即可。可忽略最高项系 数或低阶项。
4
第一章 算法概述 第二章 递归与分治策略 第三章 动态规划 第四章 贪心算法 第五章 回朔法 第六章 分支限界法 第七章 随机化算法
1
算法设计与分析 >第一章 目录
1.1 算法与程序 1.2 算法复杂度分析 1.3 NP完全性理论
2
算法设计与分析>算>法算概法述概述
1.1 算法与程序 1 算法定义及其特性
A
是
否
条件成立?
条件成立?
是
否
B
A
B
A
C
14
算法设计与分>析算>法算概法述概述
5. 算法分类
从解法上 数值型算法:算法中的基本运算为算术运算. 非数值型算法:算法中的基本运算为逻辑运算.
从处理方式上 串行算法:串行计算机上执行的算法. 并行算法:并行计算机上执行的算法.
本课程主要介绍非数值型的串行算法.
如果存在一个函数 ~T(n)使得当n ,有
(T(n) - ~T(n)) / T(n)0
称 ~T(n)是T(n)当 n 时的渐进性态 或 渐进复杂性
27
算法设计与分>>析算算法>法算复概法杂述概性分述析 >渐进性态
在数学上,T(n)与 ~T(有n)相同的最高阶项.可取 为~T(略n去) T(n)的低阶项后剩余的主项. 例如 T(n)=3n2+4nlogn+7, 则 ~T(n) 可以是3n2 当n充分大时用 ~T(n)代替T(n)作为算法复杂性的度量, 以简化分析 比较两个算法时,如果他们的阶不同,就可分出效率高低 。故此时只需关心 ~T最(n高) 限的阶即可。可忽略最高项系 数或低阶项。
4
《计算机算法设计与分析》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
贪心算法的一般框架
算法设计与分析课件
2019/6/10
35
2.3递归技术
以上的关系实际上给出了计算Q(n,m)的 递归式如下递归技术
可以设计出计算Q(n,m)的递归算法如下:
int Q(int n, int m)
{
if((n < 1) || (m < 1))
return 0;
if((n == 1) || (m == 1))
2019/6/10
8
1.2计算复杂性的测度
问题的规模:也就是该问题所谓的体积,或者说是大 小。一个问题的体积可以用一个整数来表示,它是对 问题的输入数据或初始数据的多少的一种量度。
定义:如果一个问题的体积是n,解决这一问题的某一 算法所需要的时间为T(n),它是n的某一函数,T(n)称 作这一算法的“时间复杂性”。当输入量n逐渐增大时, T(n)的极限情形就称作算法的“渐近时间复杂性”, 类似可定义算法的空间复杂性。但实际上人们主要是 研究算法的时间复杂性而很少讨论它们的空间耗费。
2019/6/10
29
2.3递归技术
Acheman函数A(n,m)有两个独立的整变 量m≥0 和 n≥0,其定义如下:
2019/6/10
30
2.3递归技术
A(n,m)的自变量m的每一个值都定义了一个单 变量函数。由递归式的第三式可知m = 0定义 了函数“加2”。
当m = 1时,由于A(1,1) = A(A(0,1),0) = A(1,0) = 2以及A(n,1) = A(A(n-1,1),0) = A(n1,1) + 2 (n > 1),则A(n,1) = 2n (n ≥ 1),即 A(n,1)是函数“乘2”
2019/6/10
14
《算法设计与分析》课件第4章
由此可得,如果我们将活动的完成时间排成升序,那么
子问题空间就是从Sij中选择最大相互相容活动子集,0≤i,j ≤n+1,其他的Sij为空。为了搞清楚活动选择问题的子结构, 考虑某些非空子集Sij(有时称做子集,有时称做子问题,读 者可从上下文看出)。假定Sij的一个解包括活动ak,则有 fi≤sk<fk≤sj。活动ak产生两个子问题Sik和Skj。Sik表示活动ai完 成之后,活动ak开始之前的那些活动集。Skj表示活动ak
的相容活动集合。假定集合S={a1, a2,…, an}中含有n个希望 使用某一资源的活动,这样的资源有教室、某一设备等,它
们一次只能由一个活动使用。每个活动ai有开始时间(start time)si和完成时间(finish time)fi,其中,0≤si<fi<∞。如果某 个活动ai被选中使用资源,则该活动在半开区间(si,fi]这 段时间占据资源。如果活动ai和aj在时间区间(si,fi]和(sj, fj]上不重叠,则称它们是相容的(compatible),即如果si≥fj 或者sj≥fi,活动ai和aj是相容的。活动选择问题是选择最大的 相容活动集合。
i 1
述假设,可以推得yk<xk。以下首先证明这一点,分三种情
况讨论:
(1) 若k<j,则xk=1。又yk≠xk,从而yk<xk。
(2) 若k=j,对于1≤i<nj,有xi=yi=1;而对于nj<i≤n,有xi=0。
若yk>xk,显然有
wi y,i 因W为
wi y与i y是W可
行解矛盾。若yk=xk,与假i1设yk≠xk矛盾,因此,i1yk<xk。
所选活动的完成时间随着时间严格递增。我们只需按照完成
子问题空间就是从Sij中选择最大相互相容活动子集,0≤i,j ≤n+1,其他的Sij为空。为了搞清楚活动选择问题的子结构, 考虑某些非空子集Sij(有时称做子集,有时称做子问题,读 者可从上下文看出)。假定Sij的一个解包括活动ak,则有 fi≤sk<fk≤sj。活动ak产生两个子问题Sik和Skj。Sik表示活动ai完 成之后,活动ak开始之前的那些活动集。Skj表示活动ak
的相容活动集合。假定集合S={a1, a2,…, an}中含有n个希望 使用某一资源的活动,这样的资源有教室、某一设备等,它
们一次只能由一个活动使用。每个活动ai有开始时间(start time)si和完成时间(finish time)fi,其中,0≤si<fi<∞。如果某 个活动ai被选中使用资源,则该活动在半开区间(si,fi]这 段时间占据资源。如果活动ai和aj在时间区间(si,fi]和(sj, fj]上不重叠,则称它们是相容的(compatible),即如果si≥fj 或者sj≥fi,活动ai和aj是相容的。活动选择问题是选择最大的 相容活动集合。
i 1
述假设,可以推得yk<xk。以下首先证明这一点,分三种情
况讨论:
(1) 若k<j,则xk=1。又yk≠xk,从而yk<xk。
(2) 若k=j,对于1≤i<nj,有xi=yi=1;而对于nj<i≤n,有xi=0。
若yk>xk,显然有
wi y,i 因W为
wi y与i y是W可
行解矛盾。若yk=xk,与假i1设yk≠xk矛盾,因此,i1yk<xk。
所选活动的完成时间随着时间严格递增。我们只需按照完成
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
确实能够达到总 价值最大。
11
算法设计与分析 > 贪心算法
基本步骤:
首先计算每种物品单位重量的价值vi/wi,然 后,依贪心选择策略,将尽可能多的单位重 量价值最高的物品装入背包。 若将这种物品全部装入背包后,背包内的物 品总重量未超过C,则选择单位重量价值次高 的物品并尽可能多地装入背包。
依此策略处理,直到背包装满为止。
因为Ak中的活动都是不相交的,aj是Ak中结束时间最早的 活动,而fm≤fj ,所以Ak′中的活动都是不相交的。 由于 | Ak′ |=| Ak|,因此得出结论Ak′也是Sk的一个最大活动 子集,且它包含am。
6
算法设计与分析 > 贪心算法
2.最优子结构性质
当一个问题的最优解包含其子问题的最优
解时,称此问题具有最优子结构性质。
算法设计与分析 > 贪心算法
• 时间复杂度分析
• n<=m 时间O(1) • n>m 排序耗时O (nlogn) 初始化堆O(m) DeleteMin 和Insert 耗时O (nlogm) 共需时间为: O (nlogn+ nlog m)=O( nlog n)
27
10
算法设计与分析 > 贪心算法
贪心选择:
每次捡最轻的物品装;
只考虑到多装些物品,但由 于单位价值未必高,总价值 不能达到最大;
每次选择的价值最大,但同时 也可能占用了较大的空间,装 每次捡价值最大的装;的物品少,未必能够达到总价 值最大
每次装包时既考虑物品的重量又考虑物品的
价值,也就是说每次捡单位价值最大的装。
9
算法设计与分析 > 贪心算法
设xi表示物品i装入背包的情况,根据问题的要求, 有如下约束条件和目标函数:
n wi xi C i 1 0 xi 1 (1 i n)
max vi xi
i 1
n
于是,背包问题归结为寻找一个满足约束条 件,并使目标函数达到最大的解向量 X=(x1, x2, …, x n ) 。
{
int *t= new int [n+1];
Sort.(w,t,n);
t[i]中存储第i轻集装箱 在原来序列中的下标
for (int i = 0; i < n && w[t[i]] <= c; i++) { x[t[i]] = 1; c -= w[t[i]]; } }
18
算法设计与分析 > 贪心算法
自底向上 自顶向下
8
设计特征
算法设计与分析 > 贪心算法
背包问题
给定n种物品和一个背包。物品i的重量是wi ,其价值为vi,背包的容量为C。应如何选择装 入背包的物品,使得装入背包中物品的总价值 最大? 在选择物品i装入背包时,可以选择物品i的 部分,而不一定要全部装入背包,1≤i≤n。 不允许重复装入。
template<class Type> 如果机器数 void Greedy(Type a[],int n,int m) 大于作业数 {if (n<=m){ 直接分配 cont<<”为每个作业分配一台机器.“<<endl return;} Sort(a,n); //将作业按时间从大到小排序 MinHeap<MachineNode>H(m); MachineNode x; for(int i=1;i<=m; i++){ 按照机器结点编 x.avail=0; 号顺序建立堆 x.ID=i; H.Insert(x);} for(int i=n;i>=1;i--){ //作业分配过程 H.DeleteMin(x); //从堆中取出堆顶x机器 cout<<”将机器”<<x.ID<<“从” <<x.avail<<"到” <<(x.avail十a[i].time) <<”的时间段分配给作业”<<a[i]. ID<<endl; x.avail+=a[i].time; //机器的时间分配 26 H.insert(x);}} //重新插入,调整堆
14
算法设计与分析 > 贪心算法
分析:
对于0-1背包问题,贪心选择之所以不能得到最优解 ,是因为它无法保证最终能将背包装满,部分闲置的
背包空间使每公斤背包空间的价值降低了。
事实上,在考虑0-1背包问题时,应比较选择该物品
和不选择该物品所导致的最终方案,然后再作出最
好选择。
由此就导出许多互相重叠的子问题。这正是该问题 可用动态规划算法求解的另一重要特征。
算法设计与分析 >目录
第一章 第二章 第三章 第四章 第五章 第六章 第七章
算法概述 递归与分治策略 动态规划 贪心算法 回朔法 分支限界法 随机化算法
1
算法设计与分析 >目录
4.1 活动安排问题
4.2 贪心算法基本要素 4.3 最优装载问题 4.7 多机调度问题
2
算法设计与分析 > 贪心算法
4.1 活动安排问题
5
算法设计与分析 > 贪心算法
定理:考虑任意非空子问题Sk,令am是Sk中结束时间 最早的活动,则am在Sk的某个最大兼容活动子集中。
证明:令Ak是Sk的一个最大兼容则证明am在Sk的某个最大兼容活动子集中。
A 若aj≠am,令集合 k Ak a j am ,即将Ak中的aj替换am
class JobNode { 作业结点类 friend void Greedy(JobNode * , int, int); friend void main(void); public: operator int () const {return time; } private: int ID, time; }; 机器结点类 class MachineNode { friend void Greedy(JobNode *, int, int); public: operator int( ) const { return avail; } private: int ID, 25 avail; }
13
算法设计与分析 > 贪心算法
0-1背包问题:
给定n种物品和一个背包。物品i的重量 是wi,其价值为vi,背包的容量为C。应如何 选择装入背包的物品,使得装入背包中物品 的总价值最大? 在选择装入背包的物品时,对每种物品 i只 有2种选择,即装入背包或不装入背包。不能 将物品i装入背包多次,也不能只装入部分的 物品i。
12
算法设计与分析 > 贪心算法
void Knapsack(int n, float M, float v[], float w[], float x[] ) //价值数组v[1:n]、重量数组w[1:n]; //它们元素的排列顺序满足v[i]/w[i]≥v[i+1]/w[i+1]; // M是背包容量,x是解向量. { float c=M ; // 使背包剩余容量初始化为M int i; 将各种物品依其单位重 Sort(n,v,w); 量的价值从大到小排序 for( i=1; i<=n; i++ ) x[i]=0; // 将解向量初始化为零 。算法的计算时间上界 for (i=1; i<=n; i++) { 为O(nlogn)。 if w[i] >c break; x[i]=1; c= c-w[i]; } if ( in ) x[i]= c / w[i]; }
19
算法设计与分析 > 贪心算法
4.7
多机调度问题
[问题描述]要求给出一种作业调度方案,使所给
的n个作业在尽可能短的时间内由m台机器加工处 理完成,作业i所需时间为ti。约定,每个作业均 可在任何一台机器上加工处理,但未完工前不允 许中断,作业不能拆分成更小的子作业。 该问题是NP完全问题,到目前为止还没有有效的 解法。用贪心选择策略有时可设计出较好的近似 算法。
23
算法设计与分析 > 贪心算法
[贪心近似算法] 采用最长处理时间作业优先的贪心策略. 当n≤m时, 只要将机器i的[0, ti]时间区间 分配给作业i即可; 当n>m时, 将n个作业依其所需的处理时 间从大到小排序,然后依次将作业分配给 空闲的处理机。
24
算法设计与分析 > 贪心算法
多机调度问题的贪心近似算法
1.算法描述
最优装载问题可用贪心算法求解。采用 重量最轻者先装的贪心选择策略,可产生最 优装载问题的最优解。
17
算法设计与分析 > 贪心算法
x[i]记载第i个集装箱是
void Loading(int x[], Type w[], float c, int n)
否装入 , x[i]=1装入, x[i]=0未装入
3
算法设计与分析 > 贪心算法
[直观想法]
在安排时应该将结束时间早的活动尽量往
前安排,好给后面的活动安排留出更多的
空间,从而达到安排最多活动的目标。
贪心准则应当是:在未安排的活动中挑选
结束时间最早的活动安排。
4
算法设计与分析 > 贪心算法
[算法思路]
1.将活动按结束时间排序,得到活动集 E={e1,e2…en}; 2.先将e1选入结果集合A中,即A={e1}; 3.依次扫描每一个活动 ei: 如果ei的si >最后一 个选入A的活动ej的 fj , 则将ei选入A中 , 否则 放弃ei。
[例 ]
物品重量分别为15,10,27,18,船载重为50 定义:w[ ]={15, 10, 27, 18} 物品重量 T [ ]={ 1 , 0, 3, 2} 物品从轻到重排序后序号 C=50 船载重 贪心算法计算步骤: w[T[0]]=10<c, c= c-10=40 w[T[1]]=15<c, c=c-15=25 w[T[2]]=18<c, c=c-18=7 w[T[3]]=27>c
11
算法设计与分析 > 贪心算法
基本步骤:
首先计算每种物品单位重量的价值vi/wi,然 后,依贪心选择策略,将尽可能多的单位重 量价值最高的物品装入背包。 若将这种物品全部装入背包后,背包内的物 品总重量未超过C,则选择单位重量价值次高 的物品并尽可能多地装入背包。
依此策略处理,直到背包装满为止。
因为Ak中的活动都是不相交的,aj是Ak中结束时间最早的 活动,而fm≤fj ,所以Ak′中的活动都是不相交的。 由于 | Ak′ |=| Ak|,因此得出结论Ak′也是Sk的一个最大活动 子集,且它包含am。
6
算法设计与分析 > 贪心算法
2.最优子结构性质
当一个问题的最优解包含其子问题的最优
解时,称此问题具有最优子结构性质。
算法设计与分析 > 贪心算法
• 时间复杂度分析
• n<=m 时间O(1) • n>m 排序耗时O (nlogn) 初始化堆O(m) DeleteMin 和Insert 耗时O (nlogm) 共需时间为: O (nlogn+ nlog m)=O( nlog n)
27
10
算法设计与分析 > 贪心算法
贪心选择:
每次捡最轻的物品装;
只考虑到多装些物品,但由 于单位价值未必高,总价值 不能达到最大;
每次选择的价值最大,但同时 也可能占用了较大的空间,装 每次捡价值最大的装;的物品少,未必能够达到总价 值最大
每次装包时既考虑物品的重量又考虑物品的
价值,也就是说每次捡单位价值最大的装。
9
算法设计与分析 > 贪心算法
设xi表示物品i装入背包的情况,根据问题的要求, 有如下约束条件和目标函数:
n wi xi C i 1 0 xi 1 (1 i n)
max vi xi
i 1
n
于是,背包问题归结为寻找一个满足约束条 件,并使目标函数达到最大的解向量 X=(x1, x2, …, x n ) 。
{
int *t= new int [n+1];
Sort.(w,t,n);
t[i]中存储第i轻集装箱 在原来序列中的下标
for (int i = 0; i < n && w[t[i]] <= c; i++) { x[t[i]] = 1; c -= w[t[i]]; } }
18
算法设计与分析 > 贪心算法
自底向上 自顶向下
8
设计特征
算法设计与分析 > 贪心算法
背包问题
给定n种物品和一个背包。物品i的重量是wi ,其价值为vi,背包的容量为C。应如何选择装 入背包的物品,使得装入背包中物品的总价值 最大? 在选择物品i装入背包时,可以选择物品i的 部分,而不一定要全部装入背包,1≤i≤n。 不允许重复装入。
template<class Type> 如果机器数 void Greedy(Type a[],int n,int m) 大于作业数 {if (n<=m){ 直接分配 cont<<”为每个作业分配一台机器.“<<endl return;} Sort(a,n); //将作业按时间从大到小排序 MinHeap<MachineNode>H(m); MachineNode x; for(int i=1;i<=m; i++){ 按照机器结点编 x.avail=0; 号顺序建立堆 x.ID=i; H.Insert(x);} for(int i=n;i>=1;i--){ //作业分配过程 H.DeleteMin(x); //从堆中取出堆顶x机器 cout<<”将机器”<<x.ID<<“从” <<x.avail<<"到” <<(x.avail十a[i].time) <<”的时间段分配给作业”<<a[i]. ID<<endl; x.avail+=a[i].time; //机器的时间分配 26 H.insert(x);}} //重新插入,调整堆
14
算法设计与分析 > 贪心算法
分析:
对于0-1背包问题,贪心选择之所以不能得到最优解 ,是因为它无法保证最终能将背包装满,部分闲置的
背包空间使每公斤背包空间的价值降低了。
事实上,在考虑0-1背包问题时,应比较选择该物品
和不选择该物品所导致的最终方案,然后再作出最
好选择。
由此就导出许多互相重叠的子问题。这正是该问题 可用动态规划算法求解的另一重要特征。
算法设计与分析 >目录
第一章 第二章 第三章 第四章 第五章 第六章 第七章
算法概述 递归与分治策略 动态规划 贪心算法 回朔法 分支限界法 随机化算法
1
算法设计与分析 >目录
4.1 活动安排问题
4.2 贪心算法基本要素 4.3 最优装载问题 4.7 多机调度问题
2
算法设计与分析 > 贪心算法
4.1 活动安排问题
5
算法设计与分析 > 贪心算法
定理:考虑任意非空子问题Sk,令am是Sk中结束时间 最早的活动,则am在Sk的某个最大兼容活动子集中。
证明:令Ak是Sk的一个最大兼容则证明am在Sk的某个最大兼容活动子集中。
A 若aj≠am,令集合 k Ak a j am ,即将Ak中的aj替换am
class JobNode { 作业结点类 friend void Greedy(JobNode * , int, int); friend void main(void); public: operator int () const {return time; } private: int ID, time; }; 机器结点类 class MachineNode { friend void Greedy(JobNode *, int, int); public: operator int( ) const { return avail; } private: int ID, 25 avail; }
13
算法设计与分析 > 贪心算法
0-1背包问题:
给定n种物品和一个背包。物品i的重量 是wi,其价值为vi,背包的容量为C。应如何 选择装入背包的物品,使得装入背包中物品 的总价值最大? 在选择装入背包的物品时,对每种物品 i只 有2种选择,即装入背包或不装入背包。不能 将物品i装入背包多次,也不能只装入部分的 物品i。
12
算法设计与分析 > 贪心算法
void Knapsack(int n, float M, float v[], float w[], float x[] ) //价值数组v[1:n]、重量数组w[1:n]; //它们元素的排列顺序满足v[i]/w[i]≥v[i+1]/w[i+1]; // M是背包容量,x是解向量. { float c=M ; // 使背包剩余容量初始化为M int i; 将各种物品依其单位重 Sort(n,v,w); 量的价值从大到小排序 for( i=1; i<=n; i++ ) x[i]=0; // 将解向量初始化为零 。算法的计算时间上界 for (i=1; i<=n; i++) { 为O(nlogn)。 if w[i] >c break; x[i]=1; c= c-w[i]; } if ( in ) x[i]= c / w[i]; }
19
算法设计与分析 > 贪心算法
4.7
多机调度问题
[问题描述]要求给出一种作业调度方案,使所给
的n个作业在尽可能短的时间内由m台机器加工处 理完成,作业i所需时间为ti。约定,每个作业均 可在任何一台机器上加工处理,但未完工前不允 许中断,作业不能拆分成更小的子作业。 该问题是NP完全问题,到目前为止还没有有效的 解法。用贪心选择策略有时可设计出较好的近似 算法。
23
算法设计与分析 > 贪心算法
[贪心近似算法] 采用最长处理时间作业优先的贪心策略. 当n≤m时, 只要将机器i的[0, ti]时间区间 分配给作业i即可; 当n>m时, 将n个作业依其所需的处理时 间从大到小排序,然后依次将作业分配给 空闲的处理机。
24
算法设计与分析 > 贪心算法
多机调度问题的贪心近似算法
1.算法描述
最优装载问题可用贪心算法求解。采用 重量最轻者先装的贪心选择策略,可产生最 优装载问题的最优解。
17
算法设计与分析 > 贪心算法
x[i]记载第i个集装箱是
void Loading(int x[], Type w[], float c, int n)
否装入 , x[i]=1装入, x[i]=0未装入
3
算法设计与分析 > 贪心算法
[直观想法]
在安排时应该将结束时间早的活动尽量往
前安排,好给后面的活动安排留出更多的
空间,从而达到安排最多活动的目标。
贪心准则应当是:在未安排的活动中挑选
结束时间最早的活动安排。
4
算法设计与分析 > 贪心算法
[算法思路]
1.将活动按结束时间排序,得到活动集 E={e1,e2…en}; 2.先将e1选入结果集合A中,即A={e1}; 3.依次扫描每一个活动 ei: 如果ei的si >最后一 个选入A的活动ej的 fj , 则将ei选入A中 , 否则 放弃ei。
[例 ]
物品重量分别为15,10,27,18,船载重为50 定义:w[ ]={15, 10, 27, 18} 物品重量 T [ ]={ 1 , 0, 3, 2} 物品从轻到重排序后序号 C=50 船载重 贪心算法计算步骤: w[T[0]]=10<c, c= c-10=40 w[T[1]]=15<c, c=c-15=25 w[T[2]]=18<c, c=c-18=7 w[T[3]]=27>c