【数据压缩】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. cocos2d-x入门学习--准备篇

    1.Cocos2D最早是一款用Python语言开发的游戏引擎.Cocos2D是一个开源框架,用于构建二维游戏,演示程序和其他图形界面交互应用等. 2.x的包含两个意思:一方面是C++的文件扩展为CXX ...

  2. win7 64位系统彻底卸载mysql

    一.在控制面板中卸载mysql软件,卸载后删除mysql安装目录下的所有文件 二.windows+R运行“regedit”文件,打开注册表 三.删除注册表:HKEY_LOCAL_MACHINE\SYS ...

  3. shutdown vs close

    shutdown 和 close关闭tcp连接的介绍网上有很多,主要区别如下: 1.调用close后,将中止通信.删除套接字.丢弃数据.但是,注意喽,但是,如果有多个进程共享一个套接字,close每被 ...

  4. RxJava2学习笔记(3)

    接上回继续,今天来学习下zip(打包)操作 一.zip操作 @Test public void zipTest() { Observable.zip(Observable.create(emitter ...

  5. 菜鸟nginx源代码剖析数据结构篇(八) 缓冲区链表ngx_chain_t

    菜鸟nginx源代码剖析数据结构篇(八) 缓冲区链表 ngx_chain_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog. ...

  6. 【C#】Visual Studio 2017 一边Debug,一边修改代码

    好久没写C#了,最近在学习著名***工具 shadowsocks-windows 的源代码,想着可以边断点调试,边加上一些注释以方便理解,stackoverflow 和 msdn 随便翻了一下,竟发现 ...

  7. 序列化与反序列化的单例模式实现和readResolve()【转】

    如: public class SingleTest implements Serializable{private static final long serialVersionUID = -860 ...

  8. centos下mysql自动备份(亲测可用)

    编写sh脚本如下: #!/bin/bash db_user="root" db_passwd="123456" db_name="test_db&qu ...

  9. angularjs drag and drop

    angular-dragula Drag and drop so simple it hurts 480 live demo angular-drag-and-drop-lists Angular d ...

  10. 【HTML打印】HTML直接调用window下的打印机并执行打印任务(简单打印任务生成)

    1.<button onclick="preview('data');" id="print">打印</button> 2. 3.js: ...