- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * * * * * * * * Meld Two Min Leftist Trees 8 6 6 8 4 6 Meld right subtree of tree with smaller root and all of other tree. Meld Two Min Leftist Trees 8 6 Meld right subtree of tree with smaller root and all of other tree. Right subtree of 6 is empty. So, result of melding right subtree of tree with smaller root and other tree is the other tree. Meld Two Min Leftist Trees Swap left and right subtree if s(left) s(right). Make melded subtree right subtree of smaller root. 8 6 6 8 6 8 Meld Two Min Leftist Trees 8 6 6 6 4 8 8 6 6 4 6 8 Make melded subtree right subtree of smaller root. Swap left and right subtree if s(left) s(right). Meld Two Min Leftist Trees 9 5 3 Swap left and right subtree if s(left) s(right). Make melded subtree right subtree of smaller root. 8 6 6 6 4 8 Meld Two Min Leftist Trees 9 5 3 8 6 6 6 4 8 * 福州大学数学与计算机科学学院 * 合并的复杂度 合并操作都是一直沿着两棵左偏树的最右路径进行的。 一棵N个节点的左偏树,最右路径上最多有 log(N+1) 个节点。 因此,合并操作的时间复杂度为:O(log N) * * 福州大学数学与计算机科学学院 * 11.6 应用举例--哈夫曼编码 哈夫曼提出了一种构造最优前缀码的贪心算法,由此产生的编码方案称为哈夫曼编码。 哈夫曼算法以自底向上的方式构造表示最优前缀码的二叉树T。 算法以|C|=n个叶结点开始,执行n-1次合并运算后产生最终所要求的哈夫曼树T。 编码字符集中每一字符c的频率是f(c)。 以f为键值的优先队列Q用于在做贪心选择时有效地确定算法当前要合并的2棵具有最小频率的树。 一旦2棵具有最小频率的树合并后,产生一棵新的树,其频率为合并的2棵树的频率之和,并将新树插入优先队列Q。 * 福州大学数学与计算机科学学院 * 哈夫曼树(Huffman)——带权路径长度最短的树 定义 路径:从树中一个结点到另一个结点之间的分支构成这两个结点间的路径 路径长度:路径上的分支数 树的路径长度:从树根到每一个结点的路径长度之和 树的带权路径长度:树中所有带权结点的路径长度之和 Huffman树——设有n个权值{w1,w2,……wn},构造一棵有n个叶子结点的二叉树,每个叶子的权值为wi,则wpl最小的二叉树叫Huffman树 * 福州大学数学与计算机科学学院 * 例 有4个结点,权值分别为7,5,2,4,构造有4个叶子结点的二叉树 a b c d 7 5 2 4 WPL=7*2+5*2+2*2+4*2=36 d c a b 2 4 7 5 WPL=7*3+5*3+2*1+4*2=46 a b c d 7 5 2 4 WPL=7*1+5*2+2*3+4*3=35 * 福州大学数学与计算机科学学院 * 构造Huffman树的方法——Huffman算法 构造Huffman树步骤 根据给定的n个权值{w1,w2,……wn},构造n棵只有根结点的二叉树,令起权值为wj 在森林中选取两棵根结点权值最小的树作左右子树,构造一棵新的二叉树,置新二叉树根结点权值为其左右子树根结点权值之和 在森林中删除这两棵树,同时将新得到的二叉树加入森林中 重复上述两步,直到只含一棵树为止,这棵树即哈夫曼树 * 福州大学数学与计算机科学学院 * typedef priority_queuenode,vectornode,greaternode minq; node huffman(vectorint f) { //哈夫曼算法 minq q; for(int i=0;if.size();i++)if(f[i])q.push(
文档评论(0)