算法导论16.3-5--huffman树的表示
2012-12-08 13:30
1121 查看
题目:假设有一个字母表C={0,1,2,3,4,...,n-1}上的最优前缀编码,我们想用尽可能少的位来传输。 证明:C上的任意一个最优前缀编码都可由 2n-1+n*ceil(log(n)) 个位的序列来表示。(提示:用2n-1位说明树的结构,通过树的遍历来发现) 解答: http://stackoverflow.com/questions/759707/efficient-way-of-storing-huffman-tree?answertab=votes#tab-top 翻译一下: 对字母表n个字符用定长二进制编码,每个字符用N=ceil(log(n))个位(bit),C对应的huffman树有n个叶子,可以证明:任何非空二叉树,度为2的结点比叶结点个数少1,因此该树有n-1个内结点 每个结点用1个bit表示其是否是叶结点,1--是叶结点,0--不是叶结点 从根节点开始,处理当前结点: 1、如果是叶结点,输出1(1个bit),紧跟着是该字符的编码(N=ceil(log(n))个bit) 2、如果是内部结点,输出0(1个bit),递归处理其左孩子(先)和右孩子(后) 恢复出这棵树: 1、读一个bit,如果是1,再读N个bit,返回新结点,值为N个bit对应的字符,没有孩子 2、如果是0,递归处理左右孩子,返回新结点(有左右孩子),该结点无字符(内结点嘛) 下面是原作者给的伪代码:
//对树编码 void EncodeNode(Node node, BitWriter writer) { if (node.IsLeafNode) { writer.WriteBit(1); writer.WriteByte(node.Value); } else { writer.WriteBit(0); EncodeNode(node.LeftChild, writer); EncodeNode(node.Right, writer); } } //恢复树 Node ReadNode(BitReader reader) { if (reader.ReadBit() == 1) { return new Node(reader.ReadByte(), null, null); } else { Node leftChild = ReadNode(reader); Node rightChild = ReadNode(reader); return new Node(0, leftChild, rightChild); } }更多内容,去看原文吧,原文还给了实例
相关文章推荐
- 算法导论10.4有根树的表示习题
- 有根树的表示_第10章_基本数据结构_算法导论
- 算法导论16.3-3
- 链表的多重数组表示(算法导论10-3)
- 每天学习一算法系列(27)(输入两个整数序列。其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序)
- 算法导论 8-3思考题 之变长数据项的排序
- 10.2-5 用环形单链表来实现字典操作INSERT、DELETE和SEARCH,并给出它们的运行时间 算法导论答案
- 结构算法导论——图
- 算法导论之插入排序
- 算法训练 2的次幂表示
- 算法、数据结构经典资料简介(TAOCP、Robert Sedgewick、算法导论、编程珠玑)
- ACM日记——算法导论.15章 动态规划(一)
- 动态规划(算法导论学习笔记)
- [算法导论]第六章《堆排序》
- 基本数据结构(算法导论)与python
- 自做算法导论第一章练习题