Huffman-encoding
刚学还热乎的算法
- 哈夫曼(Huffman)编码
Prefix Codes (前缀码)
考虑使用不同长度的 bit string
来编码不同的字符串,其中一种保证没有一个 bit string
对应两个及以上的字符串的编码叫做 prefix
codes(前缀码)。
prefix code
可以通过二叉树来表示,每一个树中的叶节点的标签即为对应的字符串,而一条连接
left child 的边的标签被指定为
例子

对于这棵树,其中
Huffman Coding
那么哈夫曼编码是什么呢?其实是为了解决生成一颗比较"好"的 Prefix Tree,来实现更短的 bit string 编码长度,哈夫曼编码是一种基本的数据压缩算法,通过压缩编码长度,我们便能减小压缩文件的大小。
原理
先给出算法的伪代码

这是一个贪心的算法,其通过某个字符串出现的频率(概率)来建立前缀树,容易知道,我们如果让出现频率越高的字符的编码越短,那么压缩比自然就越大,而这个算法实现中,是从叶节点建起,也就是每次将两子树合并到一个新的根节点上,那么可以知道,因为越先合并的节点,在树的越深的层,也就意味着更长的编码,那么反向思维,我们应该先从出现频率低的字符开始。由此来保证每次两个子树的总权重(出现频率)和是最小的,于是可以获得一个全局最优。
这有一个值得注意的问题:这里给出的算法并未指定存在两子树权重相等时的行为,在实际实现中应当指定,但这并不会影响编码效果。
M-ary Huffman Coding(m 叉树的 huffman Coding)
m 叉树的的算法与二叉树并不完全相同

其中主要差别在于对于
根据定义: A vertex of a rooted tree is called a leaf if it has no children.
一棵树只有个 vertex(root),似乎也能被称作 leaf.
对于
对于
实现
要图的结构,还是先放放