BWT(Burrows-Wheelter Transform)算法

原创 2016年08月29日 10:53:14

最近看论文的时候,遇到了BWT算法。

部分内容转载自http://www.cnblogs.com/xudong-bupt/p/3763814.html

1.概述

BWT是一种以数据块为操作对象的可逆的数据变换方法,其核心思想是对字符串轮转后得到的字符矩阵进行排序和变换。它本身不会减少数据量,但是变换后的数据更容易压缩,所以BWT是对数据进行压缩的预处理。

2.原理

2.1 BWT正变换

设输入字符串T="banana"(‘#’为标识符,并规定其在词典序中最小,这样每一次右移得到结果都不相同)。

(1)对字符串进行循环右移操作,每次循环一位。对于长度为n 的字符串,循环右移n次。获得下图中的"Rotate Right"列。

(2)对循环右移后得到的n个字符串按照词典序排序,得到Sorted(M)列。

(3)Sorted(M)列中每个字符串的最后一个字符组成L列;第一个字符组成F列


上表具有的性质:

(1)L的第一元素是字符串的最后一个元素

(2)对于M的每一行(第一行除外)第一个元素都是最后一个元素的下一个元素,也就是说,从字符串的角度来看,同一行中F是L的下一个元素,L是F的前一个元素。

L就是最终要存储的结果(F可以有L排序得到)。

2.2 BW逆变换

逆变换从最后一个字符开始还原字符串。

我们利用2.1中的性质

由性质(1)可知字符串的最后一个元素为a。

a的前一个元素可能是n、n、b,该如何确定呢?现在我们考虑一下排序过程,具有相同前缀的字符串显然“#”所在位置越靠前的字符串排序也越靠前,而“#”靠前,则说明右移操作进行的越早,说明该右移得到的字符串最后一个元素在原字符串中的位置越靠后。总的来说,具有相同前缀的字符串,排序操作不会改变它们的相对次序。每次我们只要在相同前缀字符串(如果有相同的话)中找排在最前面的即可。

这样,我们就能确定a的前一个元素是n。同理可推出其他字符。

a

n

a

n

a

b

将上述序列逆序,即可得原字符串banana。





Burrows-Wheeler压缩算法JAVA实现

  • 2014年05月20日 21:11
  • 5KB
  • 下载

BWT完整算法

  • 2014年06月03日 20:42
  • 5.63MB
  • 下载

BWT算法在生物信息学中的应用(二)-算法实现

上一节中,介绍了BWT算法的基本原理,本节主要使用C++来完成BWT算法。主要思路基于上一节中的思想。...

poj 1147 Binary codes BWT压缩算法

题意:一个长度为N的01序列,会有N个不同的轮换(当然,字符相同,其中也可能会有相同的),将这N个不同轮换按字典序排 序,取排序后的每个轮换的最后一排,组成一个序列。题中给出压缩后的序列,求原始序列,...

BWT数据压缩算法

urrower-Wheeler变换  1994年 Michael Burrows 和 David Wheeler在《A Block-sorting Lossless Data Compression ...
  • nwpulei
  • nwpulei
  • 2011年04月18日 15:55
  • 5346

BWT算法在生物信息学中的应用(一)-算法的基本原理

BWT算法可以将原文本转换成相似文本,并且可以用其他技术进行压缩。

BWT压缩算法及FM搜索算法详解

BWT压缩算法其经典地位无可撼动, 关于数据

STL学习之十四:常用算法 for_each 和 transform以及adjacent_find的示例代码

本文主要介绍STL中常用算法 for_each 和 transform以及adjacent_find示例代码

STL中的两个算法for_each与transform

区别的话这里不多讲,自己百度咯. for_each(begin,end,function); 先看一个简单易理解的小例子  #include #include #include us...
  • ajioy
  • ajioy
  • 2012年10月24日 15:43
  • 1815
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BWT(Burrows-Wheelter Transform)算法
举报原因:
原因补充:

(最多只允许输入30个字)