第四章贪心算法
第4章贪心算法习题(免费阅读)
![第4章贪心算法习题(免费阅读)](https://img.taocdn.com/s3/m/558921eed5bbfd0a79567378.png)
算法实现题4-5 程序存储问题
数据输入:
第一行是2 个正整数,分别表示文件个数n和磁带的长 度L。接下来的1 行中,有n个正整数,表示程序存放在磁 带上的长度。
结果输出: 最多可以存储的程序数。
输入示例
6 50
2 3 13 8 80 20 输出示例
5
i 012345
x 2 3 13 8 80 20 7
3
算法实现题4-5 程序存储问题
问题描述: 设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。
程序i存放在磁带上的长度是 li,1 ≤ i ≤ n。 程序存储问题要求确定这n 个程序在磁带上的一个
存储方案,使得能够在磁带上存储尽可能多的程序。 编程任务:
对于给定的n个程序存放在磁带上的长度,编程计 算磁带上最多可以存储的程序数。
532.00
10
算法实现题4-6 最优服务次序问题
double greedy( vector<int> x) {
int i,n=x.size(); sort(x.begin(),x.end()); for(i=1;i<n;++i)
x[i] += x[i-1]; double t=0; for(i=0;i<n;++i) t+=x[i]; t /= n;
算法实现题4-5 程序存储问题
int greedy( vector<int> x, int m){
int i=0, sum=0, n=x.size();
sort(x.begin(),x.end());
while(i
if(sum <= m) i++;
计算机算法设计与分析--第4章 贪心算法幻灯片PPT
![计算机算法设计与分析--第4章 贪心算法幻灯片PPT](https://img.taocdn.com/s3/m/c92e6d1e700abb68a882fb0a.png)
本PPT课件仅供大家学习使用 请学习完及时删除处理 谢谢!
提纲
一、贪心算法的基本思想 二、活动安排问题 三、最优装载 四、哈夫曼编码 五、单源最短路径 六、最小生成树 七、多机调度问题
2021/5/19
2
提纲
一、贪心算法的基本思想 二、活动安排问题 三、最优装载 四、哈夫曼编码 五、单源最短路径 六、最小生成树 七、多机调度问题
一、贪心算法的基本思想 二、活动安排问题 三、最优装载 四、哈夫曼编码 五、单源最短路径 六、最小生成树 七、多机调度问题
2021/5/19
28
3.1 问题定义
Optimal Loading problem
有一批集装箱要装上一艘载重量为c的轮船。其 中集装箱i的重量为Wi。最优装载问题要求确定 在装载体积不受限制的情况下,将尽可能多的 集装箱装上轮船。
2021/5/19
21
2.3贪心算法
template<class Type>
void GreedySelector(int n, Type s[], Type f[], bool A[])
{
A[1]=true; int j=1; for (int i=2;i<=n;i++) {
各活动的起始时间和结 束时间存储于数组s和f 中且按结束时间的非减
2.4 算法正确性证明
需要证明:
活动安排问题有一个最优解以贪心选择开始; 活动安排问题具有最优子结构; 算法每一步按照贪心选择计算,最终可得到
原问题的一个最优解。
2021/5/19
24
2.4 算法正确性证明
定理1 设E={1,2,…,n}是n个活动集合,[si,fi ]是活动 的起始终止时间,且f1f2….fn,E的活动安排 问题的某个最优解包括活动1.
第4章 贪心算法(1)活动安排问题
![第4章 贪心算法(1)活动安排问题](https://img.taocdn.com/s3/m/69993c5069dc5022abea0046.png)
4.1 活动安排问题
活动安排问题是可以用贪心算法有效求解的很 好例子。
该问题要求高效地安排一系列争用某一公共资 源的活动,使得尽可能多的活动能兼容地使用 公共资源。
4
问题描述
设有n个活动的集合E={1, 2, …, n},其中每个 活动都要求使用同一资源,而在同一时间内只 有一个活动能使用这一资源。
2
贪心算法
例2:若上述硬币面值改为:
一角一分、五分和一分 现在要找给顾客一角五分钱,如何给出硬币? 答案:错:1个一角一分,4个一分
对:3个五分
虽然贪心算法不能对所有问题都得到整体最优 解,但对许多问题它能产生整体最优解。
在一些情况下,即使贪心算法不能得到整体最 优解,其最终结果却是最优解的很好的近似解。
ቤተ መጻሕፍቲ ባይዱ17
0-1背包问题
给定n种物品和一个背包。物品i的重量是wi, 其价值为vi,背包的容量为c。应如何选择装 入背包的物品,使得装入背包中物品的总价 值最大?
说明:在选择装入背包的物品时,对每种物 品i只有2种选择,即装入背包或不装入背包。 不能将物品i装入背包多次,也不能只装入部 分的物品i。
16
3、贪心算法与动态规划算法的 差异
贪心算法和动态规划算法都要求问题具有最 优子结构性质,这是两类算法的一个共同点。
对于具有最优子结构的问题应该选用贪心算 法还是动态规划算法求解?
是否能用动态规划算法求解的问题也能用贪 心算法求解?
下面研究2个经典的组合优化问题,并以此 说明贪心算法与动态规划算法的主要差别。
每个活动i都有一个要求使用该资源的起始时 间si和一个结束时间fi,且si <fi 。
5
问题描述
如果选择了活动i,则它在半开时间区间[si, fi) 内占用资源。若区间[si, fi)与区间[sj, fj)不相交, 则称活动i与活动j是相容的。也就是说,当si≥fj
贪心算法讲义
![贪心算法讲义](https://img.taocdn.com/s3/m/e2fbb87f551810a6f424868e.png)
float p[1..n], w[1..n], x[1..n], M, rc;
integer i, n; x:= 0; // 将解向量初始化为零
//w[1..n],它们元素的排列 //顺序满p[i]/w[i]≥p[i+1]/w[i+1] //M是背包容量,x[1..n]是解向量
rc:= M; // 背包的剩余容量初始化为M
作业调度问题
单机作业调度问题的贪心算法
将上述算法找到的作业集按作业期限升序排列,就产生一 个作业调度。
算法的复杂度分析
J {i}的相容性判断最坏|J|次,|J|最大i-1。所以 T(n)=1+2+…+n-1=O(n2)
例子: 设n=7,
(p1, p2,… ,pn)=(35,30,25,20,15,10,5), (d1, d2,… ,dn)=(4,2,4,3,4,8,3) 算法GreedyJob的执行过程 : 作业 1 ;2, 1; 2, 1, 3; 2, 4, 1, 3; 2, 4, 1, 3 , 6; 期限 4; 2, 4; 2,4, 4; 2, 3, 4, 4; 2, 3, 4, 4, 8;
带期限的单机作业安排问题
已知n项作业 E={1, 2, … ,n}要求使用同台机器完成, 而且每项作业需要的时间都是1。第k项作业要求在时 刻2, d…k之, n前。完成, 而且完成这项作业将获得效益pk,k=1,
作业集E的子集称为相容的如果其中的作业可以被安 排由一台机器完成。
带限期单机作业安排问题就是要在所给的作业集合中 选出总效益值最大的相容子集。
许多NP难组合优化问题,目前仍未找到有效的算法, 贪心策略常用于设计这些问题的近似算法。
贪心算法的基本思想
第4章贪心算法
![第4章贪心算法](https://img.taocdn.com/s3/m/bac14b49336c1eb91a375dbb.png)
使得这N支商队在这次经商中获得的总收益最大
注意:你的每支商队只能进行一次交易
即它们只能从它们所在的城市到达一个相邻的城市
当然
它们也可以不进行任何交易
4
2 1 4 3
输出:
13
【算法分析】
当看到此题时
我们会发现求max与求min是两个相似的过程
若我们把求解max与min的过程分开
着重探讨求max的问题
下面我们以求max为例来讨论此题用贪心策略求解的合理性
讨论:假设经(N-3)次变换后得到3个数:a ,b , max'(max'≥a≥b)
}
int work(){
qsort(a+1,n,sizeof(a[0]),cmp);//按区间右端点由小到大排序
int i,j,k;
int a1,a2;
a1=a[1].right-1;a2=a[1].right;result=2;
for(i=2;i<=n;i++)
{ if(a[i].left<=a1&& a[i].right>=a2)continue;//完全包含
struct prince{
int left,right;//区间左右端点
}a[10000];
int n;
int result;//存放结果中的数
int cmp(const void *a,const void *b){
return (*(prince *)a).right-(*(prince *)b).right;
}
return result;
(算法分析与设计)2.贪心算法
![(算法分析与设计)2.贪心算法](https://img.taocdn.com/s3/m/0fad800b960590c69fc37633.png)
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章 贪心算法
![第4章 贪心算法](https://img.taocdn.com/s3/m/e532dfe4fd0a79563d1e7255.png)
4.1 活动安排问题
若被检查的活动i的开始时间Si小于最近选择的活动j 的结束时间fi,则不选择活动i,否则选择活动i加入集 合A中。
贪心算法并不总能求得问题的整体最优解。但对 于活动安排问题,贪心算法greedySelector却总能求 得的整体最优解,即它最终所确定的相容活动集合A的 规模最大。这个结论可以用数学归纳法证明。
if (s[i]>=f[j]) { A[i]=true; j=i; }
各活动的起始时间和结 束时间存储于数组s和f 中且按结束时间的非减
序排列
else A[i]=false;
}
}
6
4.1 活动安排问题
由于输入的活动以其完成时间的非减序排列, 所以算法greedySelector每次总是选择具有最早 完成时间的相容活动加入集合A中。直观上,按这 种方法选择相容活动为未安排活动留下尽可能多 的时间。也就是说,该算法的贪心选择的意义是 使剩余的可安排时间段极大化,以便安排尽可能 多的相容活动。
1、算法基本思想
Dijkstra算法是解单源最短路径问题的贪心算法。
28
4.5 单源最短路径
其基本思想是,设置顶点集合S并不断地作贪心选 择来扩充这个集合。一个顶点属于集合S当且仅当从源 到该顶点的最短路径长度已知。
初始时,S中仅含有源。设u是G的某一个顶点, 把从源到u且中间只经过S中顶点的路称为从源到u的 特殊路径,并用数组dist记录当前每个顶点所对应的最 短特殊路径长度。Dijkstra算法每次从V-S中取出具有 最短特殊路长度的顶点u,将u添加到S中,同时对数 组dist作必要的修改。一旦S包含了所有V中顶点,dist 就记录了从源到所有其它顶点之间的最短路径长度。
要证明哈夫曼算法的正确性,只要证明最优前缀 码问题具有贪心选择性质和最优子结构性质。
《计算机算法设计与分析》PPT第四章贪心算法资料
![《计算机算法设计与分析》PPT第四章贪心算法资料](https://img.taocdn.com/s3/m/9c487ddbba1aa8114531d970.png)
假设活动已按结束时间的单调非递减顺序排序 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
贪心算法的一般框架
贪心算法 PPT课件
![贪心算法 PPT课件](https://img.taocdn.com/s3/m/d143bd303169a4517723a33d.png)
1
学习要点
理解贪心算法的概念。 掌握贪心算法的基本要素 (1)最优子结构性质
(2)贪心选择性质
理解贪心算法与动态规划算法的差异 理解贪心算法的一般理论 通过应用范例学习贪心设计策略。 (1)活动安排问题; (2)最优装载问题; (3)哈夫曼编码; (4)单源最短路径; (5)最小生成树; (6)多机调度问题。
15
4.2 贪心算法的基本要素
1、贪心选择性质
所谓贪心选择性质是指所求问题的整体最优解可以 通过一系列局部最优的选择,即贪心选择来达到。这是 贪心算法可行的第一个基本要素,也是贪心算法与动态 规划算法的主要区别。 动态规划算法通常以自底向上的方式解各子问题, 而贪心算法则通常以自顶向下的方式进行,以迭代的方 式作出相继的贪心选择,每作一次贪心选择就将所求问 题简化为规模更小的子问题。
7
4.1 活动安排问题
活动安排问题就是要在所给的活动集合 中选出最大的相容活动子集合,是可以用 贪心算法有效求解的很好例子。该问题要求 高效地安排一系列争用某一公共资源的活动。 贪心算法提供了一个简单、漂亮的方法使得 尽可能多的活动能兼容地使用公共资源。
8
4.1 活动安排问题
设有n个活动的集合E={1,2,…,n},其中每个活 动都要求使用同一资源,而在同一时间内只有一个活 动能使用这一资源。每个活动i都有一个要求使用该 资源的起始时间si和一个结束时间fi,且si <fi 。如 果选择了活动i,则它在半开时间区间[si, fi)内占 用资源。
{ A[1]=true; int j=1; for (int i=2;i<=n;i++) {
第四章 贪心算法1
![第四章 贪心算法1](https://img.taocdn.com/s3/m/ca1d0c725acfa1c7aa00cc64.png)
定义2(greedy选择性质)
若一个优化问题的全局优化解可通过局部优化 选择得到,则该问题称为具有greedy选择性质。
6
Greedy算法正确性证明方法
• 证明算法所求解的问题具有优化子结构性质 • 证明算法所求解的问题具有Greedy选择性 • 说明算法确实按照Greedy选择性进行局部 优化选择的
8
二、活动安排问题 (An activity-selection problem)
<1>问题的定义
活动安排问题是可以用贪心算法有效求解的一 个很好的例子。 •活动 设有n个活动的集合E={1,2,…,n},其中每个 活动都要求使用同一资源,如演讲会场等,而在 同一时间内只允许一个活动使用这一资源。每个 活动i都有一个要求使用该资源的起始时间si和一 个结束时间fi,且si < fi。如果选择了活动i,则它 在半开的时间区间(si,fi]内占用资源。
22
问题定义
给定编码字符集C及其概率分布f,即C中任意字符c以 概率f(c)在数据文件中出现。C的一个前缀编码方案对应 一棵二叉树T。字符c在树T中的深度记为dT(c)。dT(c)也 是字符c的前缀码长。该编码方案的平均码长定义为:
B(T) f(c) dT (c )。
cC
目标:
求出使平均码长最小的前缀编码方案――哈夫曼编码。
19
算法:
Template <class Type> void Loading(int x[ ], Type w[ ], Type c, int n) { int *t= new int[n+1]; Sort(w, t, n); //数组元素t[i] 存放重量第i轻的集装箱号。 for ( int i=1;i<=n; i++) x[i]=0; // 数组元素x[i]=0表示不装入集装箱i。 for ( int i=1; i<=n &&w[t[i]]<= c; i++) {x[t[i]] =1; c- = w[t[i]]; } }
《算法设计与分析》-第四章 贪心法
![《算法设计与分析》-第四章 贪心法](https://img.taocdn.com/s3/m/ea4e724c767f5acfa1c7cd5e.png)
w y
i 1
i
n
i
i
w1 wk wi xi wi xi c
i 1 i 1
i
n
n
又
y x
i 1 i 1
n
n
故(y1,y2,…,yn)是满足贪心选择性质的最优解。
4.4 最优装载
2.正确性证明 2)最优子结构性质
设(x1,x2,…,xn)是最优装载问题的满足贪心选择性质 的最优解,则知x1=1,且(x2,…,xn)是轮船装载重量 为c-w1,且待装集装箱为{2,3,…,n}的最优解。可用反 证法证明。 由最优装载问题的贪心选择性质和最优子结构性质,容 易证明算法loading的正确性。 算法loading的主要计算量在于将集装箱依其重量从 小到大排序,故算法所需的计算时间为 O(nlogn)。
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相容。 活动安排问题就是在所给的集合中选出最大的相 容活动子集合。
给定n种物品和一个背包。物品i的重量是Wi,其 价值为Vi,背包的容量为C。应如何选择装入背包的物 品,使得装入背包中物品的总价值最大?
背包问题: – 与0-1背包问题类似,所不同的是在选择物 品i装入背包时,可以选择物品i的一部分, 而不一定要全部装入背包,1≤i≤n。
算法-第4章贪心法-PPT课件
![算法-第4章贪心法-PPT课件](https://img.taocdn.com/s3/m/bcf33087284ac850ad02425f.png)
i , j A , i j , f ( i ) t f ( j ) or f ( j ) t f ( i ) i j
12
实例
A={1, 2, 3, 4, 5}, T=<5, 8, 4, 10, 3>, D=<10, 12, 15, 11, 20> 调度1: f1(1)=0, f1(2)=5, f1(3)=13, f1(4)=17, f1(5)=27 各任务延迟:0, 1, 2, 16, 10; 最大延迟:16 5 1 2 13 3 17 4 27 5 30
18
i j
f2(j)=s f2(i)=s+tj
delay(f’,i)=s+tj+ti- di <delya(f,j)r delay(f, j)=s+ti+tj-dj
4.3 得不到最优解的处理方法
讨论对于哪些输入贪心法能得到最优解:输入条件 讨论贪心法的解最坏情况下与最优解的误差(见第8章)
例4.4 找零钱问题 设有 n 种零钱, 重量分别为w1, w2, ... , wn, 价值分别为 v1=1, v2, ... , vn. 需要付的总钱数是 Y .不妨设币值和钱数都为 正整数. 问:如何付钱使得所付钱的总重最轻?
设计思想:按完成时间从早到晚安排任务,没有空闲
15
交换论证:正确性证明
算法的解的性质: (1) 没有空闲时间, 没有逆序. (2) 逆序 (i, j): f(i) < f(j) 且 di > dj 引理4.1 所有没有逆序、没有空闲时间的调度具有相同的 最大延迟. 证: 设 f 没有逆序,在 f 中具有相同完成时间的客户i1, i2, … , ik 必被连续安排. 在这k个客户中最大延迟是最后一个客 户,被延迟的时间是 k
贪心算法讲义
![贪心算法讲义](https://img.taocdn.com/s3/m/e2fbb87f551810a6f424868e.png)
贪心算法的基本思想
proc GreedyAction(s, f,n) //策略3的活动安排贪心算法 //s[1..n]、f[1..n]分别代表n项活动的起始时间和结束时间, //并且满足f[1] f[2]… f[n] j:=1; solution:={1}; //解向量初始化 for i from 2 to n do if sifj then // 将i加入解中 solution:=solution {i}; j:=i; end{if} end{for} return(solution);
end{GreedyAction}
ቤተ መጻሕፍቲ ባይዱ
贪心算法的基本思想
活动安排问题的策略3贪心算法正确性证明:归纳法
证:将活动按截止时间递增排列。归纳证明算法前k步导致最优解。 K=1时,算法选择了活动1。设A={i1,i2,..,ij}是一个最优解,则
A1={1,i2,..,ij}也是一个最优解,因为活动1比i1结束时间更早,A1是 相容的活动集。即算法的第一步导致最优解。 设对算法的第k步正确,令i1=1,i2,…ik是算法选择的活动序列,则存 在最优解A={i1=1,i2,…ik} ∪B。令S/是S中剩下的与i1=1,i2,…ik相容的 活 最动优,解即是SB//=且{j||Bsj/|≥>f|iBk,|j,∈那S么},用那B么/替B换是BS得/的到一的个解最=优{i1解=1。,i2否,…则ik,} ∪若BS/比/的A 活动更多,与A是最优解矛盾。 根据归纳假设,算法第一步选择结束时间最早的活动总是导致一个 最优解,所以问题S/存在一个最优解B*={ik+1,…},|B*|=|B|。 于是A/={i1=1,i2,…ik} ∪B*={i1=1,i2,…ik,ik+1} ∪(B*-{ik+1})与A的活动 一样多,也是最优解,且包含了算法前k+1步选择的活动。算法步 数是有限的,k是任意的,得证。
第四章贪心算法
![第四章贪心算法](https://img.taocdn.com/s3/m/cd605ff633d4b14e84246809.png)
实例分析
例
设待安排的11个活动的开始时间和结束时间按结 束时间的非减序排列如下: i 1 2
3
3
0
4
5
5
3
6
5
7
6
8
8
9
8
10 11
2 12
S[i] 1
f[i]
4
5
6
7
8
9
10 11 12 13 14
若被检查的活动 i 的开始时间 si 小于最近选择的活动 j 的结 束时间fj,则不选择活动i,否则选择活动i加入集合A中。
14
贪心选择性质与最优子结构性质
满足最优子结构性质未必满足贪心选择性质
因为原问题尽管满足最优子结构性质,即它的最 优解是由子问题的最优解构成的,但子问题的最 优解不一定是用贪心选择可以做出的。如在矩阵 连乘积问题中m[i][j] = min{m[i][k] + m[k+1][j] + pi–1pkpj},断点k就不是用贪心选择可以做出的。 能够用动态规划法的不一定能够应用贪心算法。
•
贪心算法greedySelector最终产生原问题的整体最优解。
10
贪心算法的基本要素
用贪心算法求解的问题的一般特征
对于一个具体的问题,怎么知道是否可用贪心算 法解此问题,以及能否得到问题的最优解呢 ? 这 个问题很难给予肯定的回答。 但是,从许多可以用贪心算法求解的问题中看到 这类问题一般具有 2 个重要的性质:贪心选择性 质和最优子结构性质。
3
活动安排问题
问题描述
活动安排问题是可以用贪心算法有效求解的很好例子。 该问题要求高效地安排一系列争用某一公共资源的活动, 即从所给的活动集合中选出最大的相容活动子集合。贪 心算法提供了一个简单、漂亮的方法使尽可能多的活动 能兼容地使用公共资源。 设有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相容。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第四章贪心算法
一、课本+作业
DIJKSTRA的主要思想
算法的思想是把中心定在起始顶点,向外层结点扩展,最终在目标顶点结束,停止扩展。
设顶点集合为S,通过贪心选择,逐步扩充这个集合。
一开始,集合S中所包含顶点仅为源点。
设u为图G的某一结点,把从开始顶点到结点u,且中间经过的顶点均在集合S内的线路称为从源点到u的特殊路径。
创建一个数组SD,用于储存每个顶点所对应的最短特殊路径的长度。
算法每次从u∈V-S 中取出具有最短特殊路长度的顶点u,将u添加到集合S中,与此同时,修改数组SD。
当S包含了所有V中顶点时,SD就记录了从源到所有其它顶点之间的最短路径长度。
Dijkstra算法的时间复杂度为O(n2),空间复杂度随着选择的存储方式不同而有所变化,若存储方式为邻接矩阵时为O(n2)。
在求解单源最短路径问题时,Dijkstra算法可以得到最优解,但由于它需要遍历众多结点,所以效率低。
历年试题
1.(2011年)试用Prim算法求解下面无向赋权图的最小生成树,指出最小生成树及该树中各边被选中的先后次序;写出算法的基本步骤。
2. (2010)1.分析Kruskal 算法的时间复杂度;
2. 试用下面的例子说明用Kruskal 算法求解最优生成树问题,并总结出算法的
基本步骤:
3.(2009)(原理习题有)
4. (2006) 设n p p p ,,,21 是准备存放到长为L 的磁带上的n 个程序,程序i p 需要的带
长为i a 。
设L a n
i i >∑=1,要求选取一个能放在带上的程序的最大子集合(即其中含有
最多个数的程序)Q 。
构造Q 的一种贪心策略是按i a 的非降次序将程序计入集合。
1). 证明这一策略总能找到最大子集Q ,使得∑∈≤Q
p i i L a 。
2). 设Q是使用上述贪心算法得到的子集合,磁带的利用率∑
∈Q
p i
i
L
a/可以小到何种程
度?
3). 试说明1)中提到的设计策略不一定得到使∑
∈Q
p i
i
L
a/取最大值的子集合(习题)
4.( 2009)。