[IR] BWT+MTF+AC
BWT (Burrows–Wheeler_transform)数据转换算法
MTF(Move-to-front transform)数据转换
良心PPT: bwt_based_compression_verbin.ppt
BWT Idea:
压缩技术主要的工作方式就是找到重复的模式,进行紧密的编码。
BWT(Burrows–Wheeler_transform)将原来的文本转换为一个相似的文本,转换后使得相同的字符位置连续或者相邻;
之后可以使用其他技术如:Move-to-front transform 和 游程编码(RLE) 进行文本压缩。
一般压缩可以将文本先使用Burrows–Wheeler transform生成局部相关性很好的序列,再使用MTF减少信息熵,最后再进行压缩。
Burrows–Wheeler transform + Run-length coding
Ori:rabcabcababaabacabcabcabcababaa$
BWT:aabbbbccacccrcbaaaaaaaaaabbbbba$
RLE:aab4ccac3rcba10b5a$
Encoding:
1. All rotations
- #BANANAS
- S#BANANA
- AS#BANAN
- NAS#BANA
- ANAS#BAN
- NANAS#BA
- ANANAS#B
- BANANAS#
2. Sort the rows and pick up the last col.
- #BANANAS
- ANANAS#B
- ANAS#BAN
- AS#BANAN
- BANANAS#
- NANAS#BA
- NAS#BANA
- S#BANANA
正好是个行列一致的Matrix。
ori=[#BANANAS]T
bwt=[SBNN#AAA]T
Decoding:
while( 循环len(bwt)次 ) {
"前插一列,字典排序"
}
Result:
- #BANANAS
- ANANAS#B
- ANAS#BAN
- AS#BANAN
- BANANAS#
- NANAS#BA
- NAS#BANA
- S#BANANA
MTF Idea:
可见,BWT转换将文本转换为局部相关性很好的序列。
而刚好MTF转换就是利用了空间局部性原理减少信息熵。
即:最近访问的字符总是出现在“recently used symbols”的前面位置,如果字符的空间局部性较好,编码之后就会出现很多小的数字,如”0“或”1“。
所以,在如下List列中,使用的字符即可提前到head pos处,如此一来,index标号比较小,省空间。
这样,就方便了下一步压缩策略。
The main idea is that each symbol in the data is replaced by its index in the stack of “recently used symbols”.
For example, long sequences of identical symbols are replaced by as many zeroes, whereas when a symbol that has not been used in a long time appears, it is replaced with a large number.
Thus at the end the data is transformed into a sequence of integers; if the data exhibits a lot of local correlations, then these integers tend to be small.
Encoding:
先建立字符集大小的List,“recently used symbols”,这里只考虑26个小写字母a~z。
From: https://en.wikipedia.org/wiki/Move-to-front_transform
Input Stream | Sequence | List | Operation |
---|---|---|---|
bananaaa | 1 | (abcdefghijklmnopqrstuvwxyz) | b放到head位置 |
bananaaa | 1,1 | (bacdefghijklmnopqrstuvwxyz) | a放到head位置 |
bananaaa | 1,1,13 | (abcdefghijklmnopqrstuvwxyz) | n放到head位置 |
bananaaa | 1,1,13,1 | (nabcdefghijklmopqrstuvwxyz) | a放到head位置 |
bananaaa | 1,1,13,1,1 | (anbcdefghijklmopqrstuvwxyz) | n放到head位置 |
bananaaa | 1,1,13,1,1,1 | (nabcdefghijklmopqrstuvwxyz) | a放到head位置 |
bananaaa | 1,1,13,1,1,1,0 | (anbcdefghijklmopqrstuvwxyz) | a放到head位置 |
bananaaa | 1,1,13,1,1,1,0,0 | (anbcdefghijklmopqrstuvwxyz) | a放到head位置 |
Final |
1,1,13,1,1,1,0,0 |
(anbcdefghijklmopqrstuvwxyz) |
|
ori=[b a n a n a a a]T
mtf=[1 1 13 1 1 1 0 0]T
Decoding:
Input Stream | Sequence | List |
---|---|---|
1,1,13,1,1,1,0,0 | b | (abcdefghijklmnopqrstuvwxyz) |
1,,13,1,1,1,0,0 | ba | (bacdefghijklmnopqrstuvwxyz) |
1,1,,1,1,1,0,0 | ban | (abcdefghijklmnopqrstuvwxyz) |
1,1,13,,1,1,0,0 | bana | (nabcdefghijklmopqrstuvwxyz) |
1,1,13,1,,1,0,0 | banan | (anbcdefghijklmopqrstuvwxyz) |
1,1,13,1,1,,0,0 | banana | (nabcdefghijklmopqrstuvwxyz) |
1,1,13,1,1,1,,0 | bananaa | (anbcdefghijklmopqrstuvwxyz) |
1,1,13,1,1,1,0, | bananaaa | (anbcdefghijklmopqrstuvwxyz) |
可见,这里的思想就在于,利用了变化过程中的顺序性!
这样一来,string变为了数字。如果之前的string是对应一堆大的数字的话,那么,这次变为了一堆小数字,且0,1较多,Entropy小了!
Burrows–Wheeler transform + Move-To-Front
Ori:rabcabcababaabacabcabcabcababaa$
BWT:aabbbbccacccrcbaaaaaaaaaabbbbba$
MTF:0,0,1,0,0,0,2,0,2,1,0,0,0,17,1,2,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,$
ARI:<(6+1)bytes>
问:MTF是否确实提高了压缩率呢?一堆小数字对压缩来说总会是好事。减小了信息熵,便自然想到了huffman或者arithmetic coding。
过程如下:
Input Stream | Sequence | List |
---|---|---|
aabbbbccacccrcbaaaaaaaaaabbbbba$ | 0 | (abcdefghijklmnopqrstuvwxyz) |
aabbbbccacccrcbaaaaaaaaaabbbbba$ | 0,0 | (abcdefghijklmnopqrstuvwxyz) |
aabbbbccacccrcbaaaaaaaaaabbbbba$ | 0,0,1 | (abcdefghijklmnopqrstuvwxyz) |
aabbbbccacccrcbaaaaaaaaaabbbbba$ | 0,0,1,,, | (bacdefghijklmnopqrstuvwxyz) |
aabbbbccacccrcbaaaaaaaaaabbbbba$ | 0,0,1,0,0,0,2 | (bacdefghijklmnopqrstuvwxyz) |
aabbbbccacccrcbaaaaaaaaaabbbbba$ | 0,0,1,0,0,0,2,0 | (cbadefghijklmnopqrstuvwxyz) |
aabbbbccacccrcbaaaaaaaaaabbbbba$ | 0,0,1,0,0,0,2,0,2 | (cbadefghijklmnopqrstuvwxyz) |
aabbbbccacccrcbaaaaaaaaaabbbbba$ | 0,0,1,0,0,0,2,0,2,1 | (acbdefghijklmnopqrstuvwxyz) |
aabbbbccacccrcbaaaaaaaaaabbbbba$ | 0,0,1,0,0,0,2,0,2,1,,, | (cabdefghijklmnopqrstuvwxyz) |
aabbbbccacccrcbaaaaaaaaaabbbbba$ | 0,0,1,0,0,0,2,0,2,1,0,0,0,17 | (cbadefghijklmnopqrstuvwxyz) |
aabbbbccacccrcbaaaaaaaaaabbbbba$ | 0,0,1,0,0,0,2,0,2,1,0,0,0,17,1 | (rcbadefghijklmnopqstuvwxyz) |
aabbbbccacccrcbaaaaaaaaaabbbbba$ | 0,0,1,0,0,0,2,0,2,1,0,0,0,17,1,2 | (rcbadefghijklmnopqstuvwxyz) |
aabbbbccacccrcbaaaaaaaaaabbbbba$ | 0,0,1,0,0,0,2,0,2,1,0,0,0,17,1,2,3 | (brcadefghijklmnopqstuvwxyz) |
aabbbbccacccrcbaaaaaaaaaabbbbba$ | 0,0,1,0,0,0,2,0,2,1,0,0,0,17,1,2,3,,,,,,,,, | (abrcdefghijklmnopqstuvwxyz) |
aabbbbccacccrcbaaaaaaaaaabbbbba$ | 0,0,1,0,0,0,2,0,2,1,0,0,0,17,1,2,3,0,0,0,0,0,0,0,0,0,1 | (abrcdefghijklmnopqstuvwxyz) |
aabbbbccacccrcbaaaaaaaaaabbbbba$ | 0,0,1,0,0,0,2,0,2,1,0,0,0,17,1,2,3,0,0,0,0,0,0,0,0,0,1,,,, | (barcdefghijklmnopqstuvwxyz) |
aabbbbccacccrcbaaaaaaaaaabbbbba$ | 0,0,1,0,0,0,2,0,2,1,0,0,0,17,1,2,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1 | (barcdefghijklmnopqstuvwxyz) |
Final |
0,0,1,0,0,0,2,0,2,1,0,0,0,17,1,2,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1 |
继续采用Arithmetic coding处理:
32 in total(暂未考虑$)
0: /32
1: 5/
2: 3/
3: 1/
17: 1/
使用了8 Bytes。
计算Entropy:
计算式:(-22/32)*log2(22/32)+(-5/32)*log2(5/32)+(-3/32)*log2(3/32)+(-1/32)*log2(1/32)+(-1/32)*log2(1/32)
aaarticlea/png;base64,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" alt="" name="图像1" width="775" height="41" align="left" border="0" />
对比:
大约每个字符平均采用1.43bits来进行编码,也就是:
1.43*32=45.76 约为46bits,即6Bytes
加上结尾符:6+1($) = 7Bytes
Finally, 15 Bytes 搞定!
RLE:aab4ccac3rcba10b5a$
共18 Bytes!
总结:
有很多种组合方式,以上只是探讨了BWT+MTF+Arithmetic Coding的效果。
BWT+Run-Length --> Run-length FM-Index
参考: [IR] Advanced XML Compression - XBW
都利用了同样的压缩思想(Run-length encoding)。这里,通过B、S列替代了Last列。B列更有利于压缩。
注意:这里是'1'为首,'0'为尾。
通过B'、S列替代了Front列。B'列更有利于压缩。但S需要在使用前排序,也就是S-->C列。
注意:S、C列中每个elem代表的是block。且相同elem内部具有保序性。
index | Last | B | S* | B' | Front | C* |
1 | e | 1 | e | 1 | $ | $ |
2 | e | 0 | d | 1 | _ | _ |
3 | d | 1 | _ | 1 | _ | _ |
4 | _ | 1 | n | 1 | a | a |
5 | n | 1 | r | 1 | d | d |
6 | r | 1 | h | 1 | e | e |
7 | r | 0 | t | 0 | e | e |
8 | h | 1 | $ | 1 | e | h |
9 | h | 0 | a | 0 | e | n |
10 | t | 1 | e | 1 | h | r |
11 | $ | 1 | _ | 0 | h | t |
12 | a | 1 | 1 | n | ||
13 | e | 1 | 1 | r | ||
14 | e | 0 | 0 | r | ||
15 | _ | 1 | 1 | t |
如此这般,
B+B' = 15bits + 15bits = 2 Bytes.
S:11 Bytes
In total: 2+11+1(表len)=14 Bytes.
原来的方式:
Last列:15 Bytes
C Table (for Front列):row:9 * col:2 = 18 Bytes
$ | 1 |
_ | 2 |
a | 4 |
d | 5 |
e | 6 |
h | 10 |
n | 12 |
r | 13 |
t | 15 |
In total: 15+18=33 Bytes.
时间换空间,还是有点效果。
[IR] BWT+MTF+AC的更多相关文章
- [IR] String Matching
BWT KMP Boyer-Moore BWT [IR] BWT+MTF+AC 中已经介绍了BWT (Burrows–Wheeler_transform)数据转换算法, 这种变换方式不仅方便压缩,同时 ...
- 本人AI知识体系导航 - AI menu
Relevant Readable Links Name Interesting topic Comment Edwin Chen 非参贝叶斯 徐亦达老板 Dirichlet Process 学习 ...
- [Code] 烧脑之算法模型
把博客的算法过一遍,我的天呐多得很,爱咋咋地! 未来可考虑下博弈算法. 基本的编程陷阱:[c++] 面试题之犄角旮旯 第壹章[有必要添加Python] 基本的算法思想:[Algorithm] 面试题之 ...
- paper 61:计算机视觉领域的一些牛人博客,超有实力的研究机构等的网站链接
转载出处:blog.csdn.net/carson2005 以下链接是本人整理的关于计算机视觉(ComputerVision, CV)相关领域的网站链接,其中有CV牛人的主页,CV研究小组的主页,CV ...
- 关于国内外CV领域牛人的博客链接 .
此文为转载文章,尊重知识产权http://blog.csdn.net/carson2005/article/details/6601109此为原文链接,感谢作者! 以下链接是关于计算机视觉(Compu ...
- 计算机视觉(ComputerVision, CV)相关领域的站点链接
关于计算机视觉(ComputerVision, CV)相关领域的站点链接,当中有CV牛人的主页.CV研究小组的主页,CV领域的paper,代码.CV领域的最新动态.国内的应用情况等等. (1)goog ...
- paper 156:专家主页汇总-计算机视觉-computer vision
持续更新ing~ all *.files come from the author:http://www.cnblogs.com/findumars/p/5009003.html 1 牛人Homepa ...
- BWT (Burrows–Wheeler_transform)数据转换算法
1.什么是BWT 压缩技术主要的工作方式就是找到重复的模式,进行紧密的编码. BWT(Burrows–Wheeler_transform)将原来的文本转换为一个相似的文本,转换后使得相同的字符位置连续 ...
- 【南阳OJ分类之语言入门】80题题目+AC代码汇总
小技巧:本文之前由csdn自动生成了一个目录,不必下拉一个一个去找,可通过目录标题直接定位. 本文转载自本人的csdn博客,复制过来的,排版就不弄了,欢迎转载. 声明: 题目部分皆为南阳OJ题目. 代 ...
随机推荐
- MapReduce过程(包括Shuffle)详解
首先,map的输入数据默认一个一个的键值对,键就是每一行首字母的偏移量,值就是每一行的值了. 然后每一个输入的键值对都会用我们定义的map函数去处理,这里用wordcount来举例的话就是,每一个键值 ...
- 将ImageList中的图片转化成byte数组
Image imgwd = this.imageList1.Images["wd.png"]; var bytes = ImageToBytes(imgwd); public by ...
- MySQL执行计划总结
背景 在工作过程中,最近时常对慢查询进行调优.对于MySQL的SQL语句调优,MySQL本身提供了强大的explain关键字用于查询分析执行计划. 本文对explain执行计划进行分析与整理,文中的内 ...
- bzoj2144 【国家集训队2011】跳跳棋
Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他 ...
- register_sysctl_table实现内核数据交互
作者:Younger Liu, 本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可. Sysctl是一种用户应用来设置和获得运行时内核的配置参数的一种有效方式,通 ...
- myeclipse中文乱码
解决myeclipse中乱码问题. 改变整个Eclipse工作空间的编码格式 window->preferences->General->workspace中 把text file ...
- Linux下安装单机版zookeeper(和dubbo配合验证)和redis(用图形化界面连接验证)
上次写了篇zookeeper的集齐,并且用dubbo admin验证了集群结果.最近又特地装了个虚拟机,专门装各种单机版的,免得跟集群的机器混合了.安装的虚拟机IP为192.168.1.108 1.单 ...
- iOS APP打包分发给远程的手机测试
APP要打包给远程的朋友或客户测试,但又不是企业账号的情况下,我们只能根据手机的udid进行描述证书的配置,再打包分发给提供了udid的手机进行安装 一.如何得到udid? 手机连接到mac电脑,打开 ...
- 利用GDB进行多线程调试
一.多线程调试 多线程调试重要就是下面几个命令: info thread 查看当前进程的线程. thread <ID> 切换调试的线程为指定ID的线程. break file.c:100 ...
- sublime Text 3常用Html/Css基础插件安装
前言 sublime以其简洁明了的外观,干脆利落的编辑方式,再加上丰富的功能插件,深受广大开发者的喜爱.今天,我就来介绍几款基于Html/Css开发的sublime插件. 1.Package Cont ...