【数据压缩】LZ77算法原理及实现

【数据压缩】LZ78算法原理及实现

Lempel–Ziv–Welch


年发表的论文《A Universal Algorithm for Sequential Data Compression》中提出。

基于统计的数据压缩编码,比如Huffman编码,需要得到先验知识——信源的字符频率,然后进行压缩。但是在大多数情况下,这种先验知识是很难预先获得。

因此,设计一种更为通用的数据压缩编码显得尤为重要。LZ77数据压缩算法应运而生,其核心思想:利用数据的重复结构信息来进行数据压缩。

LZ77: referring to previously processed data as dictionary 利用内部信息作为字典。

在提出基于滑动窗口的LZ77算法后,两位大神Jacob ZivAbraham Lempel于年在发表的论文中提出了LZ78算法

与LZ77算法不同的是LZ78算法使用动态树状词典维护历史字符串。

LZ78: use an explicit dictionary 字典是外置的。

LZ系列压缩算法均为LZ77LZ78的变种,在此基础上做了优化。

  • LZ77LZSS、LZR、LZB、LZH;
  • LZ78LZW、LZC、LZT、LZMW、LZJ、LZFG。

LZW Encoding:

  Video: https://www.youtube.com/watch?v=nW7OARbr7OI

"TO BE OR NOT TO BE OR TO BE OR NOT"

Idea:

以下是我们已知的字典。

再动态补充新发现的pattern字典,从27开始编号,如下所示:

current next code dictionary  
T O 20 TO 27 TO BE OR NOT TO BE OR TO BE OR NOT
O B 15 OB 28 TO BE OR NOT TO BE OR TO BE OR NOT
B E 2 BE 29 TO BE OR NOT TO BE OR TO BE OR NOT
E O 5 EO 30 TO BE OR NOT TO BE OR TO BE OR NOT
O R 15 OR 31 TO BE OR NOT TO BE OR TO BE OR NOT
R N 18 RV 32 TO BE OR NOT TO BE OR TO BE OR NOT
N O 14  NO  33  TO BE OR NOT TO BE OR TO BE OR NOT
O 15  OT  34  TO BE OR NOT TO BE OR TO BE OR NOT
T T 20 TT  35  TO BE OR NOT TO BE OR TO BE OR NOT
TO B 27 TOB 36  TO BE OR NOT TO BE OR TO BE OR NOT
BE O 29  BEO 37  TO BE OR NOT TO BE OR TO BE OR NOT
OR 31  ORT  38  TO BE OR NOT TO BE OR TO BE OR NOT
TOB 36  TOBE  39  TO BE OR NOT TO BE OR TO BE OR NOT
EO 30  EOR  40  TO BE OR NOT TO BE OR TO BE OR NOT
RN O 32 RNO 41 TO BE OR NOT TO BE OR TO BE OR NOT
OT # 34 N/A N/A TO BE OR NOT TO BE OR TO BE OR NOT
Input   Output      

这里共16行,也就是原来的24字节 --> 16字节。

LZW Decoding:

code prev output dictionary  
20   T     TO BE OR NOT TO BE OR TO BE OR NOT
15 T O TO 27 TO BE OR NOT TO BE OR TO BE OR NOT
2 O B OB 28 TO BE OR NOT TO BE OR TO BE OR NOT
5 B E BE 29 TO BE OR NOT TO BE OR TO BE OR NOT
15 E O EO 30 TO BE OR NOT TO BE OR TO BE OR NOT
18 O R OR 31 TO BE OR NOT TO BE OR TO BE OR NOT
14 R N RN 32 TO BE OR NOT TO BE OR TO BE OR NOT
15 N O NO 33 TO BE OR NOT TO BE OR TO BE OR NOT
20 O T OT 34 TO BE OR NOT TO BE OR TO BE OR NOT
27 T TO TT 35 TO BE OR NOT TO BE OR TO BE OR NOT
29 TO BE TOB 36 TO BE OR NOT TO BE OR TO BE OR NOT
31 BE OR BEO 37 TO BE OR NOT TO BE OR TO BE OR NOT
36 OR TOB ORT 38 TO BE OR NOT TO BE OR TO BE OR NOT
30 TOB EO TOBE 39 TO BE OR NOT TO BE OR TO BE OR NOT 
32 EO RN EOR 40 TO BE OR NOT TO BE OR TO BE OR NOT 
34 RN OT RNO 41 TO BE OR NOT TO BE OR TO BE OR NOT 
 <Output>   <Input>      

可见与encoding时表格一一对应的关系。

就是还原表格的过程。

[IR] Dictionary Coding的更多相关文章

  1. [IR] Huffman Coding

    为了保证:Block中,所有的叶子在所有的中间结点的前面.Static: Huffman coding Dynamic: Adaptive Huffman 一些概念 压缩指标 • Compress a ...

  2. [IR] Arithmetic Coding

    Statistical methods的除了huffman外的另一种常见压缩方式. Huffman coding的非连续数值特性成为了无法达到香农极限的先天无法弥补的缺陷,但Arithmetic co ...

  3. 本人AI知识体系导航 - AI menu

    Relevant Readable Links Name Interesting topic Comment Edwin Chen 非参贝叶斯   徐亦达老板 Dirichlet Process 学习 ...

  4. [Code] 烧脑之算法模型

    把博客的算法过一遍,我的天呐多得很,爱咋咋地! 未来可考虑下博弈算法. 基本的编程陷阱:[c++] 面试题之犄角旮旯 第壹章[有必要添加Python] 基本的算法思想:[Algorithm] 面试题之 ...

  5. HANA Architecture

    1 HANA 是基于内存计算的.行列都支持.使用列存储,列存储的特点是高压缩,查询快,节约空间, ---SAP HANA supports both, but is particularly opti ...

  6. python之最强王者(8)——字典(dictionary)

    1.Python 字典(Dictionary) 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包 ...

  7. Dictionary Learning(字典学习、稀疏表示以及其他)

    第一部分 字典学习以及稀疏表示的概要 字典学习(Dictionary Learning)和稀疏表示(Sparse Representation)在学术界的正式称谓应该是稀疏字典学习(Sparse Di ...

  8. Coding源码学习第一部分(AppDelegate.m)

    前言:在此首先感谢开源,感谢大神们的无私分享. Coding 的主页:https://coding.net/app#app-feature Coding 自己家的仓库:https://coding.n ...

  9. [IR] Compression

    关系:Vocabulary vs. collection size Heaps’ law: M = kTbM is the size of the vocabulary, T is the numbe ...

随机推荐

  1. ios多target开发

    链接: ios开发时,在Xcode中添加多个targets进行版本控制 如何在iOS项目中创建多个target 多个Target的使用 iOS开发中如何创建多个target

  2. 工具类TestTools

    一些方法可能要使用到该工具类,该工具类中的方法包括从链接数据库到数据表中记录的增删改查. package JDBCTest; import java.io.InputStream; import ja ...

  3. 使用 ssmtp 於 shell 透過 Gmail 寄信

    有很多程式於 bash shell 執行, 執行完要自動寄信出去, 但是最近都被 Google 退信, 最好的方法是透過 Gmail 直接寄信. 本來是要另外寫隻 script 來做這種事, 剛剛發現 ...

  4. libnids使用 (转)

    http://blog.csdn.net/kl222/article/details/6248827---原始链接 Libnids是一个用于网络入侵检测开发的专业编程接口,它使用了Libpcap所以它 ...

  5. 学习率设置&&训练模型之loss曲线滑动平均

    tensorflow中学习率.过拟合.滑动平均的学习 tensorflow中常用学习率更新策略 TensorFlow学习--学习率衰减/learning rate decay 分段常数衰减 分段常数衰 ...

  6. centos7操作SSH/SSHD服务(查看/启动/重启/自启)

    查看状态: systemctl status sshd.service 启动服务: systemctl start sshd.service 重启服务: systemctl restart sshd. ...

  7. IOPS计算

    Device Type IOPS 7,200 rpm SATA drives HDD ~75-100 IOPS[2] 10,000 rpm SATA drives HDD ~125-150 IOPS[ ...

  8. 树莓派中编译OpenCV3.4.1和OpenCvSharp

    一.简介 本文重点描述在树莓派中编译OpenCV3.4.1和OpenCvSharp,大家都知道OpenCVSharp是使用C#调用OpenCV最简洁的一个库.但是在Linux上或者树莓派上运行时,需要 ...

  9. STC单片机 IAP(EEPROM)的使用

    STC89C51.52内部都自带有2K字节的EEPROM,54.55和58都自带有16K字节的EEPROM,STC单片机是利用IAP技术实现的EEPROM,内部Flash擦写次数可达100,000 次 ...

  10. centos7.4 开启ftp服务

    1.安装vsftpd yum install -y ftp vsftpd 2.配置/etc/vsftpd/vsftpd.conf 修改项如下: #不允许匿名访问 anonymous_enable=NO ...