信源编码的效率
信源编码器的 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\ bits
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 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.05
length(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\ bits
2∗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\ bits
1∗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}
则共有九种组合,可以得到