为了保证:Block中,所有的叶子在所有的中间结点的前面。Static: Huffman coding

Dynamic: Adaptive Huffman


一些概念

压缩指标

• Compress a 10MB file to 2MB
• Compression ratio = 5 or 5:1
• Space savings = 0.8 or 80%

对称与非对称

• Symmetric compression 对称压缩
  – requires same time for encoding and decoding
  – used for live mode applications (teleconference)
• Asymmetric compression 非对称压缩,压缩慢,解压快
  – performed once when enough time is available
  – decompression performed frequently, must be fast
  – used for retrieval mode applications (e.g., an interactive CD-ROM)

压缩解压的唯一性 - Uniquely decodable

compression的基本条件。

Static or Dynamic codes

Static:

Huffman coding,需知道字符的编码。-->

Dynamic:

Adaptive Huffman。-->

Shannon’s Result


Huffman coding

前提是需知晓 Freq。

L

= ( 30*2 + 30*2 + 20*2 + 10*3 + 10*3 ) / 100
= 220 / 100
= 2.2

问题一

香农理论极限是:

H
= -0.3 * log 0.3 + -0.3 * log 0.3 + -0.2 * log 0.2 + -0.1 * log 0.1 + -0.1 * log 0.1
= -0.3*(-1.737) + -0.3*(-1.737) + -0.2 * (-2.322) + -0.1 * (-3.322) + -0.1 * (-3.322)
= 0.3 log 10/3 + 0.3 log 10/3 + 0.2 log 5 + 0.1 log 10 + 0.1 log 10
= 0.3*1.737 + 0.3*1.737 + 0.2* 2.322 + 0.1*3.322 + 0.1*3.322
= 2.17 < 2.2   // 说明未达到极限,还有压缩的余地

问题二

Freq不平均的话,压缩率越差。

L = (100000*1 + ...)/100010
≈ 1

H = 0.9999 log 1.0001 + 0.00006 log 16668.333
+ ... + 1/100010 log 100010
≈ 0.00


Adaptive Huffman

Problems of Static coding
• Need statistics & static: e.g., single pass over the data just to collect stat & stat unchanged during encoding
• To decode, the stat table need to be transmitted. Table size can be significant for small msg.
 => Adaptive compression e.g., adaptive huffman

两个阶段:

• FGK Algorithm
• Vitter's Invariant

FGK Algorithm.

Video: https://www.youtube.com/watch?v=N5pw_Z-oP-4

Rule: 

In the same block,中间结点的index总是大于叶子结点的index。<-- Vitter's Invariant

权重值大的结点,其index也较大。

Operation:

操作1:Leaf node: move first, then update

操作2:Internal node: update first, then move.

NYT node = null node.

Stream: abcbaaa

a = 0110 0001

b = 0110 0010

c = 0110 0011

Step 1

[0110 0001]

表示插入的位置是左枝

Step 2

插入b之后的样子如下。

Next,需要执行“操作2”。

原来的NYT变为1(孩子value之和),补充完编号。(update)

考虑move操作,画出block,所有标号为1的nodes。

为了保证:Block中,所有的叶子在所有的中间结点的前面。

但,目前满足这个要求么?显然不是,如下的1,a 比较碍眼。

252 253 254 255 256
NYT b a 1

那么,如何move?将上图中的254结点连带子树 与 跟它冲突的255交换。

可见,这样就重新满足了the Rule.

0110 0001]

Step 3

然后继续 insert c,当然还是在NYT这个位置。

插入效果如下:

Next,还是先 update internal node。

为了保证:Block中,所有的叶子在所有的中间结点的前面。

但,目前满足这个要求么?显然不是,如下的1,b,a 比较碍眼。

251 252 253 254 255
c b a 1

开始move:253,254左移,给252的1腾出地儿。

可见,这样就重新满足了the Rule.

0110 0001] 0110 0011]

Step 4

4th是b,已有b,所以挂在已有的node b下面。

0110 0001]

这次,先 update leaf node,也包括node b的个数++。

这里满足了the Rule的第一条,即叶子结点index较小。

但,the Rule的第二条未满足,即权重大的index较大。

c(1) b(2) a(1) (1)

所以,将b移动到最后位置254,如下。

可见,这样就重新满足了the Rule.

0110 0001] ]

Step 5

5th是a,已有a,所以挂在已有的node a下面。

0110 0001] ] 10

这里满足了the Rule的第一条,即叶子结点index较小。

但,the Rule的第二条未满足,即权重大的index较大。

252 252 253
c(1) a(2) (1)

交换252与 253及其子树后,如下:

可见,这样就重新满足了the Rule.

0110 0001] 0110 0011]] ]

Step 6

6th是a,已有a,所以挂在已有的node a下面。

0110 0001] 0110 0011] ] ]

此时,253的a的权重变为3,根据the Rule,权重大的index较大。

所以,253:a 应该在254:b的后面。交换后,如下:

0110 0001] 0110 0011] ] ] ]

Step 7 

7th是a,已有a,所以挂在已有的node a下面。

0110 0001] 0110 0011] ] ]

此时,254的a的权重变为4,根据the Rule,权重大的index较大。

所以,254:a 应该在255的后面。交换后如下:

0110 0001] 0110 0011] ] ] ]

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

  1. hdu 1053 (huffman coding, greedy algorithm, std::partition, std::priority_queue ) 分类: hdoj 2015-06-18 19:11 22人阅读 评论(0) 收藏

    huffman coding, greedy algorithm. std::priority_queue, std::partition, when i use the three commente ...

  2. [IR] Arithmetic Coding

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

  3. 霍夫曼编码(Huffman Coding)

    霍夫曼编码(Huffman Coding)是一种编码方法,霍夫曼编码是可变字长编码(VLC)的一种. 霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符 ...

  4. 哈夫曼编码(Huffman coding)的那些事,(编码技术介绍和程序实现)

    前言 哈夫曼编码(Huffman coding)是一种可变长的前缀码.哈夫曼编码使用的算法是David A. Huffman还是在MIT的学生时提出的,并且在1952年发表了名为<A Metho ...

  5. 【CodeForces】700 D. Huffman Coding on Segment 哈夫曼树+莫队+分块

    [题目]D. Huffman Coding on Segment [题意]给定n个数字,m次询问区间[l,r]的数字的哈夫曼编码总长.1<=n,m,ai<=10^5. [算法]哈夫曼树+莫 ...

  6. <Sicily>Huffman coding

    一.题目描述 In computer science and information theory, a Huffman code is an optimal prefix code algorith ...

  7. 哈夫曼编码的理解(Huffman Coding)

    哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,可变字长编码(VLC)的一种.Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最 ...

  8. Huffman coding & Huffman tree

    Huffman coding & Huffman tree Huffman coding 哈夫曼编码 / 最优二元前缀码 Huffman tree 哈夫曼树 / 最优二叉树 https://w ...

  9. jpeg huffman coding table

    亮度DC系数的取值范围及序号:                                                               序号(size) 取值范围 0 0  1 - ...

随机推荐

  1. [转]delphi 有授权许可的字符串拷贝函数源码

    一段看上去“貌不惊人”的Delphi插入汇编代码,却需要授权许可,但是与经典的同类型函数比较,确实“身手不凡”. 研究代码的目的在于借鉴,本文通过分析,并用C++重写代码进行比较,再次证明这段代码效率 ...

  2. boolean和Boolean, char和Character , byte和Byte, short和Short, int和Integer , long和Long , float和Float, double和Double的区别 , String和StringBuffer的区别

    Java提供两种不同的类型:引用类型和原始类型(内置类型).Int是java的原始数据类型,Integer是java为int提供的封装类. Java为每个原始数据类型提供了封装类. 其中原始数据类型封 ...

  3. ES6 js中const,var,let区别 今天第一次遇到const定义的变量

    今天第一次遇到const定义的变量,查阅了相关资料整理了这篇文章.主要内容是:js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始化. 1 ...

  4. Spark机器学习(7):KMenas算法

    KMenas算法比较简单,不详细介绍了,直接上代码. import org.apache.log4j.{Level, Logger} import org.apache.spark.{SparkCon ...

  5. [BetterExplained]为什么你应该(从现在开始就)写博客

    (一)为什么你应该(从现在开始就)写博客 用一句话来说就是,写一个博客有很多好处,却没有任何明显的坏处.(阿灵顿的情况属于例外,而非常态,就像不能拿抽烟活到一百岁的英国老太太的个例来反驳抽烟对健康的极 ...

  6. 001_ASP.NET MVC 实用教程 论坛项目 北盟网校 原创视频教程

    下载地址 http://pan.baidu.com/s/1kUJalbp 在线观看地址 http://www.bamn.cn/course/lesson/1 ASP.NET MVC 使用课程,是201 ...

  7. sqlserver修改主键为自增

    使用PowerDesigner创建一张表, 拷贝建表语句发现ID不是自增的, 以下是修改语句: ALTER TABLE USER_JOB_EXE_REC DROP COLUMN id; , ); 注: ...

  8. 基于CentOS体验万象优图鉴黄服务

    系统要求:CentOS 7.2 64 位操作系统 初始化配置 使用万象优图图片鉴黄 API 接口,我们需要先完成以下步骤: 获取腾讯云账号 APP ID 配置云 API 公钥/密钥 配置优图 buck ...

  9. cmd命令中截取日期字符

    %date:~0,10% 表示年份    

  10. Communications link failure due to underlying exception异常处理(转)

    最近的一个项目在Hibernate使用C3P0的连接池,数据库为Mysql.开发测试没有问题,在运行中每个一段长的空闲时间就出现异常: java 代码 org.hibernate.exception. ...