nginx中的哈夫曼编码算法-编码
nginx中的哈夫曼编码算法-解码[上]
nginx中的哈夫曼编码算法-解码[中]
nginx中的哈夫曼编码算法-解码[下]
1. 引言
在[《nginx中的哈夫曼编码算法》](https://blog.csdn.net/bluestn/article/details/138095355)中,我们介绍了nginx采用查表的方法来实现的哈夫曼编码对http2 hpack进行压缩的功能,其编码的实现原理还是比较简单的。然而,上山容易下山难,nginx中实现的快速哈夫曼解码算法在理解上相对于编码算法有一些难度的。今天我们来聊一聊nginx是如何来实现快速哈夫曼解码的。
为什么要增加快速
这个形容词呢?因为在学习哈夫曼原理的时候,书本上介绍的是采用构建哈夫曼树的方式,通过一边读取输入流中的比特,一边在哈夫曼树中不断游走的方式来实现的解码方式,虽然这种方式比较容易理解,但是其解码效率是不那么理想的。而nginx采用构建状态转移矩阵,在解码时不是每次读取一个比特,而是每次一次性读取输入流中的4个比特,通过跟随状态转移矩阵不断更新状态,来实现快速解码,解码效率得到大幅提升。
而且nginx在状态转移矩阵也进行了优化,能够在解码的过程中,对于多读取的比特不进行回退就能够正确解码,相比于需要回退的算法能够在性能上表现更加优秀。
本文分三部分进行讲解,首先介绍nginx实现的哈夫曼解码算法中的状态转移矩阵的构造及利用状态转移矩阵如何进行解码的原理;接着我们结合nginx的源码来详细分析nginx的解码源码的实现原理;最后,介绍快速哈夫曼解码算法的最核心的内容,就是如何来构造状态转移矩阵。
在深入阅读本文之前,大家也可以参考我之前发表的《采用状态转移矩阵方式的快速哈夫曼解码算法》,预先了解用状态转移表进行哈夫曼解码的原理。
2. 哈夫曼解码状态转移矩阵
在nginx的哈夫曼解码的相关代码里面,首先它定义了一个状态转移矩阵,如下: