!第3章 贪心算法.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
!第3章 贪心算法

QA 2.构造哈夫曼编码 * 哈夫曼树用下面的方式构建:首先,我们把所有出现的字符作为一个单节点数,在节点上标识一个数字代表字符出现频率。  例如如果我们要对字符串“aabbbccccdddddd 进行编码,则字符频率表如下所示:    ----------------------------   | ? ?? a ? ? ? b ? ? ? c ? ? ? d ?? | ?  ----------------------------   | ? ?? 2? ? ?? 3?????? 4?????? 6??? | ? ? ? ---------------------------- 2.构造哈夫曼编码 * ----------------------------   | ? ?? a ? ? ? b ? ? ? c ? ? ? d ?? | ?  ----------------------------   | ? ?? 2? ? ?? 3?????? 4?????? 6??? | ? ? ? ----------------------------  最终的编码方式是,每个 叶子节点代表了一个在原文中出现的字符。每个字符的编码就是从根节点到该叶子节点的路径。由于字节中的每一位由0,1两种状态,这也正是二叉树尤其重要和常用的原因。从根节点出发,如果进入左子树,则在编码上填0,如果进入右子树,则在编码上填1,直到到达叶子节点,就完成了该字符的编码。从上面的哈夫曼树可见,最终的哈夫曼编码表如下:   =======================   ? 字符????? 频率????? 编码???????? 码长   ------------------------------------   a??????? 2???????? 110????????? 3 ????????b??????? 3???????? 111????????? 3 ??????? c??????? 4???????? 10??????????? 2 ??????? d??????? 6???????? 0?????????????1   ========================? 3.4 哈夫曼编码 在书上给出的算法huffmanTree中,编码字符集中每一字符c的频率是f(c)。以f为键值的优先队列Q用在贪心选择时有效地确定算法当前要合并的2棵具有最小频率的树。一旦2棵具有最小频率的树合并后,产生一棵新的树,其频率为合并的2棵树的频率之和,并将新树插入优先队列Q。经过n-1次的合并后,优先队列中只剩下一棵树,即所要求的树T。 算法huffmanTree用最小堆实现优先队列Q。初始化优先队列需要O(n)计算时间,由于最小堆的removeMin和put运算均需O(logn)时间,n-1次的合并总共需要O(nlogn)计算时间。因此,关于n个字符的哈夫曼算法的计算时间为O(nlogn) 。 * 3.4 哈夫曼编码 3.哈夫曼算法的正确性 要证明哈夫曼算法的正确性,只要证明最优前缀码问题具有贪心选择性质和最优子结构性质。 (1)贪心选择性质 (2)最优子结构性质 * * 哈夫曼算法的正确性证明 1、贪心选择性质 设C是编码字符集,C中字符c的频率为f(c)。又设x和y是C中具有最小频率的两个字符,存在C的最优前缀码使x和y具有相同码长且仅最后一位编码不同。 证明:设二叉树T表示C的任意一个最优前缀码。下面证明可以对T做适当修改后得到一棵新的二叉树T”,使得在新树中x和y是最深叶子且为兄弟。同时新树T”表示的前缀码也是C的最优前缀码。如果能做到这一点,则x和y在T”表示的最优前缀码中就具有相同的码长且仅最后一位编码不同。 * 设b和c是二叉树T的最深叶子且为兄弟。不失一般性可设f(b) ≤f(c),f(x) ≤f(y)。由于x和y是C中具有最小频率的两个字符,故f(x) ≤f(b),f(y) ≤f(c) 。 首先在树T中交换叶子b和x的位置,得到树T’,然后再树T’中再交换叶子c和y的位置,得到树T”。 编码树T的变换 * 由此可知,树T和树T’表示的前缀码的平均码长之差为 相同点抵消 长度替换 * 由此可知,树T和树T’表示的前缀码的平均码长之差为 最后一个不等式是因为两个括号均取非负值。 类似地,可以证明在T’中交换y与c的位置也不增加平均码长,即B(T’)-B(T”)也是非负的。由此可知 B(T”) ≤B(T’) ≤B(T)。另一方面,由于T所表示的前缀码是最优的,故B(T) ≤B(T”)。因此B(T)=B(T”),即T”表示的前缀码也是最优前缀码,且x和y具有

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档