[IR] Huffman Coding
为了保证: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的更多相关文章
- 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 ...
- [IR] Arithmetic Coding
Statistical methods的除了huffman外的另一种常见压缩方式. Huffman coding的非连续数值特性成为了无法达到香农极限的先天无法弥补的缺陷,但Arithmetic co ...
- 霍夫曼编码(Huffman Coding)
霍夫曼编码(Huffman Coding)是一种编码方法,霍夫曼编码是可变字长编码(VLC)的一种. 霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符 ...
- 哈夫曼编码(Huffman coding)的那些事,(编码技术介绍和程序实现)
前言 哈夫曼编码(Huffman coding)是一种可变长的前缀码.哈夫曼编码使用的算法是David A. Huffman还是在MIT的学生时提出的,并且在1952年发表了名为<A Metho ...
- 【CodeForces】700 D. Huffman Coding on Segment 哈夫曼树+莫队+分块
[题目]D. Huffman Coding on Segment [题意]给定n个数字,m次询问区间[l,r]的数字的哈夫曼编码总长.1<=n,m,ai<=10^5. [算法]哈夫曼树+莫 ...
- <Sicily>Huffman coding
一.题目描述 In computer science and information theory, a Huffman code is an optimal prefix code algorith ...
- 哈夫曼编码的理解(Huffman Coding)
哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,可变字长编码(VLC)的一种.Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最 ...
- Huffman coding & Huffman tree
Huffman coding & Huffman tree Huffman coding 哈夫曼编码 / 最优二元前缀码 Huffman tree 哈夫曼树 / 最优二叉树 https://w ...
- jpeg huffman coding table
亮度DC系数的取值范围及序号: 序号(size) 取值范围 0 0 1 - ...
随机推荐
- ADODB 手册
PHP ADODB1.99版手册 (修正版) PHP ADODB 1.99版手册中文翻译 <修正版> ADODB PHP 在数据库的支持上是很令人称道的,几乎所有的知名数据库系 ...
- Linux及MacOSX中使用zsh
via : http://leochin.com/linux-macosx-shell-zsh/ Linux及MacOSX中使用zsh zsh是另一种Shell,类似bash,tcsh等等,只是多了一 ...
- Linux ./configure --prefix命令
源码的安装一般由3个步骤组成:配置(configure).编译(make).安装(make install),具体的安装方法一般作者都会给出文档,这里主要讨论配置(configure).Configu ...
- java中关于AtomicInteger的使用
在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字.而AtomicInteger则通过一种线程安全的加减操作接口.咳哟参考我之前写的一篇 ...
- C调用lua的table里面的函数
网上搜索C.C++调用lua函数,有一大堆复制粘贴的. 但是搜索<C调用lua的table里面的函数> 怎么就没几个呢? 经过探索,发现其实逻辑是这样的: 1.根据name获取table ...
- Chart:Amcharts
ylbtech-Chart:Amcharts Amcharts ,是一个致力于图表组件开发的公司,公司地址在立陶宛首都维尔纽斯,2004年开始推出图表和地图组件. 1. 简介返回顶部 截至目前,amC ...
- 1.2 Stream API
引例: List<String> strList = Arrays.asList("zhaojigang","nana","tianya& ...
- Android之官方导航栏之Toolbar(Toolbar+DrawerLayout+ViewPager+PagerSlidingTabStrip)
通过前几篇文章,我们对Android的导航栏有了一定的了解认识,本次文章将对Toolbar进行综合应用,主要结合DrawerLayout.ViewPager.PagerSlidingTabStrip一 ...
- 一起来给iOS 11找bug: 苹果还是乔布斯时代的细节控吗?
众所周知,前几天苹果在位于苹果公园的Steve Jobs剧院召开了一年一度的新品发布会,正式揭幕了全屏的iPhoneX, 随后又把iOS 11推送给了测试员(Beta Tester)(正式版将于几周后 ...
- Ubuntu16.04上使用Anaconda3的Python3.6的pip安装UWSGI报错解决办法
具体报错信息: lto1: fatal error: bytecode stream generated with LTO version 6.0 instead of the expected 4. ...