一、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解码
对于上表中信息,可以得到如下信息:
- L列中第一个字符是初始字符串的最后一个字符。因为添加的标记字符的#是ASCII最小的,所以第一次右移得到的字符字典序最小。
- 在
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