简单的贪心算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2020/11/26
11
有八种字符:a b c d e f g h ,其在通信联络中出现的概率分别为: 0.05 0.29 0.07 0.08 0.14 0.23 0.03 0.11 ,试设计哈夫曼编码。
设权 w = ( 5 , 29 , 7 ,8 , 14 , 23 ,3 , 11) n = 8
算法过程‫ﻻ‬
顾名思义,贪心算法总是作出在当前看来最 好的选择。也就是说贪心算法并不从整体最优考 虑,它所作出的选择只是在某种意义上的局部最 优选择。
【标准转化】 贪心猜想(贪心策略)
找硬币的时候:
找的硬币总数最少→使剩余金额最少


算法过程‫ﻻ‬
[贪心算法步骤]
从问题的某一初始解出发; while 能朝给定总目标前进一 步 do 求出可行解的一个解元素; 由所有解元素组合成问题的一个 可行解;
事件编号 1 2 3 4 5 6 7 8 9 10 11
发生时刻 1 3 0 5 3 5 6 8 8 2 12
结束时刻 4 5 6 7 8 9 10 11 12 13 14
常见应用‫ﻻ‬
会议安排问题贪心算法: void GreedySelector(int n, Type s[], Type f[], bool A[]) {
A[1]=true; int j=1; for (int i=2;i<=n;i++) {
if (s[i]>=f[j]) { A[i]=true; j=i; }
else A[i]=false; } }
常见应用‫• ﻻ‬
2、哈夫曼编码
【问题陈述】哈夫曼编码是广泛地用于数据文件压缩的十分有效的 编码方法。其压缩率通常在20%~90%之间。哈夫曼编码算法用字 符在文件中出现的频率表来建立一个用0,1串表示各字符的最优表 示方式。 【算法思路】 (1)以n个字母为结点构成n棵仅含一个点的二叉树集合,字母的 频率即为结点的权。 (2)每次从二叉树集合中找出两个权最小者合并为一棵二叉树: 增加一个根结点将这两棵树作为左右子树。新树的权为两棵子树的 权之和。 (3)反复进行步骤(2)直到只剩一棵树为止。
的数的最大值。
826
解:如果用贪心法,每次向最大的方向 走,
得到结果为1+6+8+2+3=20。可是明明还 2 1 6 5 有另一条路,1+3+6+6+7=23。
问题出在哪?每次的选择对后面的步骤会有 3 2 4 7 6 影响!第三级选了8,就选不到第四、五 级较大的数了。
综述 贪心算法是一种分级处理方法,它得到某种度量意义下
贪心——抱歉我找不到更好的词去形 容——是个好东西。贪心是对的,贪 心是奏效的。
——电影《华尔街》
算法思想‫ﻻ‬
将问题的求解过程看作是一系列选择,每 次选择一个输入,每次选择都是当前状态下的 最好选择(局部最优解)。每作一次选择后,所 求问题会简化为一个规模更小的子问题。从而 通过每一步的最优解逐步达到整体的最优解。
问题的整体最优解 中包含着它子问题 的最优解
【常见应用】会议安排问题,哈夫曼编码问题, 等等
【算法优点】求解速度快,时间复杂性有较低的阶.
【算法缺点】需证明是最优解.
常见应用‫ﻻ‬
1、会议安排问题
【问题陈述】设有n个会议E={1,2,…,n}要使用同一资源,同一时间内 只允许一个会议使用该资源. 设会议i的起止时间区间[si, fi) ,如果选
5
3
7
8
谈谈自己的 想法——
选择需慎重
贪心算法在对问题求解时,总是作出在当前看
来是最好的选择。也就是说,不从整体上加以考虑,
它所作出的仅仅是在某种意义上的局部最优解。
eg:数字三角形问题:有一个数字三角形 1
(如右图)。现有一只蚂蚁从顶层开始
向下走,每走下一级时,可向左下方向 6 3
或右下方向走。求走到底层后它所经 过
(3)贪心算法只能确定某些问题的可行性范围。
因此,贪心算法具有局限性,并不是总能得到最优 解。
欢迎老师和同 学们批评指正!
谢谢观看
※简谈: 算法思想 算法过程 算法分析
※应用举例:
常见应用
算法思想‫ﻻ‬
引例——找零钱
找钱的方法: 25+25+10+5+1+1
我们有种直觉的倾向:
在找零钱时,直觉 告诉我们使用面值大的硬 币,剩余的金额就越少, 这样找的硬币数目最少。
算法思想‫ﻻ‬
在现实生活中,我们经常为下意 识的做贪心的选择,例如在购买商品 时候总是寻求物美价廉的物品,在质 量相同情况下,价格低的首选。
择了会议i,则它在时间区间[si, fi)内占用该资源;若[si, fi)与[sj, fj)不
相交 , 则称会议 i 与 j 是 相容 的 . 求解目标是在所给的会议集合中 选出最大相容会议子集. 【算法思路】将n个会议按结束时间非减序排列,依次考虑会议i, 若i 与已选择的会议相容,则添加此会议到相容会议子集. 【例】设待安排的11个会议起止时间按结束时间的非减序排列
真正意义要求解原问题
将原问题变成更小 子问题的步骤
理解
算法过程‫ﻻ‬
【贪心算法一般步骤】
1、设计数据找规律 2、进行贪心猜想 3、正确性证明(严格证明和一般证明)
·严格证明:数学归纳和反证法 ·一般证明:列举反例 4、程序实现
算法分析‫ﻻ‬
【适用问题】 具备贪心选择和最优子结构性质的最优化
问题
整体的最优解可通过一系列 局部最优解达到. 每次的选择 可以依赖以前作出的选择, 但 不能依赖于后面的选择
构造过程:
5
29
7
8
14 23
百度文库
3
11
0 100 1
42
0
1
58 1
0
a: 0000 c: 1000 e: 101
b :11 d: 1001 f :01
19
23
29 29 g: 0001 23h:001
29 1 29
14
23
0
1
0
8 0
11 1
209
15 7 1
14 298
14 14
2233 11 11
一个问题的最优解,所做的每一次选择都是当前状态下的贪 心选择,通过一系列的选择来得到最终解。这种策略是一种 很简洁的方法,适用于许多问题,但并不能依赖于它,因为 它还有一下不足:
(1)不能保证求得的最后解是最佳的,由于贪
心策略总 是从局部看来是最优的选择,因此从整 体上考虑并不一定是最优解;
(2)贪心算法只能用来求某些最大或最小解的 问题;
相关文档
最新文档