算法设计与分析 第四章 贪心算法

算法设计与分析 第四章 贪心算法_第1张图片
一、 基本概念:
所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。
二、要素:
(1)贪心选择性质
贪心选择性质是指,所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。

(2)最优子结构性质

当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质
三、贪心算法的基本思路:

1.把求解的问题分成若干个子问题。
2.对每一子问题求解,得到子问题的局部最优解。
3.把子问题的解局部最优解合成原来解问题的一个解
四。应用实例:
最优装载问题
问题描述:有一批集装箱要撞上一艘载重为C的轮船,其中集装箱i的质量为Wi最优装载问题要求在装载体积不受限制的情况下将尽可能多的集装箱装上轮船。
算法描述:
最优装载问题与0-1背包问题其实是类似的,只不过这里要注意,价值比为1。
会场安排问题
问题描述:假设要在足够多的会场里安排一批活动, 并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。(这个问题实际上是著名的图着色问题。若将每个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相当于罗找的最小会场数。)

算法设计:对于给定的k个待安排的活动,计算使用最少会场的时间表。

区间覆盖问题

问题描述:设x, x2, … xn是实直线上的n个点。用固定长度的闭区间覆盖这n个点,至少需要多少个这样的固定长度闭区间?设计解此问题的有效算法,并证明算法的正确性。
算法设计:对于给定的实直线上的n个点和闭区间的长度k,计算覆盖点集的最少区间数。

多机调度问题
问题描述:设有n个顾客同时等待一项服务。 顾客i需要的服务时间为1 (1≤i≤n),共有s处可以提供此项服务。应如何安排n个顾客的服务次序,才能使平均等待时间达到最小?平均等待时间是n个顾客等待服务时间的总和除以n。

算法设计:对于给定的n个顾客需要的服务时间和s的值,计算最优服务次序。

单源最短路径

给定一个带权有向图G=(V,E),其中每条边的权是非负实数。另外,给定V中的一个顶点,称为源。现在要计算从源到所有其他各顶点的最短路长度。这里路的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。
算法基本描述:
Dijkstra算法是解单源最短路径问题的一个贪心算法。其基本思想是,设置顶点集合S,并不断地做贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组 dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组 dist做必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其他顶点之间的最短路径长度。
贪心选择性质:
Dijkstra算法是应用贪心算法设计策略的又一个典型例子,所做的贪心选择是从V-S中选择具有最短特殊路径的顶点u,从而确定从源到u的最短路径长度dist[u]。这种贪心选择为什么能导致最优解呢?换句话说,为什么从源到u没有更短的其他路径呢?事实上,如果存在一条从源到u且长度比 dist[u]更短的路,设这条路初次走出S之外到达的顶点为x∈V-S,然后徘徊于S内外若干次,最后离开S到达u
在这条路径上,分别记d(v, x),d(x, u)和d(v, u)为顶点v到顶点x,顶点x到顶点u和顶点v到顶点u的路长,那么,dist[x]≤d(v, x),d(v, x)+d(x, u)=d(v, u)

删数问题
问题描述:给定n位正整数a,去掉其中任意k≤n个数字后,剩下的数字按原次序排列组成一个新的正整数。对于给定的n位正整数a和正整数k,设计- 一个算法找出剩下数字组成的新数最小的删数方案。

算法设计:对于给定的正整数a,计算删去k个数字后得到的最小数。

分数背包问题:可以用贪心算法求解。
0-1背包问题:不能用贪心算法求解。

贪心算法存在的一些问题

  1. 不能保证求得的最后解是最佳的;
  2. 不能用来求最大或最小解问题;
  3. 只能求满足某些约束条件的可行解的范围。

你可能感兴趣的:(算法,动态规划,算法)