LZ系类经典压缩算法介绍

LZ系类压缩算法介绍

主要介绍1)简单字典编码,2)LZ77字典编码,3)LZ78字典编码。

1、简单字典编码

这是一种简单的方法,但是需要遍历两次待压缩的数据。

1.1、实现具体步骤

  • 1 读取待编码数据,记录出现过的Byte出现次数
  • 2 按照概率从高到低,排序记录的数据;
  • 3 排序后的记录就构成了一个字典,在每个记录前加上序号长度,000代表长度为1,111代表长度为8.比如第二条记录,序号为0000 0101,实际长度为3,在1前面加上010。写入压缩的符号是010101,总共6个bit。
  • 4 第二次遍历待压缩的数据,搜索字典将序号长度+序号写入压缩文件。

1.2、优缺点

  • 优点:简单,解压所读快。
  • 缺点:压缩速度慢,需要遍历两次,最大只能有256个元素,压缩率可能不高。
  • 适合:文本压缩,以Byte为单位。

2、LZ77

2.1、LZ77算法介绍

LZ77算法是由Lempel和Ziv在1977年的论文中提出来的,该算法将输入流中之前的字符作为字典。编码器维护一个滑动窗口,输入字符流从右往左滑动。滑动窗口由两部分组成,如下图所示,左边的是已编码区域(当前字典),右边是待编码区域。已编码区域长度通常是1000+,待编码区域通常是数十个字节。匹配的数据使用三元组来表示(距离,匹配长度,待编码区下一个符号)滑动窗口示意图

2.1、编码器工作步骤

  • 1 编码器从右往左搜索待搜索区域,寻找和已编码区域第一个符号e相同的符号,找到了easily中的e
  • 2 从第一个匹配字符e向后(右)尽可能寻找连续的匹配字符,得到匹配字符串eas,匹配长度为3。
  • 3 编码器继续往左搜索,重复步骤1、2.
  • 4 使用匹配长度最长的三元组来表示,如果没有匹配的数据使用(0, 0, 未匹配的字符)表示。

2.1.1 Example

LZ77工作步骤示意图

2.2、优缺点

  • 优点:解压速度快。
  • 缺点:压缩速度慢。
  • 适用场景:适合于一次压缩,多次解压的文件。

3、LZ78

LZ78算法是Lempel和Ziv在1978年提出的,LZ78和LZ77两种算法在构建字典的思路上完全不同。LZ78没有使用滑动窗口,通过对已经编码的数据进行统计,实时更新维护字典。编码器输出二元组(字典指针,未编码的符号),工作编码过程如下图所示。

LZ78工作过程示意图

3.1、编码器工作步骤

  • 1 开始编码,字典是空的,只有一个元素:编号:0;内容:null
  • 2 输入新元素,查找字典中相匹配的字符。以上图为例,1)没有匹配的字符,如输入第二个元素i,使用(0,“i”)表示,将符号i添加到字典。2)存在匹配的字符,如第5个元素,输入元素si,符号s元素前面已经出现过,再输入i,没有匹配的数据,编码器输出(1, "i"),将"si"加入字典。
  • 3 重复步骤2,直到输入全部完成。

3.2、优缺点

  • 优点:解压速度快,无需传输字典,解码过程构建字典。
  • 缺点:编码相对比LZ77复杂。
  • 适用场景:适用于文本压缩,为单词建立词典。

猜你喜欢

转载自www.cnblogs.com/lab601/p/10100788.html
今日推荐