第4章 贪心算法 计算机算法设计与分析(第3版)教学PPT课件
合集下载
算法设计与分析:第4章 贪心法
! 4 5! 1"
& 7
i 1 2 3 4 5 6 7 8 9 10 11 si 1 3 0 5 3 5 6 8 8 2 12 fi 4 5 6 7 8 9 10 11 12 13 14
3 1 0 1 Pa2ge 263 4
4 4
7 6
• +HJ-solution
– D5+>&S?F#6+
• '9J-select
– G CAKG !E – 30':4$F#+ – ")28J-
• +HJ-feasible
– D5+>& ':? K,+>& I;?.7=@%
贪心法的一般过程
7 (*)906 42:
– 6 "#3 – -,!*);&'4"# – !. ;&6 +/ ( –
/ (#
8 "# ( 5%( ()
– (#$1 (#
4.1.4 贪心法的求解过程
三个步骤
3
•
建立模型(问题抽象化)
ō 冇㩀㩂⇗
%
! &"'" = )
(1. 3)
"#$
0 ≤ '" ≤ 1, 1 ≤ . ≤ /
ō 䧏㫨ⓞ㡑
%
max ! 8"'"
(1. 9)
"#$
ō 厭◦棏歹㈳冴ℛ⻜㕟⃡ℋ䇂悔冇㩀㩂⇗ㇰ猾ㅗ≠䧏㫨ⓞ
㡑ㇰ抟┑㧡Ⰸ䥥峄⛲撰 : = ('1, '2, … , '/)
QPNX:E
& 7
i 1 2 3 4 5 6 7 8 9 10 11 si 1 3 0 5 3 5 6 8 8 2 12 fi 4 5 6 7 8 9 10 11 12 13 14
3 1 0 1 Pa2ge 263 4
4 4
7 6
• +HJ-solution
– D5+>&S?F#6+
• '9J-select
– G CAKG !E – 30':4$F#+ – ")28J-
• +HJ-feasible
– D5+>& ':? K,+>& I;?.7=@%
贪心法的一般过程
7 (*)906 42:
– 6 "#3 – -,!*);&'4"# – !. ;&6 +/ ( –
/ (#
8 "# ( 5%( ()
– (#$1 (#
4.1.4 贪心法的求解过程
三个步骤
3
•
建立模型(问题抽象化)
ō 冇㩀㩂⇗
%
! &"'" = )
(1. 3)
"#$
0 ≤ '" ≤ 1, 1 ≤ . ≤ /
ō 䧏㫨ⓞ㡑
%
max ! 8"'"
(1. 9)
"#$
ō 厭◦棏歹㈳冴ℛ⻜㕟⃡ℋ䇂悔冇㩀㩂⇗ㇰ猾ㅗ≠䧏㫨ⓞ
㡑ㇰ抟┑㧡Ⰸ䥥峄⛲撰 : = ('1, '2, … , '/)
QPNX:E
算法设计与分析讲义贪心法
特点
贪心算法在每一步选择时都采取在当前状态下最好或最优( 即最有利)的选择,而不考虑可能出现的后果。
贪心算法与动态规划
贪心算法是一种局部最优策略,即每一步选择在当前状态下 是最优的,但不一定能够得到全局最优解。
动态规划是一种全局最优策略,通过将问题分解为子问题, 逐步求解得到全局最优解。
贪心算法的历史与发展
选择适当的贪心策略
选择适当的贪心策略可以最大程度 地减少计算时间。
空间优化
通过优化算法的空间复杂度,减少 算法的空间占用,以提高算法的效 率。
并行计算
利用并行计算技术,将算法并行化 ,以提高算法的运行速度。
数据结构优化
使用合适的数据结构可以加快算法 的执行速度,如哈希表、堆等。
06
贪心算法的应用扩展
贪心算法的优化策略
总结词
记忆化搜索、动态规划优化、全局状态决策
详细描述
贪心算法虽然能够得到问题的近似解,但在某些情况 下可能无法得到最优解。为了提高贪心算法的性能, 可以采用一些优化策略,例如记忆化搜索,将已经计 算过的状态存储下来,避免重复计算;动态规划优化 ,将问题分解为子问题,通过解决子问题来解决原问 题;全局状态决策,将问题的所有状态作为一个整体 来考虑,利用问题的整体性质来得到更好的解。
在资源分配问题中,贪心算法可以用于求解具有单位资源的最大权值
组合问题、分数背包问题等。
05
贪心算法的实现技巧
贪心算法的编程实现
确定贪心策略
根据问题特性确定贪心策略,通常选择最优解或近似最优解。
编码实现
将贪心策略转化为代码实现,通常使用循环和条件语句实现算 法。
测试样例
设计测试样例,覆盖各种情况,提高算法的健壮性和正确性。
贪心算法在每一步选择时都采取在当前状态下最好或最优( 即最有利)的选择,而不考虑可能出现的后果。
贪心算法与动态规划
贪心算法是一种局部最优策略,即每一步选择在当前状态下 是最优的,但不一定能够得到全局最优解。
动态规划是一种全局最优策略,通过将问题分解为子问题, 逐步求解得到全局最优解。
贪心算法的历史与发展
选择适当的贪心策略
选择适当的贪心策略可以最大程度 地减少计算时间。
空间优化
通过优化算法的空间复杂度,减少 算法的空间占用,以提高算法的效 率。
并行计算
利用并行计算技术,将算法并行化 ,以提高算法的运行速度。
数据结构优化
使用合适的数据结构可以加快算法 的执行速度,如哈希表、堆等。
06
贪心算法的应用扩展
贪心算法的优化策略
总结词
记忆化搜索、动态规划优化、全局状态决策
详细描述
贪心算法虽然能够得到问题的近似解,但在某些情况 下可能无法得到最优解。为了提高贪心算法的性能, 可以采用一些优化策略,例如记忆化搜索,将已经计 算过的状态存储下来,避免重复计算;动态规划优化 ,将问题分解为子问题,通过解决子问题来解决原问 题;全局状态决策,将问题的所有状态作为一个整体 来考虑,利用问题的整体性质来得到更好的解。
在资源分配问题中,贪心算法可以用于求解具有单位资源的最大权值
组合问题、分数背包问题等。
05
贪心算法的实现技巧
贪心算法的编程实现
确定贪心策略
根据问题特性确定贪心策略,通常选择最优解或近似最优解。
编码实现
将贪心策略转化为代码实现,通常使用循环和条件语句实现算 法。
测试样例
设计测试样例,覆盖各种情况,提高算法的健壮性和正确性。
贪心算法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算法
安排方案
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.贪心算法
n
wixi
vixi
28.2
31
31.5
...
i1
[算法思路]1).将各物体按单位价值由高到低排序.
2).取价值最高者放入背包.
3).计算背包剩余空间.
4).在剩余物体中取价值最高者放入背包.
若背包剩余容量=0或物体全部装入背包为止
算法设计与分析 > 贪心算法
背包问题的贪心算法
print tour, cost }
*该算法不能求得最优解. 算法的最坏时间复杂性为O(n2)
该问题为NP难问题.
算法设计与分析 > 贪心算法
4.7 多机调度问题
问题:设有n个独立的作业{1, 2, …, n}, 由m台相同的机器进行加工 处理. 作业i所需时间为t i. 约定:任何作业可以在任何一台机器上 加工处理, 但未完工前不允许中断处理,任何作业不能拆分成更小 的子作业。要求给出一种作业调度方案,使所给的n 个作业在尽 可能短的时间内 由m台机器加工处理完成。 该问题为NP完全问题.
A complete tree is filled from the left: • all the leaves are on • the same level or • two adjacent ones and • all nodes at the lowest level are as far to the left as possible.
最大相容活动子集(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;
《算法设计与分析教学资料》第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)
《计算机算法设计与分析》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
贪心算法的一般框架
算法设计与分析讲义贪心法
贪心算法的历史与发展
01
贪心算法源于1944年数学家John von Neumann在博弈论中的“Oligopoly” 算法,用于解决多人零和博弈问题;
02
1954年,Garey和Johnson提出了贪心算法的基础概念和方法,并成功应用于 解决一些组合优化问题;
03
随着计算机科学和人工智能的快速发展,贪心算法在许多领域得到了广泛应用 和发展,例如最短路径问题、最小生成树问题、作业调度问题等。
找零问题
总结词
最优找零策略,时间复杂度为O(logn)
详细描述
在找零时,贪心算法可以帮助我们制定最优找零策略,通过计算货币单位的最小公倍数,将找零的货 币单位从小到大排序,然后依次考虑每个货币单位,直到找零的总额达到商品价格为止。
背包问题
总结词
最优解,时间复杂度为O(nW),其中n为物品数量,W为背包容量
06
总结与展望
贪心算法的优缺点
• 优点 • 简单易懂:贪心算法的思路通常比较直观,易于理解,适合初学者快速上手。 • 高效:在某些情况下,贪心算法的执行效率可以非常高,例如对于一些最优子结构的问题,时间复杂度可
以达到 O(n)。 • 适用范围广:贪心算法可以应用于许多不同类型的问题,具有较广的适用性。 • 缺点 • 正确性难以保证:对于某些问题,贪心算法可能无法得到正确的结果,因为它们不能保证全局最优。 • 不一定收敛:贪心算法在某些情况下可能不收敛,不能得到最终的解。 • 需要良好的初始化:贪心算法通常需要一个良好的初始化,否则可能会陷入局部最优解。
贪心算法未来的发展方向
• 理论研究 • 研究贪心算法的理论基础,探讨其适用范围和限制,以更好地理解其性质和行为。 • 深入研究贪心算法在不同类型问题中的应用,拓展其应用范围。 • 研究贪心算法与其他算法之间的关系和比较,以更全面地了解各种算法的优势和劣势。 • 应用研究 • 在实际应用中,研究如何更好地利用贪心算法来解决各种问题,提高其解决问题的效率和性能。 • 研究如何将贪心算法与其他算法相结合,以充分发挥各自的优势,提高解决问题的效率和正确性。 • 计算复杂性研究 • 研究贪心算法的时间复杂度和空间复杂度,以更好地了解其计算效率和资源占用情况。 • 研究如何优化贪心算法的实现,提高其计算效率和可扩展性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
11
4.2 贪心算法的基本要素 --贪心选择性质
贪心选择性质:指所求问题的整体最优解可以通过 一系列局部最优的选择,即贪心选择来达到。
与动态规划算法的区别: (1)是否依赖子问题 的解;(2)求解过程(自下向上还是自上向下)
判断问题是否所具此性质:对于一个具体问题, 要确定它是否具有贪心选择性质,必须证明每一步所作 的贪心选择最终导致问题的整体最优解。
12
4.2 贪心算法的基本要素 --最优子结构性质
当一个问题的最优解包含其子问题 的最优解时,称此问题具有最优子结构 性质。
13
4.2 贪心算法的基本要素
贪心算法与动态规划算法的差异
相同点:最优子结构性质 不同点:通过组合优化问题实例说明二者
差别。
14
4.2 贪心算法的基本要素
0-1背包问题:
第4章 贪心算法
1
• 学习要点 • 理解贪心算法的概念。 • 掌握贪心算法的基本要素 • (1)最优子结构性质 • (2)贪心选择性质 • 理解贪心算法与动态规划算法的差异 • 通过应用范例学习贪心设计策略。 • (1)活动安排问题; • (2)最优装载问题; • (3)单源最短路径; • (4)多机调度问题。
问题:要在所给的活动集合中选出最大的相容活动 子集合。
5
4.1 活动安排问题
下面给出解活动安排问题的贪心算法:
template<class Type>
void GreedySelector(int n, Type s[], Type f[], bool A[])
{ A[1]=true;
各活动的起始时间和结 束时间存储于数组s和f
问题描述
给定n种物品和一个背包。物品i的重量是Wi,其价值 为Vi,背包的容量为C。应如何选择装入背包的物品,使 得装入背包中物品的总价值最大?
在选择装入背包的物品时,对每种物品i只有2种选 择,即装入背包或不装入背包。不能将物品i装入背包多 次,也不能只装入部分的物品i。
最优子结构
设第j个物品放入了背包中,原问题最优解包含其 中一个子问题的最优解,即:集合:Aj=A-{j}, 背包容量:c-wj
算法greedySelector的效率极高。当输入
的活动已按结束时间的非减序排列,算法只需
O(n)的时间安排n个活动,使最多的活动能相容
地使用公共资源。如果所给出的活动未按非减序
排列,可以用O(nlogn)的时间重排。
7
4.1 活动安排问题
例:设待安排的11个活动的开始时间和结束时间按结 束时间的非减序排列如下:
15
4.2 贪心算法的基本要素
背包问题:
问题描述 与0-1背包问题类似,所不同的是在选择物品i装入
背包时,可以选择物品i的一部分,而不一定要全部装 入背包,1≤i≤n。 最优子结构
设第j个物品放入了背包中,原问题最优解包含 其中一个子问题的最优解,即:集合:Ajw=A{w},背包容量:c-w
2
解决问题类型
局部最优问题 部分问题的整体近似最优 一般问题的整体最优
贪心算法并不从整体最优考虑,它所作出 的选择只是在某种意义上的局部最优选择。
在一些情况下,即使贪心算法不能得到整 体最优解,其最终结果却是最优解的很好近似 解。
贪心算法不能对所有问题都得到整体最优 解,但对许多问题它能产生整体最优解。
10
4.2 贪心算法的基本要素
本节着重讨论可以用贪心算法求解的问题 的一般特征。 对于一个具体的问题,怎么知道是否可用贪心 算法解此问题,以及能否得到问题的最优解呢? 这个问题很难给予肯定的回答。
但是,从许多可以用贪心算法求解的问题中 看到这类问题一般具有2个重要的性质:贪心 选择性质和最优子结构性质。
i 1 2 3 4 5 6 7 8 9 10 11 s[i] 1 3 0 5 3 5 6 8 8 2 12
f[i] 4 5 6 7 8 9 10 11 12 13 14
★
★
★
★
8
4.1 活动安排问题
算法greedySelector 的计算过程如左图所示。 图中每行相应于算法的 一次迭代。阴影长条表 示的活动是已选入集合 A的活动,而空白长条 表示的活动是当前正在 检查相容性的活动。
9
4.1 活动安排问题
若被检查的活动i的开始时间Si小于最近选 择的活动j的结束时间fi,则不选择活动i,否 则选择活动i加入集合A中。 贪心算法并不总能求得问题的整体最优解。 但对于活动安排问题,贪心算法 greedySelector却总能求得的整体最优解, 即它最终所确定的相容活动集合A的规模最大。
贪心算法:1*0.11+4*0.01 共5枚硬币、结论不是整体最优解,是近似最优解。
4
4.1 活动安排问题
问题描述
设有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相容。
int j=1;
中且按结束时间的非减 序排列
for (int i=2;i<=n;i++) {
if (s[i]>=f[j]) { A[i]=true; j=i; }
else A[i]=false;
} 6
4.1 活动安排问题
由于输入的活动以其完成时间的非减序排列, 所以算法greedySelector每次总是选择具有最 早完成时间的相容活动加入集合A中。直观上, 按这种方法选择相容活动为未安排活动留下尽可 能多的时间。也就是说,该算法的贪心选择的意 义是使剩余的可安排时间段极大化,以便安排尽 可能多的相容活动。
3
举例
硬币
问题一描述
4枚硬币:面值分别为0.25、0.1、0.05、0.01, 问构成0.63所需硬币数最少,如何选择其?
结论:每次都做出最好的选择,即每次确定一枚 硬币后,总使剩余金额最少。贪心算法可以得到 本问题的最优解。
问题二描述
3枚硬币:面值分别为0.11、0.05、0.01,问构 成0.15所需硬币数最少,如何选择其?
4.2 贪心算法的基本要素 --贪心选择性质
贪心选择性质:指所求问题的整体最优解可以通过 一系列局部最优的选择,即贪心选择来达到。
与动态规划算法的区别: (1)是否依赖子问题 的解;(2)求解过程(自下向上还是自上向下)
判断问题是否所具此性质:对于一个具体问题, 要确定它是否具有贪心选择性质,必须证明每一步所作 的贪心选择最终导致问题的整体最优解。
12
4.2 贪心算法的基本要素 --最优子结构性质
当一个问题的最优解包含其子问题 的最优解时,称此问题具有最优子结构 性质。
13
4.2 贪心算法的基本要素
贪心算法与动态规划算法的差异
相同点:最优子结构性质 不同点:通过组合优化问题实例说明二者
差别。
14
4.2 贪心算法的基本要素
0-1背包问题:
第4章 贪心算法
1
• 学习要点 • 理解贪心算法的概念。 • 掌握贪心算法的基本要素 • (1)最优子结构性质 • (2)贪心选择性质 • 理解贪心算法与动态规划算法的差异 • 通过应用范例学习贪心设计策略。 • (1)活动安排问题; • (2)最优装载问题; • (3)单源最短路径; • (4)多机调度问题。
问题:要在所给的活动集合中选出最大的相容活动 子集合。
5
4.1 活动安排问题
下面给出解活动安排问题的贪心算法:
template<class Type>
void GreedySelector(int n, Type s[], Type f[], bool A[])
{ A[1]=true;
各活动的起始时间和结 束时间存储于数组s和f
问题描述
给定n种物品和一个背包。物品i的重量是Wi,其价值 为Vi,背包的容量为C。应如何选择装入背包的物品,使 得装入背包中物品的总价值最大?
在选择装入背包的物品时,对每种物品i只有2种选 择,即装入背包或不装入背包。不能将物品i装入背包多 次,也不能只装入部分的物品i。
最优子结构
设第j个物品放入了背包中,原问题最优解包含其 中一个子问题的最优解,即:集合:Aj=A-{j}, 背包容量:c-wj
算法greedySelector的效率极高。当输入
的活动已按结束时间的非减序排列,算法只需
O(n)的时间安排n个活动,使最多的活动能相容
地使用公共资源。如果所给出的活动未按非减序
排列,可以用O(nlogn)的时间重排。
7
4.1 活动安排问题
例:设待安排的11个活动的开始时间和结束时间按结 束时间的非减序排列如下:
15
4.2 贪心算法的基本要素
背包问题:
问题描述 与0-1背包问题类似,所不同的是在选择物品i装入
背包时,可以选择物品i的一部分,而不一定要全部装 入背包,1≤i≤n。 最优子结构
设第j个物品放入了背包中,原问题最优解包含 其中一个子问题的最优解,即:集合:Ajw=A{w},背包容量:c-w
2
解决问题类型
局部最优问题 部分问题的整体近似最优 一般问题的整体最优
贪心算法并不从整体最优考虑,它所作出 的选择只是在某种意义上的局部最优选择。
在一些情况下,即使贪心算法不能得到整 体最优解,其最终结果却是最优解的很好近似 解。
贪心算法不能对所有问题都得到整体最优 解,但对许多问题它能产生整体最优解。
10
4.2 贪心算法的基本要素
本节着重讨论可以用贪心算法求解的问题 的一般特征。 对于一个具体的问题,怎么知道是否可用贪心 算法解此问题,以及能否得到问题的最优解呢? 这个问题很难给予肯定的回答。
但是,从许多可以用贪心算法求解的问题中 看到这类问题一般具有2个重要的性质:贪心 选择性质和最优子结构性质。
i 1 2 3 4 5 6 7 8 9 10 11 s[i] 1 3 0 5 3 5 6 8 8 2 12
f[i] 4 5 6 7 8 9 10 11 12 13 14
★
★
★
★
8
4.1 活动安排问题
算法greedySelector 的计算过程如左图所示。 图中每行相应于算法的 一次迭代。阴影长条表 示的活动是已选入集合 A的活动,而空白长条 表示的活动是当前正在 检查相容性的活动。
9
4.1 活动安排问题
若被检查的活动i的开始时间Si小于最近选 择的活动j的结束时间fi,则不选择活动i,否 则选择活动i加入集合A中。 贪心算法并不总能求得问题的整体最优解。 但对于活动安排问题,贪心算法 greedySelector却总能求得的整体最优解, 即它最终所确定的相容活动集合A的规模最大。
贪心算法:1*0.11+4*0.01 共5枚硬币、结论不是整体最优解,是近似最优解。
4
4.1 活动安排问题
问题描述
设有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相容。
int j=1;
中且按结束时间的非减 序排列
for (int i=2;i<=n;i++) {
if (s[i]>=f[j]) { A[i]=true; j=i; }
else A[i]=false;
} 6
4.1 活动安排问题
由于输入的活动以其完成时间的非减序排列, 所以算法greedySelector每次总是选择具有最 早完成时间的相容活动加入集合A中。直观上, 按这种方法选择相容活动为未安排活动留下尽可 能多的时间。也就是说,该算法的贪心选择的意 义是使剩余的可安排时间段极大化,以便安排尽 可能多的相容活动。
3
举例
硬币
问题一描述
4枚硬币:面值分别为0.25、0.1、0.05、0.01, 问构成0.63所需硬币数最少,如何选择其?
结论:每次都做出最好的选择,即每次确定一枚 硬币后,总使剩余金额最少。贪心算法可以得到 本问题的最优解。
问题二描述
3枚硬币:面值分别为0.11、0.05、0.01,问构 成0.15所需硬币数最少,如何选择其?