离散无失真信源编码定理
定长编码定理
有一个消息队列,每个符号熵 H,序列长 L,之后我们对这个消息编码,码序列有 m 个符号,长度 K
R 定义为信息率
当 L 足够大的时候,必可让译码差错小于任意正数
反之,当
译码差错一定为有限值,当 L 足够大的时候,译码必定出错
编码效率
可以证明,只要:
(上面是方差)那么,译码差错率一定小于任意正数
变长编码定理
对离散无记忆信源,消息长度 L,符号熵为 H(X),对其进行 m 元变长编码,一定存在无失真的信源编码方法:
码字平均长度
码字平均信息率:
判断码字是否能分离
0 01 011 0111 这个看起来能够分离,不过要看后面一个,译码到当前位置的时候是不能做判断的(可分离,有延迟)
0 10 110 1110 这个就能只用看到当前位置就可以译码了(可分离,即时码,异前置码)
异前置码任何一个码字都不是其他码字的头部
m 元长度为 的异前置码存在的充要条件是
这里表示的是每一个码字都放在叶子节点,即满树的情况(克拉夫特不等式)
三种编码方式
所有信源符号按照概率从大到小的顺序排好序
香农编码
香农编码的编号是从 开始,使用累加概率(加到 j-1 而不是 j)
最终的编码过程通过截取二进制的小数后 位来实现
每次截取的时候都不损失的时候效率最高
from math import *
a = [0.2, 0.19, 0.18, 0.17, 0.15, 0.1, 0.01]
a = sorted(a, reverse=True)
print("H:", sum([-i*log2(i) for i in a]))
now = 0
for i in a:
l = ceil(-log2(i))
binary_representation = f"{floor(now * (2**l)):b}"
print(i, binary_representation.zfill(l), l, sep='\t')
now = now + i
费诺编码
按照编码进制数分组,每一组概率尽可能相等,从而划分码元。
一般来说效率比香农高,在每次分组的时候都能分成两个相等的情况效率最高
哈夫曼编码
从两个最小的开始构造哈夫曼树,读取码字的时候,需要从根向叶子节点读取,此时编码为可分离的异前置码
赫夫曼编码并不唯一,合并后的新符号排在靠前的位置可以使重复编码次数变少,短码得到充分利用。
在赫夫曼编码中,当多个符号的概率相等时,合并顺序会影响码长的分布。若合并后的信源符号被优先排列在缩减序列的前面,后续合并步骤中这些符号会被更早处理,从而可能生成更短的码字。这种策略通过减少再次合并的次数,优化了码长分配的紧凑性。