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解码

  因为进行的是循环移位,且是循环左移注意下面的性质:

      1、L的第一个元素是Text中的最后一个元素
      2、对于M中的每一行(第一行除外)第一个元素都是最后一个元素的下一个元素。
      也就是说,对于文本块而言,同一行中F是L的下一个元素,L是F的前一个元素。
 
  这样,就需要
  (1)通过"F"列中的元素,找到他前面的字符,就是对应的同一行“L”列;
  (2)通过“L”列中的元素,找到他在“F”列中的对应字符位置。但是“L”中有3个字符a,如何对应F中的3个a呢?因为L是F的前一个元素,多个具有相同前缀的字符串排序,去掉共同前缀后相对次序没有变化。所有遇到多个相同的字符,相对位置不变;
  (3)转到(1),直到结束。
  因为F列是已经排序的,可以从L列获得,所有只需要保存L列就可以。从L列中的字符获取在F列中的位置时,需要:
  (1)前缀和数组,记录小于当前字符的字符数个数。
  (2)count计数,计算L中从开始位置到当前字符位置等于该字符的字符数。(保证多个相同字符下"L"到“F”的相对位置不变)。

3.BWT文本块编码、解码实例

  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>
  4. #include <string.h>
  5. using namespace std;
  6.  
  7. ///编码,生成last数组
  8. int getLastArray(char *lastArray,const string &str){ ///子串排序
  9. int len=str.size();
  10. string array[len];
  11.  
  12. for(int i=;i<len;i++){
  13. array[i] = str.substr(i);
  14. }
  15. sort(array,array+len);
  16. for(int i=;i<len;i++){
  17. lastArray[i] = str.at((*len-array[i].size()-)%len);
  18. }
  19. return ;
  20. }
  21.  
  22. int getCountPreSum(int *preSum,const string &str){
  23. memset(preSum,,*sizeof(int));
  24. for(int i=;i<str.size();i++){
  25. if(str.at(i) == '#')
  26. preSum[]++;
  27. else
  28. preSum[str.at(i)-'a'+]++;
  29. }
  30.  
  31. for(int i=;i<;i++)
  32. preSum[i] += preSum[i-];
  33. return ;
  34. }
  35.  
  36. ///解码,使用last数组,恢复原来的文本块
  37. int regainTextFromLastArray(char *lastArray,char *reGainStr,int *preSum){
  38. int len=strlen(lastArray);
  39. int pos=;
  40. char c;
  41. for(int i=len-;i>=;){
  42. reGainStr[i] = lastArray[pos];
  43. c = lastArray[pos];
  44. pos = preSum[c-'a']+count(lastArray,lastArray+pos,c);
  45. i--;
  46. }
  47. return ;
  48. }
  49.  
  50. int main (){
  51. string str("sdfsfdfdsdfgdfgfgfggfgdgfgd#");
  52. int preSum[];
  53. int len=str.size();
  54.  
  55. char *lastArray = new char[len+];
  56. char *reGainStr = new char[len+];
  57. lastArray[len]='\0';
  58. reGainStr[len]='\0';
  59.  
  60. getCountPreSum(preSum,str);
  61. getLastArray(lastArray,str);
  62. regainTextFromLastArray(lastArray,reGainStr,preSum);
  63.  
  64. cout<<" str: "<<str<<endl;
  65. cout<<"lastArray : "<<lastArray<<endl;
  66. cout<<"reGainStr : "<<reGainStr<<endl;
  67.  
  68. delete lastArray;
  69. delete reGainStr;
  70. return ;
  71. }

代码执行输出:

参考:

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)数据转换算法的更多相关文章

  1. BWT压缩算法(Burrows-Wheeler Transform)

    参考: BWT (Burrows–Wheeler_transform)数据转换算法 压缩技术主要的工作方式就是找到重复的模式,进行紧密的编码. BWT(Burrows–Wheeler_transfor ...

  2. [IR] BWT+MTF+AC

    BWT (Burrows–Wheeler_transform)数据转换算法 MTF(Move-to-front transform)数据转换 基于统计的压缩算法:游程编码 良心PPT: bwt_bas ...

  3. [IR] String Matching

    BWT KMP Boyer-Moore BWT [IR] BWT+MTF+AC 中已经介绍了BWT (Burrows–Wheeler_transform)数据转换算法, 这种变换方式不仅方便压缩,同时 ...

  4. BWT(Burrows-Wheeler Transformation)的讲解及java实现

    BWT(Burrows-Wheeler Transformation) 1.什么是BWT 压缩技术主要的工作方式就是找到重复的模式,进行紧密的编码. BWT(Burrows–Wheeler_trans ...

  5. Hive、Spark SQL、Impala比较

    Hive.Spark SQL.Impala比较        Hive.Spark SQL和Impala三种分布式SQL查询引擎都是SQL-on-Hadoop解决方案,但又各有特点.前面已经讨论了Hi ...

  6. 写出pythonic的python代码

    http://www.cnblogs.com/dadadechengzi/p/6226071.html 1,列表推导(没当要对序列中的内容进行循环处理时,就应该尝试使用列表推倒) 在python中编写 ...

  7. 技术分享丨数据仓库的建模与ETL实践技巧

    摘要:如何搭建数据仓库,在这个过程中都应该遵循哪些方法和原则,项目实践中有哪些技巧. 一.数据仓库的“心脏” 首先来谈谈数据模型.模型是现实世界特征的模拟和抽象,比如地图.建筑设计沙盘,飞机模型等等. ...

  8. 重新想象 Windows 8 Store Apps (32) - 加密解密: 非对称算法, 数据转换的辅助类

    原文:重新想象 Windows 8 Store Apps (32) - 加密解密: 非对称算法, 数据转换的辅助类 [源码下载] 重新想象 Windows 8 Store Apps (32) - 加密 ...

  9. DNA比对算法:BWT

    DNA比对算法:BWT BWT算法,实质上是前缀树的一种实现.那么什么是前缀树呢? 一.前缀树 对于问题p in S?如果S=rpq,那么p为S前缀rp的一个后缀. 于是,为了判断p in S 是否成 ...

随机推荐

  1. k8s入门系列之扩展组件(一)DNS安装篇

    DNS (domain name system),提供域名解析服务,解决了难于记忆的IP地址问题,以更人性可读可记忆可标识的方式映射对应IP地址. Cluster DNS扩展插件用于支持k8s集群系统 ...

  2. oracle创建、删除账户

    1.创建 /*第1步:创建表空间 */create tablespace xybi datafile 'E:\oracle\oradata\zzxe\xybi_d01' size 100M ; /*第 ...

  3. Android ListView 子控件点击事件

    android:descendantFocusability beforeDescendants:viewgroup会优先其子类控件而获取到焦点 afterDescendants:viewgroup只 ...

  4. PHP---------去除数组里面值为空或者为空字符串的元素

    array_filter(array('a'=>'','',null,'b'=>3),function($val){         if($val===''||$val===null){ ...

  5. jsp请求乱码问题

    首先尝试添加filter,以下是我的自定义filter,实现了Filter接口: package com.deplume.ssm.filter;import javax.servlet.*;impor ...

  6. JSP 和 Servlet 有哪些相同点和不同点,他们之间的联系是什么?

    JSP 和 Servlet 有哪些相同点和不同点,他们之间的联系是什么? 联系: JSP 是 Servlet 技术的扩展,本质上是 Servlet 的简易方式,更强调应用的外表表达. JSP编译后是& ...

  7. 提取SD卡中的图片

    读取SD卡的权限 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> ...

  8. 7.$a = 'abcdef'; 请取出$a的值并打印出第一个字母

    echo $a[0]; echo $a{0}; echo chr(ord($a));//先输出$a字符串里的第一个字符的ASCII值 再从指定的 ASCII 值返回字符.

  9. Boadload和Image$$??$$Limit含义

    Bootloader 即引导加载程序,是系统加电后运行的第一段软件代码.简单的说它们都是bootloader,所完成的任务也大同小异. 熟悉x86体系结构的朋友肯定知道,x86平台上bootloade ...

  10. js typeof

    var message = "some thing"; alert(typeof message); // string alert(typeof 95); // number a ...