BWT (Burrows–Wheeler_transform)数据转换算法
1.什么是BWT
压缩技术主要的工作方式就是找到重复的模式,进行紧密的编码。
BWT(Burrows–Wheeler_transform)将原来的文本转换为一个相似的文本,转换后使得相同的字符位置连续或者相邻,之后可以使用其他技术如:Move-to-front transform 和 游程编码 进行文本压缩。
2.BWT原理
2.1 BWT编码
(1)首先,BWT先对需要转换的文本块,进行循环右移,每次循环一位。可以知道长度为n的文本块,循环n次后重复,这样就得到看n个长度为n的字符串。如下图中的“Rotate Right”列。(其中‘#’作为标识符,不在文本块的字符集中,这样保证n个循环移位后的字符串均布相同。并且定义'#'小于字符集中的任意字符)。
(2)对循环移位后的n个字符串按照字典序排序。如下图中的“Sorted (M)”列。
(3)记录下“Sorted (M)”列中每个字符串的最后一个字符,组成了“L”列。(其中"F"列是“Sorted (M)”列中每个字符串的前缀)

这样,原来的字符串“banana#”就转换为了“annb#aa”。在某些情况下,使用L列进行压缩会有更好的效果。“L”列就是编码的结果。
2.2 BWT解码
因为进行的是循环移位,且是循环左移注意下面的性质:

3.BWT文本块编码、解码实例
#include <iostream>
#include <string>
#include <algorithm>
#include <string.h>
using namespace std; ///编码,生成last数组
int getLastArray(char *lastArray,const string &str){ ///子串排序
int len=str.size();
string array[len]; for(int i=;i<len;i++){
array[i] = str.substr(i);
}
sort(array,array+len);
for(int i=;i<len;i++){
lastArray[i] = str.at((*len-array[i].size()-)%len);
}
return ;
} int getCountPreSum(int *preSum,const string &str){
memset(preSum,,*sizeof(int));
for(int i=;i<str.size();i++){
if(str.at(i) == '#')
preSum[]++;
else
preSum[str.at(i)-'a'+]++;
} for(int i=;i<;i++)
preSum[i] += preSum[i-];
return ;
} ///解码,使用last数组,恢复原来的文本块
int regainTextFromLastArray(char *lastArray,char *reGainStr,int *preSum){
int len=strlen(lastArray);
int pos=;
char c;
for(int i=len-;i>=;){
reGainStr[i] = lastArray[pos];
c = lastArray[pos];
pos = preSum[c-'a']+count(lastArray,lastArray+pos,c);
i--;
}
return ;
} int main (){
string str("sdfsfdfdsdfgdfgfgfggfgdgfgd#");
int preSum[];
int len=str.size(); char *lastArray = new char[len+];
char *reGainStr = new char[len+];
lastArray[len]='\0';
reGainStr[len]='\0'; getCountPreSum(preSum,str);
getLastArray(lastArray,str);
regainTextFromLastArray(lastArray,reGainStr,preSum); cout<<" str: "<<str<<endl;
cout<<"lastArray : "<<lastArray<<endl;
cout<<"reGainStr : "<<reGainStr<<endl; delete lastArray;
delete reGainStr;
return ;
}
代码执行输出:

参考:
http://en.wikipedia.org/wiki/Burrows%E2%80%93Wheeler_transform
http://emily2ly.iteye.com/blog/742869
额外阅读:
MTF(Move-to-front transform)数据转换
BWT (Burrows–Wheeler_transform)数据转换算法的更多相关文章
- BWT压缩算法(Burrows-Wheeler Transform)
参考: BWT (Burrows–Wheeler_transform)数据转换算法 压缩技术主要的工作方式就是找到重复的模式,进行紧密的编码. BWT(Burrows–Wheeler_transfor ...
- [IR] BWT+MTF+AC
BWT (Burrows–Wheeler_transform)数据转换算法 MTF(Move-to-front transform)数据转换 基于统计的压缩算法:游程编码 良心PPT: bwt_bas ...
- [IR] String Matching
BWT KMP Boyer-Moore BWT [IR] BWT+MTF+AC 中已经介绍了BWT (Burrows–Wheeler_transform)数据转换算法, 这种变换方式不仅方便压缩,同时 ...
- BWT(Burrows-Wheeler Transformation)的讲解及java实现
BWT(Burrows-Wheeler Transformation) 1.什么是BWT 压缩技术主要的工作方式就是找到重复的模式,进行紧密的编码. BWT(Burrows–Wheeler_trans ...
- Hive、Spark SQL、Impala比较
Hive.Spark SQL.Impala比较 Hive.Spark SQL和Impala三种分布式SQL查询引擎都是SQL-on-Hadoop解决方案,但又各有特点.前面已经讨论了Hi ...
- 写出pythonic的python代码
http://www.cnblogs.com/dadadechengzi/p/6226071.html 1,列表推导(没当要对序列中的内容进行循环处理时,就应该尝试使用列表推倒) 在python中编写 ...
- 技术分享丨数据仓库的建模与ETL实践技巧
摘要:如何搭建数据仓库,在这个过程中都应该遵循哪些方法和原则,项目实践中有哪些技巧. 一.数据仓库的“心脏” 首先来谈谈数据模型.模型是现实世界特征的模拟和抽象,比如地图.建筑设计沙盘,飞机模型等等. ...
- 重新想象 Windows 8 Store Apps (32) - 加密解密: 非对称算法, 数据转换的辅助类
原文:重新想象 Windows 8 Store Apps (32) - 加密解密: 非对称算法, 数据转换的辅助类 [源码下载] 重新想象 Windows 8 Store Apps (32) - 加密 ...
- DNA比对算法:BWT
DNA比对算法:BWT BWT算法,实质上是前缀树的一种实现.那么什么是前缀树呢? 一.前缀树 对于问题p in S?如果S=rpq,那么p为S前缀rp的一个后缀. 于是,为了判断p in S 是否成 ...
随机推荐
- ListView或GridView的Adapter使用Glide加载图片异常
报错信息为:You must not call setTag() on a view Glide is targeting 原因就是View使用setTag后导致Glide之前请求的标记被清除,强制转 ...
- Python开发【第七章】:Python异常处理
一.异常处理 1.异常基础 在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!!! #异常处理 list = [&qu ...
- Android--ViewPager制作APP引导页
ViewPager使用FragmentStatePagerAdapter做Adapter,引导页使用多Fragment形式. FragmentStatePagerAdapter代码如下: public ...
- Vcenter server 5.5克隆模板(创建ISO镜像)
1.进入Vcenter server 5.5控制台 --- 选择虚拟机和模版. 2.右键 XP_32 --- 模版 ---- 克隆为模板(Vcenter server 5.5连接的VMware ESX ...
- Python之路-python(面向对象进阶)
一.面向对象高级语法部分 1.静态方法.类方法.属性方法 2.类的特殊方法 3.反射 二.异常处理 三.Socket开发基础 一.面向对象高级语法部分 静态方法(@staticmethod) 定义:只 ...
- php +html5 websocket 聊天室
针对内容比较长出错,修改后的解码函数 和 加码函数 原文请看上一篇 http://yixun.yxsss.com/yw3104.html function uncode($str,$key){ $ma ...
- 并发案例--ScheduledExecutorService用法
InstanceFactory.getInstance(ScheduledExecutorService.class).schedule(new Callable<Object>() { ...
- Oracle常用操作-----(一)
Oracle创建约束: ALTER TABLE 表名 ADD CONSTRAINT 约束名 约束内容. [注]Oracle中的default是一个值,而sql server中的default是一个约束 ...
- C# httprequest post 内容有百分号,部分特殊字符乱码问题
哎没办法,还没完全脱离.net,已经一半了. http://stackoverflow.com/questions/7908581/how-to-encode-http-post-parameters ...
- 大型网站演化(转载 http://homeway.me/2014/12/10/think-about-distributed-clusters/)
0x01.大型网站演化 简单说,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率. 集群主要分为:高可用集群(High Availability Clu ...