Chapter 6 : 不等长编码¶
约 710 个字 18 张图片 预计阅读时间 4 分钟
为什么需要不等长编码?
举一个例子:
假设一个无记忆信源 \(\{a_1,a_2,a_3\}\),概率密度为\(\{0.5,0.25,0.25\}\),\(H(U)=1.5\text{ bit}\)
- 如果用等长编码, 则 L 很大时才能达到最佳编码的效率
- 如果用不等长编码,将 \(\{a_1,a_2,a_3\}\) 分别编码成 \(\{1,00,01\}\),译码器在收到 1 时,译码成 \(a_1\),收到 00 时译码成 \(a_2\),01 时译码成 \(a_3\),比如:
- \(10001100001101\stackrel{译}{\Rightarrow}1,00,01,1,00,00,1,1,01=a_1a_2a_3a_1a_2a_2a_1a_1a_3\),平均码字长度为 \(\overline{n}=\sum\limits_{k=1}^Kp_kn_k=1.5\text{ bit}\)
DMS 的不等长编码¶
一个好的不等长编码应该满足以下条件:
- 唯一可译性
- 即时可译性
唯一可译性¶
- 非奇异性:\(x_i\neq x_j\Rightarrow C(x_i)\neq C(x_j)\)
- 码扩展:\(C^*(x_1x_2\cdots x_n)=C(x_1)C(x_2)\cdots C(x_n)\)
如果码的任意扩展都是非奇异的, 则称码是唯一可译的
Example
上面的码 A 和码 B 都不是唯一可译的,因为对于 A 来说如果收到 10,可以是 \(a_4\),也可以是 \(a_3a_2\),也可以是 \(a_3a_1\);对于 B 来说如果收到 11,可以是 \(a_4\) 也可以是 \(a_2a_2\)
码 C 和码 D 是唯一可译的
Sardinas & Petterson 判据¶
判据:一个码是唯一可译码的充分必要条件是除 \(S_0\) 外没有任何一个后缀分解集中包含码字
- 如果 \(S_1=\phi\) 则该码是即时可译并且唯一可译的
- 如果 \(S_n=\phi,n\geq 1\),则该码是唯一可译,且译码延时有限
Example
可以看到,上面的这个码的后缀分解集中包含码字,因此不是唯一可译的
异字头码¶
如果一个码中没有任何一个码字是其它码字的前缀, 则称该码是异字头码, 即 \(S_1=\phi\)
异字头码的树形表示:所有码字只出现在叶结点上
Kraft 不等式¶
存在长度为 \(n_1,n_2,\cdots,n_K\) 的 D 元异字头码的充要条件为:\(\sum\limits_{k=1}^KD^{-n_k}\leq 1\)
Proof
设 \(n_1<n_2<\cdots<n_k\),可将异字头码的所有码字放置在码树的叶节点上,每放置一个长为 \(n_k\) 的码字,相当于砍掉其下生长的子树的共 \(D^{n_K−n_k}\) 个叶节点。为了保证放置过程可行,必须:
可将所有码字依次放置在码树的叶节点上, 方法如下:
对长为 \(n_k\) 的码字在第 \(n_k\) 层任选一个可用的叶节点,砍掉其下生长的子树,相当于砍掉第 \(n_K\) 叶节点的 \(\frac{1}{D_{n_k}}\),如果 \(\sum\limits_{n_k=1}^{n_K}D^{−n_k}\leq 1\),则上述放置过程一直可以进行下去,即可以构成一个异字头码
- 任意唯一可译码必然满足 Kraft 不等式,即唯一可译码 \(\Rightarrow\) Kraft 不等式成立 \(\Rightarrow\) 存在一个同样长度的异字头码
Proof
由唯一可译性我们有 \(A_i\leq D^i\),那么:
不等长编码定理¶
任何一个唯一可译码的平均码字长度必须满足 \(\overline{n}\geq\frac{H(U)}{\log D}\),同时一定存在一个 D 元唯一可译码, 其平均长度满足 \(\overline{n}\leq\frac{H(U)}{\log D}+1\)
Proof
(1)
当且仅当 \(D^{-n_k}=p_k\) 时,等式成立
(2)选择唯一的 \(n_k\),使得 \(D^{-n_k}\leq p_k\leq D^{-(n_k-1)}\)
对左边不等式两侧求和,得 \(\sum\limits_{k=1}^K D^{-n_k}\leq\sum\limits_{k=1}^K p_k=1\)
因此,存在长度为 \(n_k\) 的异字头码
对右侧不等式取对数,并求期望值,得:
不等长编码定理也有扩展,对于长为 \(L\) 的平稳信源 \(U^L\),有:
编码速率:\(R\stackrel{\Delta}{=}\overline{n}\log D\),则 \(R\stackrel{L\rightarrow\infty}{\rightarrow}H(U)\)
编码效率:\(\eta=\frac{H(U)}{R}\)
Huffman 编码(最佳不等长编码)¶
最佳不等长编码:给定信源分布,在平均码长最短的意义上最佳
二元最佳码:给定信源分布,其最佳二元编码必然满足:
- 其出现概率越小的消息所对应的码长越长
- 出现概率最小的两个消息所对应的码长相等,且码字最后一位不同
Huffman 编码有如下性质:
- \(p_1\geq p_2\geq\cdots\geq p_K\Rightarrow n_1\leq n_2\leq\cdots\leq n_K\)
- \(n_{K-1}=n_K\)
- 对 \(a_{K-1}\) 和 \(a_K\),有 \(b_{K-1,n_K}\neq b_{K,n_K}\)
辅助源¶
可递归编码原理¶
对辅助源 \(U'\) 的最佳编码也是对原始源的最佳编码
Proof
若 \(C_1', C_2',\cdots C_{K−1}'\) 是辅助源的最佳编码,相应码长分别为 \(n_1', n_2',\cdots,n_{K−1}'\)。对应地,\(U\) 的码字 \(C_1,C_2,\cdots,C_K\) 的长度分别为:
所以:
所以由 \(\overline{n}'\) 最小也可得出 \(\overline{n}\) 也是最小的
D 元 Huffman 编码¶
- 若 \(K=(D-1)i+1\),则每次均有 \(D\) 个消息要合并,短标号得到充分利用
- 若 \(K=(D-1)i+M\),则必须增补 \(D − M\) 个概率为零的虚拟消息,使得最后一次合并仍有 \(D\) 个消息要合并,从而充分利用短标号
Shannon 编码¶
Shannon 编码定义 \(a_k\) 的编码长度为:\(l_k=\lceil\log\frac{1}{p_k}\rceil, 2^{-l_k}\leq p_k\leq 2^{-l_k+1}\)
Shannon 编码方法:
Examples
是一个前缀码,等同于最佳编码(Huffman 编码)
- 是一个前缀码,但不等同于最佳编码(Huffman 编码)
根据上面的例子我们可以得到 Shannon 编码是一个前缀码,但不一定等同于最佳编码(Huffman 编码)
Shannon 编码是前缀码
引理:如果把长度为 \(l\) 的二进制码字 \(z=z_1z_2\cdots z_l\) 与一个区间 \((0.z_1z_2\cdots z_l,0.z_1z_2\cdots z_l+\frac{1}{2^L}]\) 对应,则一个码是前缀码就等价于这些码字所对应的区间彼此不相交
Proof
如果 \(\pmb{z}^{(1)}\) 是 \(\pmb{z}^{(2)}\) 的前缀,且 \(\pmb{z}^{(2)}=z_1z_2\cdots z_l\),则 \(\pmb{z}^{(1)}=z_1z_2\cdots z_k,k<l\),\(\pmb{z}^{(1)}\) 对应的区间包含 \(\pmb{z}^{(2)}\),同样,如果两个区间相交,则必然一个码是另一个码的前缀
对于 Shannon 编码来说:
每一个码对应的区间不相交,则 Shannon 编码是前缀码
编码效率¶
- 与 Huffman 码相比,Shannon 码渐进收敛性能较差
Example
如果我们有 \(p_1=0.9999,p_2=0.0001\)
则 \(l_1=1\text{ bit},l_2=14\text{ bit}\)
- Shannon 码逼近 Shannon 信源编码定理
Example
如果有两个符号 \(p_1,p_2\),序列 \(\pmb{u}^{(k)}\) 含有 \(k\) 个 1,\(n-k\) 个 0,则序列出现的概率为 \(p(\pmb{u}^k)=p^k(1-p)^{n-k}\)
编码长度为 \(l_k=\lceil\log\frac{1}{p(\pmb{u}^k)}\rceil\leq k\log\frac{1}{p}+(n-k)\log\frac{1}{1-p}+1\)
平均码长为:
其中第二个等号的原理是:
Fano 编码¶
编码效率¶
Shannon-Fano-Elias 编码¶
- 特点:不需要对概率进行排序
编码效率¶
平稳信源的编码¶
离散有记忆信源:令 \(\epsilon\) 为任意小正数,对平稳有记忆信源 \(\{u^L,p(u^L)\}\) 进行 \(D\) 元不等长编码, 则总可以找到一个 \(L(\epsilon)\),当 \(L>L(\epsilon)\) 时,平均编码码长 \(\overline{n}\) 满足:
编码方法:Shannon 码
马尔科夫信源编码¶
编码思路:
- 用 \(\lceil\log|S|\rceil\) 个比特对初始状态 \(S\) 进行编码
- 对状态的输出长度为 \(L\) 的消息序列进行不等长编码,当 \(L\) 足够大时,平均码长 \(\overline{n}\) 满足:
Example