信源编码的效率
信源编码器的 efficiency 为:
其中 H(A) 是信源的熵,L 是编码后的 average codeword length
将每个元素的概率和其编码后的码长相乘,可以得到 average codeword length,单位为 bits,示例如下
示例
首先,采用等长编码,即所有 symbol 的 code word 长度相同
这个信源的熵为:
0.5 ∗ l o g 2 ( 1 / 0.5 ) + 0.3 ∗ l o g 2 ( 1 / 0.3 ) + 0.15 ∗ l o g 2 ( 1 / 0.15 ) + 0.05 ∗ l o g 2 ( 1 / 0.05 ) = 1.6477 b i t s 0.5*log2(1/0.5)+0.3*log2(1/0.3)+0.15*log2(1/0.15)+0.05*log2(1/0.05)=1.6477\ bits0.5∗log2(1/0.5)+0.3∗log2(1/0.3)+0.15∗log2(1/0.15)+0.05∗log2(1/0.05)=1.6477 bits
average codeword length 为
l e n g t h ( 00 ) ∗ 0.5 + l e n g t h ( 01 ) ∗ 0.3 + l e n g t h ( 10 ) ∗ 0.15 + l e n g t h ( 11 ) ∗ 0.05 length(00)*0.5+length(01)*0.3+length(10)*0.15+length(11)*0.05length(00)∗0.5+length(01)∗0.3+length(10)∗0.15+length(11)∗0.05
等于
2 ∗ 0.5 + 2 ∗ 0.3 + 2 ∗ 0.15 + 2 ∗ 0.05 = 2 b i t s 2*0.5+2*0.3+2*0.15+2*0.05=2\ bits2∗0.5+2∗0.3+2∗0.15+2∗0.05=2 bits
coding efficiency 为
H ( A ) L ˉ = 1.6477 2 \frac{H(A)}{\bar{L}}=\frac{1.6477}{2}LˉH(A)=21.6477
示例2
接着,使用变长编码
此时,熵和示例一相同, average codeword length 变为
1 ∗ 0.5 + 2 ∗ 0.3 + 3 ∗ 0.15 + 3 ∗ 0.05 = 1.7 b i t s 1*0.5+2*0.3+3*0.15+3*0.05=1.7\ bits1∗0.5+2∗0.3+3∗0.15+3∗0.05=1.7 bits
可以看到,变长编码的 efficiency 比等长的要高,因此,我们引申出了 Huffman 编码方式
Huffman 编码
这种编码方式的原理是,给大概率出现的元素尽可能短的编码,以此来改进编码效率
Prefix codes
Huffman code 要求每一个 symbol 对应的 code word 不能是任何其它 code word 的前缀,这种码也被称为 prefix code 或 instantaneous code
因其可以准确的被分为一个个 symbol 而不产生歧义,我们称其为 self-punctuating
进行 Huffman 编码
再次用示例二中的元素举例,假设有四个 symbol a0, a1, a2, a3,它们的概率分别为 0.5,0.3,0.15,0.05
第一步
将所有 symbol 按照他们的概率以递减排序

第二步
将底部的两个元素合并,标出他们合并后的概率
这样四个元素就被缩减为了三个,重复这个过程,直至所有 symbol 都被加在一起

第三步
最后,从右往左找回每一个 symbol,其路线对应的值就是这个 symbol 的 code word
可以看到,从 1.0 往左数,到 a0 只经过了 0
到 a1 经过了 1 0
到 a2 经过了 110
到 a3 经过了 111
最小方差哈夫曼编码
有时会出现 symbol 或合并后的 symbol 概率相同的情况,此时可以有多种编码方式
将 compound symbol 尽量放在序列靠上方的地方,此时得到的 Huffman code 方差最小
扩展哈夫曼编码
扩展编码是将所有 symbol 两两组合,并用他们的联合概率来进行哈夫曼编码
假设有{a, b, c}三个元素,概率分别为{0.1, 0.5, 0.4}
则共有九种组合,可以得到