# 哈夫曼编码 什么是编码? [参考](https://blog.csdn.net/qq_41627408/article/details/137659345?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-137659345-blog-79513018.235^v43^pc_blog_bottom_relevance_base5&spm=1001.2101.3001.4242.1&utm_relevant_index=3) --- 哈夫曼编码,又称为赫夫曼编码(Huffman Coding),是一种可变长编码( VLC, variable length coding))方式,比起定长编码的 ASCII 编码来说,哈夫曼编码能节省很多的空间,因为每一个字符出现的频率不是一致的;是一种用于无损数据压缩的熵编码算法,通常用于压缩重复率比较高的字符数据。 --- 如果我们通过转换成ASCII码对应的二进制数据将字符串 BCAADDDCCACACAC 通过二进制编码进行传输,那么一个字符传输的二进制位数为 8bits,那么总共需要 120 个二进制位;而如果使用哈夫曼编码,该串字符可压缩至 28位。 ![image](http://39.99.183.126:8888/file/2/ISLZwGGQLr5YOPUlVSqZC.png) --- 程序实现: ```c++ //c++编码实现 #include
#include
char a[] = "BCAADDDCCACACAC"; using namespace std; int main(void) { return 0; } ``` --- ## 一、哈夫曼编码方法 哈夫曼编码首先会使用**字符的频率**创建一棵**树**,然后通过这个**树的结构**为每个字符生成一个特定的编码,**出现频率高的字符使用较短的编码**,出现频率低的则使用较长的编码,这样就会使编码之后的字符串**平均长度降低**,从而达到**数据无损压缩**的目的。 --- **1. 计算字符串中每个字符的频率:** ![image](http://39.99.183.126:8888/file/2/me_zC7XkZCmkW8Z4FMgez.png) --- **2. 按照字符出现的频率进行排序,组成一个队列 Q** 出现频率最低的在前面,出现频率高的在后面。 ![image](http://39.99.183.126:8888/file/2/vKlhdVvC2i6nt7X7lbyXm.png) --- 编程实现: ```c++ // 使用STL的 priority_queue来实现频率排序 #include
struct Item { char c; int freq; bool operator < (const Item it) const { if(freq == it.freq) return c < it.c; return freq < it.freq; } }; int len; priority_queue
pq; void handleChar() { map
m; for(int i = 0; i < strlen(a); i++) m[a[i]]++; for(auto i:m) pq.push_back({i.first, i.second}); len = pq.size(); } ``` --- **3. 把这些字符作为叶子节点开始构建一颗哈夫曼树** 哈夫曼树又称为**最优二叉树**,是一种**带权路径长度最短的二叉树**。 --- (1)首先创建一个空节点 z,将最小频率的字符分配给 z 的左侧,并将频率排在第二位的分配给 z 的右侧,然后将 z 赋值为两个字符频率的和;然后从队列 Q 中删除 B 和 D,并将它们的和添加到队列中,上图中 * 表示的位置。 ![image](http://39.99.183.126:8888/file/2/oyQgVJvG0jH9mOTsBCXdg.png) --- (2)紧接着,重新创建一个空的节点 z,并将 4 作为左侧的节点,频率为 5 的 A 作为右侧的节点,4 与 5 的和作为父节点,并**把这个和按序加入到队列中,再根据频率从小到大构建树结构(小的在左)**。 ![image](http://39.99.183.126:8888/file/2/lghDft8Y0-pVyWU9AZGsf.png) --- (3)继续按照之前的思路构建树,直到所有的字符都出现在树的节点中,哈弗曼树构建完成。 **节点的带权路径长度**为从根节点到该节点的路径长度与节点权值的乘积。 该二叉**树的带权路径长度** WPL = 6 * 1 + 5 * 2 + 3 * 3 + 1 * 3 = 28。 ![image](http://39.99.183.126:8888/file/2/w13iLWgzgWXnrQ7qw1Col.png) --- **4. 对字符进行编码:** 哈夫曼树构建完成,下面我们要对各个字母进行编码,编码原则是:对于每个非叶子节点,**将 0 分配给连接线的左侧,1 分配给连接线的右侧**,最终得到字符的编码就是**从根节点开始,到该节点的路径上的 0 1 序列组合**。 ![](data:image/png;base64,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) 因此各个字母的编码分别为: | **A** | **B** | **C** | **D** | | ----- | ----- | ----- | ----- | | 11 | 100 | 0 | 101 | --- 在没有经过哈夫曼编码之前,字符串“BCAADDDCCACACAC”的二进制为: ```c 100001001000011010000010100000101000100010001000100010001000011010000110100000101000011010000010100001101000001010000111 ``` 也就是占了 120 比特; 编码之后为: ```c 10001111101101101001101101101 ``` 占了 28 比特。 --- **5. 确定发送的数据** 哈夫曼编码将发送字符串的数据长度极大压缩,考虑到接收方的编码,还需要把哈夫曼树的结构也传递过去。 即**字符占用**的 32 比特和 **频率占用**的 15 比特也需要传递过去。 总体上,编码后比特数为32 + 15 + 28 = 75,比 120 比特少了 45 个,效率还是非常高的。 ![image](http://39.99.183.126:8888/file/2/kB0lXLThrIMPcGJ3b-86e.png) --- 从本质上讲,哈夫曼编码是将最宝贵的资源(最短的编码)给出现概率最多的数据。 在上面的例子中,C 出现的频率最高,它的编码为 0,就省下了不少空间。 --- ## 二、特点 **哈夫曼树和编码都不唯一!只有树的WPL(带权路径长度)才是唯一的!** --- 哈夫曼编码有两个特点: 1. **带权路径长度WPL最短且唯一**; 2. **编码互不为前缀**(一个编码不是另一个编码的开头)。 --- 为什么通过哈夫曼编码后得到的二进制码**不会有前缀的问题**呢? 这是因为在哈夫曼树中,每个字母对应的节点都是**叶子节点**,而他们对应的二进制码是由根节点到各自节点的路径所决定的,正因为是叶子节点,每个节点的路径不可能和其他节点有前缀的关系。 为什么通过哈夫曼编码获得的二进制码短呢? 因为哈夫曼树是**带权路径长度最短的树**,权值较大的节点离根节点较近。而带权路径长度是指:树中所有的叶子节点的权值乘上其到根节点的路径长度,这与最终的哈夫曼编码总长度成正比关系的。 ---