浅谈无损压缩算法

时间:2022-10-15 11:29:24

浅谈无损压缩算法

摘要:该文介绍了经典的Huffman编码和目前压缩比最高的PAQ系列压缩算法,包括Huffman编码的原型,改进后的自适应Huffman编码及他们各自的实现方法和优缺点,PAQ系列压缩算法是如何进行上下文建模,预测和编码的。

关键词:无损压缩;Huffman;PAQ

中图分类号:TP311文献标识码:A文章编号:1009-3044(2011)22-5466-02

在信息高速发展的今天,人们进行交流沟通的数据量相当的庞大,如何更好,更快的传输和存储数据已成为一个重大的问题,单纯地提高存储容量,并不能从根本解决问题,而数据的压缩是解决这一问题的重要方法。从无损音乐格式ape到文档的存储,数据的无损压缩已广泛应用于各个领域。

1 无损压缩概述

数据压缩是按照特定的编码机制用比未经编码少的数据位(或者其它信息相关的单位)表示信息的过程。无损压缩是利用数据的统计冗余进行压缩,可完全回复原始数据而不引起任何失真,但压缩率是受到数据统计冗余度的理论限制,一般为20%到50%。这类方法广泛用于文本数据,程序和特殊应用场合的图像数据的压缩。

2 无损压缩算法Huffman和PAQ

2.1 基于Huffman编码的压缩

2.1.1 静态Huffman和动态Huffman编码

Huffman编码使用变长编码表对源符号进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的,出现次数多的符号使用较短的编码,出现次数少的则使用较长的编码,这便使编码之后的符号串的平均长度降低,从而达到无损压缩数据的目的。Huffman编码是通过构建最优二叉树即带权路径长度最小的二叉树,来实现对数据的编码。Huffman编码的过程:

(1)对数据中的源符号的种类和数量进行统计,共有n个源符号,其出现的频率分别为w1,w2...wn;

(2)根据得到的n个权值{w1,w2...wn},构成n个二叉树的集合M={T1,T2...Tn},其中每棵二叉树Ti仅有一个带权为wi的根结点,其左右子树都为空;

(3)在M中选取两棵根结点的权值最小的作为左右子树,构造一个新的二叉树,设置新的二叉树的根结点的权值为左右子树根结点权值之和;

(4)在M中删除选中的两棵子树,同生死将新生成的二叉树加入到M中;

(5)重复(3)和(4),直到M中只含有一棵树HTree为止,HTree即为所求的哈弗曼树;

(6)从根结点出发对HTree进行先序遍历(向左记0,向右记1),从根结点到每个叶子结点的路径即为各个源符号所对应的huffman编码。

这种静态的huffman算法实质是统计源符号,然后对其编码,这样需要对数据进行扫描统计和编码压缩两次操作,压缩速度较慢,实际运用不广泛。为了解决静态Huffman编码的缺点,产生了动态Huffman编码(又称自适应Huffman编码),它只需要对数据进行一次扫描,不需要事先构造Huffman树,而是随着编码的进行逐步构建Huffman树,随着编码的进行同一字符的编码也会随之发生变化。动态Huffman编码流程:

(1)初始化编码树,仅含有一个结点,包含符号NYT(NYT是逸出码,不同于任何一个传送的符号,当有一个尚未在编码树中的符号需要被编码时,输出NYT编码,然后跟着符号的原始表达式),权值为0,符号集合M为空;

(2)扫描符号fi,如果fi ?埸M,将fi加入到M中,用包含新符号和新NYT的子树替换原NYT(替换后NYT居左,新符号结点居右),并输出由逸出码引导的编码。并使原NYT及字符结点的权值赋为1,改变当前结点为原NYT结点。如果fi?奂M,对该符号编码并输出,更新Huffman树。

动态Huffman编码中更新Huffman树的步骤:

(1)输入字符所在结点的权重加1,

(2)检测权重更改后Huffman树是否满足兄弟特性(一棵二叉代码树的每个节点(除根外)都有一个兄弟,而且所有节点能够以权的非递增次序排列并使得每个节点都与它的兄弟相邻,则这棵树就称为具有兄弟特性),满足则进行(4)操作,不满足则(3)操作。

(3)不满足兄弟特性时,该结点与权重小于该结点,但离根结点近的结点(包含其子树)进行交换,如果有多个结点满足,则与最右端结点交换。

(4)满足兄弟特性时,根据调整后的Huffman树 ,按结点指针依次调整各结点的父结点 权重。

2.1.2 Huffman编码的缺陷

Huffman编码没有错误保护功能,一旦一位出错,那么后面的代码也会出错;Huffmam编码是可变长度编码,很难随意查找或调用压缩文件中的内容。

2.2 PAQ压缩算法

2.2.1 PAQ简介

PAQ使用上下文混合算法,上下文混合与PPM(部分匹配预测)有关,下一个符号的预测是从大量的模型在不同上下文上的概率组合估计出来的,不同于PPM,上下文不需要是连续的。所有的PAQ版本都是一次预测和压缩1bit,不同版本的具体模型,如何预测相结合,并后处理是不同的。一旦下一个bit的可能情况被确定,就会根据其概率进行算术编码进行编码。

PAQ1SSE和之后的版本通过二级符号估计(SSE, secondary symbol estimation)来进行预测,合并后的预测和一个小范围的上下文被用于查找表中的一个新的预测,当这个bit被编码后,该表的条目进行调整以降低预测误差。

2.2.2 算术编码

算术编码是用0和1之间的一个数值范围来表示一个字符串,算术编码的伪代码:

Low=0.0;High=1.0;

While not EOF do

Range=High-Low;

read(c);

High=Low+Range*High_range(c);

Low=Low+Low_range(c);

Enddo

Output(Low)

例如对消息序列00 01 10 11 10 11进行编码,假设信源符号为{00,01,10,11},它们的概率分别为{0.2,0.3,0.1,0.4},如表1。

编码过程如表2。

从[0.074944,0.076)中选择一个数(eg:0.074944)作为输出。

2.2.3 自适应模型

一个N阶自适应的基于上下文的模型也维持着一个概率表,表中存放着字母表中所有可能的N+1字母组合的概率。随着更多符号的输入,该表不断更新,使得概率能与压缩中的特定数据相适应。假设使用3阶上下文,单词here出现过几次,单词there未出现过,假定现在出现的是there中的r,而3阶上下文the后r的概率为0,3阶上下文模型的做法自然是可以直接把r不经压缩地写入压缩流。自适应模型的中心思想是利用有效的短上下文知识:如果一个长上下文出现了0概率,就切换到一个较短的上下文。先从N阶上下文开始,搜索已出现过的上下文(x个符号)后跟符号c,如果没有,就切换到N-1阶再试…。例如:当前的3阶上下文串the,已经出现了15次,后跟r(2次)、m(7次)、n(1次)、s(3次)、y(2次)。编码器给它们分配的概率分别为:2/20, 7/20, 1/20, 3/20,2/20。如果下一个输入的符号是m,以概率7/20送给算术编码器,然后将各概率分别更新为: 2/21, 8/21, 1/21, 3/21, 2/21。如果下一个读入的符号是l,上下文the中f的概率为0,如果二阶上下文he中l的概率为5/17,则把概率5/17送给算术编码器。如果符号c从未出现过,就切换到称为-1阶上下文的模型,分配给c一个固定的概率。

2.2.4 上下文建模

每个模型将已知位数的字符串S划分为一系列的上下文,然后将每个模型映射成用8bit状态来表示的位历史。这种状态被映射成可能性,可能性用有256个条目的表来表示。一次预测后,表的条目进行微小(通常是0.4%)的调整来减小预测误差。大多数情况下的模型实现是哈希表,数据量小的情况下的实现是直接查询表。

2.2.5 文本预处理

某些版本的PAQ,尤其是PAsQDa, PAQAR,从PAQ8HP1到PAQ8HP8对文本文件进行预处理是在外部查询字典中查询单词,然后用1-3byte编码来代替它。在PAQ8HP系列中,字典将语义和语法上的相关的单词放在一起,这使得模型只需要使用字典编码中最重要的一小部分来作为上下文。

3 结束语

本文比较详细的介绍了Huffman编码的实现,PAQ压缩算法只是进行了粗略的介绍,PAQ8HP8是目前世界上压缩比最大的算法,但其缺点非常明显,运行速度慢,耗费内存巨大,其广泛应用还要寄希望于算法的进一步优化和计算机性能的改进。

参考文献:

[1] 严蔚敏,陈文博.数据结构及应用算法教程[M].北京:清华大学出版社,2001:145.

[2] [EB/OL]./wiki/PAQ.

[3] Matthew V Mahoney.Adaptive Weighing of Context Models for Lossless Data Compression.

[4] [EB/OL]./wiki/%E6%95%B0%E6%8D%AE%E5%8E%8B%E7%BC%A9.

[5] 林福宗.多媒体技术基础[M].北京:清华大学出版社,2009:29-31.

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文

上一篇:基于移动传感器网络的实时环境监控技术 下一篇:Deep Web查询接口及其识别算法