其中一种:冗余度压缩、熵压缩(无损、有损)
压缩能力:
压缩比:输出:输入
压缩因子:输入:输出
压缩效率
压缩增益
速度
信号质量:
客观量度:信噪比(SNR,db)、均方差(MSE)等
主观量度
主要讨论 离散无记忆信源
不确定性越高(概率低),其信息量越大
打公式太麻烦了,下文均省略,而且缩进也特别麻烦
信息定义的公式:-log(概率倒数)
互信息公式略
A和B相互独立时,互信息显然0
自信息就是本身的信息,A决定B时,二者互信息为自信息
公式:平均自信息
熵非负
确定性事件熵为零
当信源所有输出符号等概率时,熵取最大值,log^n
一个输出n个符号的离散无记忆信源,其信源符号不可能用平均码长小于该信源熵的单义可译码来表示:
H(X) <= L,L为平均码长
通过一个信道所能传输的最高信息速率
时间T内输出与其相应输入的互信息之和之商,bit/s
若信源以速率R发送信息,信道容量为C,若R
数据压缩的极限值,找出一个条件概率使平均互信息最小
唯一可译性
即时可译性
变长码码字即时唯一可译条件:异前缀码
码字长度与概率顺序相反
众所周知:自下而上构建二叉树
霍夫曼编码的平均码长:除叶子节点外的所有节点的概率相加即为平均码长
与香农-范诺编码的比较:
字符的频率是动态变化的,因此编码器和译码器要同步、一致,二者都动态地调整霍夫曼树,每编码(解码)一个字符就要调整树。编码器先编码再改变频率(当前字符频数+1),解码器先解码再改变频率,以此来保证编码和解码所用的霍夫曼树是一致的。
也称为“游程编码”。
定长的行程编码结构为:X,S,RL
其中X为字符;S是一个在数据集合中不用的字符,起一个异字头的作用;RL表示行程长度,也就是X出现的次数。
可见RL>3才有压缩效果。
变长的行程编码需要增加标志位信息来表示编码的起止位置。
以上讨论的三种变长编码对传输误差都存在脆弱性,一步错步步错,且解码器不自知。尤其是行程编码,一旦错一个位都会导致整个行程移位。可参考的解决办法是每几位加一个奇偶校验码等等,用压缩比来换取可靠性。
真是巧妙的算法,我何时能提出一个这样的算法 :)
初始分配一个[0,1)区间,按信源输出字符的概率对其进行划分,使每一个字符都对应一个唯一的区间。编码时,每次把当前字符的区间分配为码字,重复下去,最终得到一个区间就是该字符串的编码。解码时,查看码字区间属于哪个字符,依次迭代直到迭代出与码字相同的区间即为结束。即为:
high(n+1) = low(n+1) + range x high_range(x)
low(n+1) = low(n+1) + range x low_range(x)
其中,range = high(n) - low(n),high、low_range(x)为当前字符x的概率区间上下界。
实际应用时,只保存下界作为码字即可。
**一知半解,此处存疑。**目的是为了简化算术编码过程中的乘法运算,从而提高速度。疑惑的点在于:移位的位数为何是动态的,是怎么决定的?
与自适应霍夫曼编码相似,动态调整每个字符的概率。用一棵平衡二叉树来保存字符的频数来提高效率。
分两个区域,左边的缓冲区为当前的字典,右边的滑动窗口为即将要压缩的字符。原理见下图:
声明:上面这张图是来自另一篇博客:https://blog.csdn.net/qq_23084801/article/details/77496955,我看的这本书没图,纯文字,无力吐槽。
若从右往左搜索缓冲区没有匹配到字符串,则输出(0,0,当前字符),这就是必须要有第三部分的原因。一般在压缩器刚开始工作时,(0,0,)很容易出现。
LZ77也是非对称压缩技术,解压简单,因此多应用于一次压缩多次解压的场合。
压缩原理如下图:
解压时可以动态地恢复字典,如下图例:
声明:以上三图均来自博客:https://www.cnblogs.com/en-heng/p/6283282.html
与LZ77不同,LZ78的字典不删除字典项。LZ78的字典采用树形结构保存,且是多叉树,如8位字符则每个节点最多可以有2^8个子节点。由于不会删除字典项,因此不涉及空间的回收,简化了存储空间的管理及字符串的搜索。但树的大小可能会急剧膨胀,导致空间耗尽。
算是LZ78的改进版。最主要的区别在于它去掉了LZ78的第二个字段,这是因为它将所有的单字符提前预装到字典中了,所以下一个输入字符总是能被找到。剩下的过程显然容易推得,其解码过程与编码一样。
LZW的字典结构显然也是一棵多叉树,此书中介绍说为了减少不必要的子节点指针的空间预分配,LZW的多叉树采用的是数组结构,保存的是母节点指针。母节点采用哈希映射的方法来寻找子节点。我猜Zstd在这里肯定是有优化的。
未完待续…