09贪婪策略

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

30
a:45
55
14 f:5 e:9
d:16
25 c:12 b:13
30ቤተ መጻሕፍቲ ባይዱ
14 f:5 e:9
d:16
算法伪代码描述
• • • • • • • • • • HUFFMAN(C) 1 n ← |C | 2Q←C 3 for i ← 1 to n - 1 4 do 分配新的节点z 5 left[z] ← x ← DEQUEUE(Q) 6 right[z] ← y ←DEQUEUE(Q) 7 f [z] ← f [x] + f [y] 8 ENQUEUE(Q, z) 9 return DEQUEUE(Q) 返回树的根
1第 i 个 活 动 在 此 最 大 相 容 活 动 组 中 x i 0 否 则
• i=1, 2, …, n
最优子结构
• 定义集合 • Sij = {ak S : fi ≤ sk < fk≤sj} ,为表示整个问题,添 加两个假想的活动a0和an+1并约定f0 = 0及sn+1 = ∞。于是S = S0 n+1,而i和j的取值范围为0≤i,j ≤n + 1。显然只要i j,就有Sij = 。假定Sij的 一个解包含活动ak,每一个都构成Sij中的活动 的子集。设Aij是Sij的一个最优解,akAij。利用 ak产生两个子问题: Sik和Skj,则Aij中Sik的解Aik和 Skj的解Akj必对于: Sik和Skj也是最优的。
算法伪代码描述
• • • • • • • • RECURSIVE-ACTIVITY-SELECTOR (s, f, i, j) 1m←i+1 2 while m < j 且 sm < fi 求Sij中的第一个活动 3 do xm←0 4 m←m+1 5 if m < j 6 then xm←1 7 RECURSIVE-ACTIVITY-SELECTOR (s, f, m, j)
算法的运行时间
• 假定所有的活动已按完成时间排好序,则 调用RECURSIVE- ACTIVITY- SELECTOR (s, f, 0, n+1)的运行时间是Θ(n)。这是因为在所有的 递归调用中,每个活动仅在第2行的while循 环中被检测一次。特殊地,对i < k,ak活动 是在最后一次调用中被检测的。
第9章 贪婪策略
9.1 活动选择问题
• 假定有n个需要使用同一个这样的资源的活动,每次只能有一个活动 使用该资源。每一个活动有一个开始时间 si,一个完成时间 fi,其中0 si < fi < ∞。如果区间[si , fi)和[sj , fj)不相交,活动ai和aj是相容的(即 如果si fj 或 sj fi,ai和aj相容)。活动选择问题是选取一个由相容活 动构成的最大集合。 • 输入:按完成时间排好序的活动开始时间数组s,完成时间数组 f。 • 输出:表示一个最大的相容活动组的向量{x1, x2, …, xn},其中

字符c对应的叶子在编码树T中的深度dT(c)与其频数积的和cCdT(c) f(c),称为T 的代价,记为B(T)。B(T)恰表示信息的存储量。
• 确定字符频数的字符集C的不同编码树T表 示不同的前缀码编码方案,其代价也不同 ,我们的目标是寻求代价最小的编码树对 应的前缀码,称为最优编码。C的最优编码 树必是一棵满2-叉树。 • 输入:字符集C及频数f (c),cC。 • 输出:以C中字符为叶子的满二叉树T,使 ( ) f( cd ) T( c ) 得代价 BT 最小。
算法的运行时间
• 第2行创建最小优先队列Q耗时Θ(n),第5、 6两行从优先队列Q中卸载队首各耗时Θ(lgn) ,第8行中将新的树插入到队列中耗时 Θ(lgn),第3~8行的for循环重复Θ(n)次,所 以过程HUFFMAN的总耗时为Θ(n lgn)。
9.3 最小生成树
• 设G=<V, E>是一个无向连通图,n个顶点用 前n个正整数编号,即V={1, 2, …, n}。G具有 权函数w: ER。目标是找到G的一棵生成树 T ,使得其权w(T)——树中每条边的权之和 ——最小。本问题的形式化为: • 输入:图G=<V, E>及权函数w: ER。 • 输出:G的一棵生成树T,使得w(T )最小。
贪婪选择性
• 定理9-1 • 考虑任一非空子问题Sij,并设am为Sij中最早完 成的一个活动: • fm = min {fk : ak Sij}。 • 则 • (1)活动am包含在Sij的一个最大相容活动子 集合中。 • (2)子问题Sim是空的,所以选择am将使得Smj 成为仅有的非空子问题。
(a)
f:5
e:9
c:12
b:13
d:16
a:45
(b)
c:12
b:13 f:5
14 e:9
d:16
a:45
(c) f:5
14 e:9
d:16 c:12
25 b:13
a:45
(d) c:12
25 b:13
30
a:45
14 f:5 e:9
d:16
(e)
a:45
55
(f)
100
25 c:12 b:13
c C
最优子结构
• 设T为字符集C的一棵最优前缀码树,T 的两 个孩子分别为T1和T2。设C1和C2分别是T1和 T2中叶子所对应的字符集。显然,C1C2= C,C1C2=。则T1和T2分别为C1和C2的最 优前缀码树。
贪婪选择性
• 定理9-2 • 设C为一个字母表,其中的每一个字符c C具有频数f [c]。 设x和y是C中的两个频数最小的字符。则 • (1)存在C的一棵最优前缀码树T,在此编码树中x和y是 兄弟叶子。 • (2)设C ' 是在C中移除字符x、 y并加入新的字符z的字母 表,所以C ' = C - {x, y} {z};定义C ' 中的 f 除了f [z] = f [x] + f [y]外,其余的和在C中的一样。设T ' 为任一棵表示C ' 的 一个最优前缀码的树。则在树T '中将叶子z替换为以x为左 孩子,y为右孩子的一个内点得到的树T为表示字母表C的 一个最优前缀码的树。
9.2 Huffman编码
• 对组成信息的字符集合C={c1, c2, …, cn}进行2-进制编码,设各字符在信息中出 现的频数为{f1, f2, …, fn}。若任何一个字符的编码不是另一字符编码的前缀,称 该编码方案为前缀码。前缀码对应一棵编码树T:n个字符对应n片叶子,从根 起到达一片叶子的路径对应该片叶子字符的编码向左的树枝对应0,向右的树 枝对应1。
相关文档
最新文档