BWT(Burrows-Wheeler_transform)数据转换算法

一、BWT原理

BWT(Burrows-Wheeler Transform)算法是一种数据转换算法,它将一个字符串中的相似字符放在相邻的位置,以便于后续的压缩。BWT算法可以分为编码部分和解码两部分。编码后,原始字符串中相似的字符会处在比较相邻的位置 ,这里就可以压缩空间;
解码是将编码后的字符串重新恢复为原始字符串的过程。使用BWT算法经过编码的字符串可以完全恢复成原始字符串。

二、BWT编码

BWT算法将需要转换的字符串,进行循环右移,每次循环一位。所以长度为n的字符串s,循环n次后会得到n个长度为n的字符串 s i , i ∈ [ 1 , n ] { s_i,i\in[1,n]} si,i[1,n] 。不过在右移前需要在字符串后加一个标记符号,并且该字符要比字符串中所有字符都要小,比如$或#
在这里插入图片描述
以上图为例,
1. 对字符串banana#,进行n次循环右移,这里n为字符串的长度,即n=7 ,得到图中的Rotate Right
2. 对循环右移后的字符串按照字典序进行排序,得到图中的Sorted(M)
3. 记录排序之后每个字符串的第一个字符,得到F列,F即first
4. 记录排序之后每个字符串的最后一个字符,得到L列,L即last

经过编码得到的信息为F和L两列字符,因为F列是有序的,而L列是无序的,并且两列中字符集合相同,对L列排序则可以得到F列,所以只记录L列即可,但是初始字符串中存在相同字符,如字符n和a,所以还需要相同字符的相对位置,例如表中第三行L列的n字符是L列中第二个的n字符,所以记录表中第三行L列字符n的相同字符的相对位置为2
那么相同字符的相对位置应该怎么表示呢?

  • 经过观察可以发现,L列中相同字符的相对位置和F列中相同字符的相对位置是一样的。因为M数组是排过序的,L列中的相同字符的次序也就说明这些字符的同行的F列字符也是保持一样的次序(因为F列是有序的),所以再经过一次右移,肯定会保持相同的次序。

三、BWT解码

对于上表中信息,可以得到如下信息:

  1. L列中第一个字符是初始字符串的最后一个字符。因为添加的标记字符的#是ASCII最小的,所以第一次右移得到的字符字典序最小。
  2. Sorted(M)列中除了第一行外,其余行字符串中第一个字符是最后一个字符的下一个元素(在初始字符串中)。即上表中L列字符在初始字符串中的下一个元素为同行的F列字符

所以解码过程是倒序来找原始字符串的:
3. 通过上面的第一条信息,得到原始字符串的最后一个字符,即字符a(除#外)
4. 确定字符a的位置后,需要通过F和L列还有相同字符的相对信息记录来找字符a的前一个元素。因为这个字符a是L列中第一个字符a,即相同字符的相对位置为1,所以去F列中找第一个字符a,即找到表中的第二行,通过第二行,可以得到倒数第二个字符为n,依次类推
在这里插入图片描述

Re:
https://www.cnblogs.com/xudong-bupt/p/3763814.html
https://zhuanlan.zhihu.com/p/88263062

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值