LZ77算法理论

发布时间:2023-07-25 14:58:28

英文介绍文档:https://archive.ph/F4pg7
很短,看一遍10~20分钟应该够了。

1. 算法用到的术语:

  • Input stream

    • 要被压缩的字符序列
  • Character

    • 输入流中的基本数据元素
  • Coding position

    • 输入流中现在正在被编码的那个字符的位置(lookhead buffer的开始位置)。
  • Lookhead buffer

    • 从coding position到输入流末尾的字符序列。
  • Window

    • 大小为W,能够容纳W个字符,从coding position往回数,也就是已经处理的最后W个字符。
  • Pointer

    • 指向window中的匹配(点),同时指定了匹配的length。

2. 压缩原理

算法在window中搜寻和lookhead buffer开始处最长的匹配,然后输出一个指向匹配的pointer。

由于可能一个字符都没匹配到,所以输出不可能值包含pointer。LZ77用这样的方式解决这个问题:在每个pointer后,输出在lookhead buffer中匹配了的后面的第一个字符。如果没有匹配,输出一个null-pointer和coding position处的字符。

3. 编码算法

  1. 把coding position设置到输入流的开始处

  2. 找到window中与lookahead buffer最长的匹配

  3. 输出(P, C)对:

    • P 是pointer,指向window中的匹配
    • C是lookahead buffer中第一个未匹配的字符。
  4. 如果lookahead buffer不为空,将coding position(和window)前向移动L+1个字符,然后返回到步骤2。

4. 一个例子

编码的过程在下面的表(图)中。

  • Step是编码的步数。每次编码算法产生输出算作一步。在LZ77中,发生在编码的第3步。
  • Pos指明 coding position。输入流中的第一个字符的coding position为1.
  • Match是在window中最长的匹配。
  • Char 是lookahead buffer中匹配了的后面第一个字符。
  • Output以(B, L) C的格斯打印输出:
    • (B, L)是指向匹配(Match)的pointer(P)。它给出了解码时的指令:在window中往回B个字符处,拷贝L个字符到输出流。
    • C就是字面上的字符。

在这里插入图片描述

5. 解码

以在编码时同样的方式维护window。每次读一个(P, C)对时,输出window中P所指的匹配序列,然后输出字符C。

6. 实用特点

这个算法的压缩率对很多类型的数据都很好,但是编码可能相当耗时,因为要做太多的lookahead buffer和window之间的比对。另一方面来说,解码非常简单且快速。编码和解码的内存需求很低。内存中保存的唯一的结构是window,它通常在4 ~ 64K的大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

barbyQAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值