算法设计与分析第四章-1

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

哈夫曼编码-贪婪思想
B(T ) f (c) dT (c)
cC
频率小的字符,深度大
哈夫曼编码
例1. 字符集 C {a, b, c, d , e} , f {7,8,9,12,16} 。
解: 15
7 8 9 12 16 52 4次 合 并 16 8 7 8 21 9 12 15 16 7 31 15 15 7 16 8 21 9 12
8 6 9 8 12 10 11 12 2 14 13
思考如下具有11个活动安排的问题?
1 2 5 0 9 6 3 3 5 4 5 7 5 3 8 6 1 4 7 8
11 10
活动安排问题
设待安排的11个活动起止时间按结束时间的非减序排列
i
si
6 1
3 3
2 0
4 5
5 3
1 5
8 6
7 8
9 8
20, 80],c=400.
解:所考察货箱的次序为 :7, 3, 6, 8, 4, 1, 5, 2。 7 20 3 70 6 8 4 290 1 390 5
120
200
(1, 0, 1, 1, 0, 1, 1, 1)
§4.4 哈夫曼编码
哈夫曼编码
字符
a
b
c
d
e
f
频率 45 (千次) 定长码 000
贪心算法-与动态规划算法的差异
0-1 背包问题:给定 n 种物品和一个背包。物品 i 的重量 是 wi ,其价值为 v i ,背包的容量为 c 。问如何选择装入背 包中的物品,使得装入背包中物品的总价值最大?
01
要求找出一个 n 元 0-1 向量
( x1 , x2 ,, xn ), xi {0,1 },1 i n ,
si
fi
sj
sj
fj
fj
目标:在活动集合中选择最大的相容活动子集合。
活动安排问题
选择活动为未安排活动 留下尽可能多的时间
?
思路:最早结束的活动,优先安排。
将n个活动按结束时间非减序排列
活动安排问题
f1
f2
f3
f4

fn
1
3
……..
活动安排问题-练习
活动 i 与当前集合 A 中所有活动相容
si f j
For i=1 to k do 选择出最大的数,并将它从输入中删除 Endfor
是一种典型的贪心方法,在每一步选择出最大的数。
贪心算法
顾名思义是“择优录取” 国外叫做Greedy method
贪心法得到的解
往往不是最优解,
而是次优解
在贪心算法中采用逐步构造最优解的方法。 在每个阶段,都作出一个看上去最优的决策。
11 10 2 12
fi
4
5
6
7
8
9
10 11 12 13 14
1
4
5
7 8
11 12
14
{6,4,7,10}
活动安排问题-活动安排问题具有贪心选择性质
证明:1)证明活动安排问题有一个最优解以贪心选择开始。
设 A 是所给的活动安排问题的一个最优解,且 A 中活动 也按 f i 非减序排列,A 中的第一个活动是活动 k 。
使得 wi xi c , vi xi 达到最大。
i 1 i 1
n
n
贪心算法
背包问题:与 0-1 背包问题类似,所不同的是在 选择物品 i 装入背包时,可以选择物品 i 的一部分。
要 求 找 出 一 个
n
元 向 量
贪心 算法
( x1 , x2 ,, xn ),0 xi 1,1 i n ,使得
若 k 1 ,则 A 就是一个以贪心选择开始的最优解;
否则,构造
B A {k} {1}
(下面证明B也是该活动安排问题的最优解)
活动安排问题
2)每一步贪心选择→问题的整体最优解
若 A 是 E 的最优解,则 A' A {1} 是 E ' {i E si f1}的最优解。
e
f
?
1101 1100 100 101
0 0 1 0 1 1 1 0 1
a a
b
e
哈夫曼编码-前缀码
定义:对每一个字符规定一个0,1串作为其代码,并要求 任一字符的代码都不是其它字符代码的前缀,这种编码
称为前缀码。
{0,101,100,111,1101,1100}
0 0 1 0 1 1 1 0 1
贪心算法
例2:要找给顾客三角七分钱,如果硬币面值 为11分、7分、5分、1分,希望用数目最少的 硬币找给顾客。
贪心算法: 11分
1分 最优解:
11分
1分
11分 1分 1分
7
失败?
2枚11分硬币 3枚5分硬币 5
贪心算法-成功示例
单源最短路径问题、 最小生成树问题、 以及作业调度等。
§4.2 贪心算法的基本要素
价值 24.25 28.2
(0,2/3,1)
(0,1,1/2)
20
20
31
31.5
选取度量标准是用贪心法求解问题的关键。
贪心算法
0-1背包问题的几种贪婪策略:从剩余的物品中 1) 选择可以装入背包的价值最大的物品;
2) 选择可装入背包的重量最小的物品;
vi 3)可装入包的 值最大的物品。 wi
不能保证得到最优解
0 c:9 1 d:12
31 0 1
15 0 1 a:7 b:8 e:16
a:100
b:101 c:00 . . .
哈夫曼编码-练习
设在1000个字母的文章中各字母出现的频率为:a:83, b:14, c:28, d:38, e:131, f:29, g:20, h:53......,求最优编码。
396
0
1
0
155
1
0
241
1
72
0 1
83
0
110
1
131 57
34
0 1
38
53
0
1
14
20
a:01 ; b:0000; c:1010; d:001; e:11; f:1011; g:0001; h:100
28
29
b
哈夫曼编码-正确性
1) 贪心选择性质
T ''
T
x
b
y
T'
c
x
y
b b
c
y
x
c
哈夫曼编码
贪心算法的基本要素
贪心算法通过一系列的选择来得到问题的解。 它所做的每一个选择都是当前状态下局部的 最好选择,即贪心选择。 问题?
贪心算法?
贪心算法的基本要素
(1) 最优子结构性质
(2) 贪心选择性质
贪心算法的基本要素
所谓贪心选择性质是指所求问题的整体 最优解可以通过一系列局部最优的选择, 即贪心选择来达到。
贪心算法-练习
例2 c 50,W (10,20,30),V (60,100 ,120)
v1 60 6 w1 10
v2 100 5 w2 20
v3 120 4 w3 30
贪心算法: 60
失败
160
最优解应为装入后两种物品,价值220
§4.1 活动安排问题
活动安排问题
贪心法与动态规划法的比较
贪心选择依赖于以往作出的选择,不依赖于子问题的解。
动态规划法:每步所作的选择依赖于相关子问题的解。
贪心算法的基本要素
思路-贪心选择性质:
证明每步贪心选择
步骤如下:
问题的整体最优解
1)假设问题有一个整体最优解,并证明可修改
这个最优解,使其以贪心选择开始。 2)运用数学归纳法证明: 每一步贪心选择→问题的整体最优解。
如果能找到 E ' 的一个解 B ' ,它包含比 A’更多的活动,则
B ' {1} 优于 A ,即它包含比 A 更多的活动。
矛 盾
对贪心选择次数用数学归纳法即知,贪心算法
GreedySelctor最终产生原问题的最优解。
§4.3 最优装载
最优装载
有一批集装箱要装上一艘载重量为 c 的轮船,已知集装箱
变长码 0
13
001 101
12
010 100
16
011 111
9
100 1101
5
101 1100
定长码: 300
变长码:
45 1 13 3 12 3 16 3 9 4 5 4 224
哈夫曼编码
字符
变长码
a 0 0
b 101 1
c 100 10
d 111 11
21
9 12
31
哈夫曼编码
队列 Q 以 f (c) 为键值存放二叉树各结点,通过贪心选择, 将最小频率的两个二叉树合并,然后将新树(频率为上 述两个二叉树频率之和)插入 Q 中。
两小无猜
哈夫曼算法复杂性:
关于 n 个字符的哈夫曼算法的计算时间为 O(n log n) 。
哈夫曼编码
52 0 1
21
轮船载重有限
排 序
贪心选择策略:重量最轻者优先装载
[算法思路]将装船过程划为多步选择,每步装一个货箱,每
次从剩下的货箱中选择重量最轻的货箱。如此下去直到所有 货箱均装上船或船上不能再容纳其他任何一个货箱。
最优装载-贪心算法
例3. 设n=8,[w1,…,w8]=[100, 200, 50, 90, 150, 50,
i(1 i n) 的重量为 wi ,最优装载问题要求在装载体积不受
限制的情况下,将尽可能多的集装箱装上轮船。
n xi max i 1 n wi x c s.t. i 1 i xi {0,1},1 i n
装入
不装入
最优装载
尽可能多的集装箱装上轮船
v1 25 解:1) 1.39 w1 18
v3 15 1.5 w3 10
2)在背包中放入物品2,重量为15,价值为24;
3) 在背包中放入一半物品3,此时背包重量为 20,价值为31.5
v2 24 1.6 w2 15
贪心算法
重量 (1/2, 1/3,1/4) (1,2/15,0) 16.5 20
w x
i 1 i
n
i
c ,而且 vi xi 达到最大。
i 1
n
贪心算法
用贪心算法求解背包问题的步骤:
vi 1) 计算每种物品的单价 ; wi
Байду номын сангаас
O(n log n)
2) 按物品的单价,从大到小排序; 3) 单价高的物品优先装包,直至装满。
贪心算法-练习
例 1. n 3, c 20,W (18,15,10),V (25,24,15)
( f (b) f ( x))(dT (b) dT ( x)) 0
B(T '' ) B(T ' ) B(T )
B(T ) B(T '' )
B(T ) B(T '' )
哈夫曼编码
2)最优子结构性质
T
作出贪婪决策的依据称为贪婪准则( criterion)。
贪心算法-找零钱
例1:假设有4种硬币,它们的面值分别为二角五分、一角、 五分和一分。要找给顾客六角三分钱,希望用数目最少的硬 币找给顾客。
选出一个面值不超过六角三分的硬币,即二角五分;
选出一个面值不超过三角八分的最大硬币,即二角五分; 选出一个面值不超过一角三分的最大硬币,即一角; 选出一个面值不超过三分的最大硬币,即一分(3次)。
a a b e
哈夫曼编码
100
0
5
1
a:45 25
0
55
0 1
完全 二叉 树
30
1 0 1
6
树叶:字符
c:12
b:13
0
14
1
d:16
前缀码:树根到树叶的路径
{0,101,100,111,1101,1100}
f:5
e:9
哈夫曼编码
100
0
1
a:45 25
0
55
0 1
30
1 0 1
c:12
b:13
0
14
1
d:16
f:5
e:9
哈夫曼编码-问题
给定编码字符集 C 及 C 中任一字符 c 的出现频率 f (c) 。
C 的一个前缀码编码方案对应于一棵二叉树 T

字符 c 在树 T 中的深度记为 dT (c) 。
定义该编码方案的平均码长:
B(T ) f (c)d T (c)
cC
找到使平均码长达到最小的前缀码编码方案
由于 x 和 y 是 C 中具有最小频率的两个字符, 故 f ( x) f (b), f ( y) f (c) 。
B(T ) B(T ' ) f (c)dT (c) f (c)dT ' (c)
cC cC
f ( x)dT ( x) f (b)dT (b) f ( x)dT ' ( x) f (b)dT ' (b)
设有 n 个活动的集合 E {1,2,, n} ,每个活动 i 都有一个使用 该资源的起始时间 s i 和一个结束时间 f i ,且 si f i 。如果选 择了活动 i ,则它在半开时间区间 [si , f i ) 内占用资源。
若区间 [si , f i ) 与区间 [s j , f j ) 不相交, 则称活动 i 和活动 j 是相容的。 即 si f j 或 s j f i 。
第四章 贪心算法
贪心算法-学习要点
贪心算法的基本概念与基本要素 几个实例: 活动安排、最优装载、Huffman编码、 单源最短路径、最小生成树、多机调度问题、
☻ 重点与难点:
关键是如何选择贪心策略;
如何证明你选择的贪心策略能获得最优解
贪心算法
N个输入
约束条件
可行解
准则
最优解
贪心算法
已知 n 个数的集合,要求从中选择出 k 个数,使得 在所有可能挑出的 k 个数中,它们的和最大。
相关文档
最新文档