Burrows-Wheeler变换

✍ dations ◷ 2025-04-26 22:46:51 #无损压缩算法,变换

Burrows–Wheeler Transform(简称BWT,也称作块排序压缩),是一个被应用在数据压缩技术(如bzip2)中的算法。该算法于1994年被Michael Burrows(英语:Michael Burrows)和David Wheeler(英语:David Wheeler)在位于加利福尼亚州帕洛阿尔托的DEC系统研究中心(英语:DEC Systems Research Center)发明。它的基础是之前Wheeler在1983年发明的一种没有公开的转换方法。

当一个字符串用该算法转换时,算法只改变这个字符串中字符的顺序而并不改变其字符。如果原字符串有几个出现多次的子串,那么转换过的字符串上就会有一些连续重复的字符,这对压缩是很有用的。该方法能使得基于处理字符串中连续重复字符的技术(如MTF变换和游程编码)的编码更容易被压缩。

举个例子:

该算法的输出因为有更多的重复字符而更容易被压缩了。

算法将输入字符串的所有循环字符串按照字典序排序,并以排序后字符串形成的矩阵的最后一列为其输出。

banana
$ b a n a n a
a $ b a n a n
n a $ b a n a
a n a $ b a n
n a n a $ b a
a n a n a $ b
b a n a n a $
$ b a n a n a
a $ b a n a n
a n a $ b a n
a n a n a $ b
b a n a n a $
n a $ b a n a
n a n a $ b a
a n n b $ a a

Burrows–Wheeler变换的还原过程

  • 基于上述的BWT变换过程,以字符串“banana”为例,我们得到了变换结果“annb$aa”。其还原过程见以下过程:
  1. 1 基于原字符串矩阵的最后一列为“annb$aa”,我们进行该列进行排序,得到“annb$aa”,并将其作为还原矩阵的第一列
Burrows–Wheeler 还原过程 1
输入转移排序组合
- - - - - - a
- - - - - - n
- - - - - - n
- - - - - - b
- - - - - - $
- - - - - - a
- - - - - - a
a - - - - - -
n - - - - - -
n - - - - - -
b - - - - - -
$ - - - - - -
a - - - - - -
a - - - - - -
$ - - - - - -
a - - - - - -
a - - - - - -
a - - - - - -
b - - - - - -
n - - - - - -
n - - - - - -
$ - - - - - a
a - - - - - n
a - - - - - n
a - - - - - b
b - - - - - $
n - - - - - a
n - - - - - a
  1. 2 经过1.1的转移、排序和组合,我们得到了7对邻接字符串:<a$> <na> <na> <ba> <$b> <an> <an>,将这7对邻接字符串进行排序后,得到<$b> <a$> <an> <an> <ba> <na> <na>,由此,我们得到了还原矩阵的第二列“b$nnaaa”
Burrows–Wheeler 还原过程 2
输入转移排序组合
$ - - - - - a
a - - - - - n
a - - - - - n
a - - - - - b
b - - - - - $
n - - - - - a
n - - - - - a
a $ - - - - -
n a - - - - -
n a - - - - -
b a - - - - -
$ b - - - - -
a n - - - - -
a n - - - - -
$ b - - - - -
a $ - - - - -
a n - - - - -
a n - - - - -
b a - - - - -
n a - - - - -
n a - - - - -
$ b - - - - a
a $ - - - - n
a n - - - - n
a n - - - - b
b a - - - - $
n a - - - - a
n a - - - - a
  1. 3 经过1.2的转移、排序和组合,我们得到了7对邻接字符串:<a$b> <na$> <nan> <ban> <$ba> <ana> <ana>,将这7对邻接字符串进行排序后,得到<$ba> <a$b> <ana> <ana> <ban> <na$> <nan>,由此,我们得到了还原矩阵的第三列“abaan$n”
Burrows–Wheeler 还原过程 3
输入转移排序组合
$ b - - - - a
a $ - - - - n
a n - - - - n
a n - - - - b
b a - - - - $
n a - - - - a
n a - - - - a
a $ b - - - -
n a $ - - - -
n a n - - - -
b a n - - - -
$ b a - - - -
a n a - - - -
a n a - - - -
$ b a - - - -
a $ b - - - -
a n a - - - -
a n a - - - -
b a n - - - -
n a $ - - - -
n a n - - - -
$ b a - - - a
a $ b - - - n
a n a - - - n
a n a - - - b
b a n - - - $
n a $ - - - a
n a n - - - a
  1. 4 经过1.3的转移、排序和组合,我们得到了7对邻接字符串:<a$ba> <na$b> <nana> <bana> <$ban> <ana$> <anan>,将这7对邻接字符串进行排序后,得到<$ban> < a$ba > <ana$> < anan > < bana > < na$b > < nana >,由此,我们得到了还原矩阵的第四列“na$naba”
Burrows–Wheeler 还原过程 4
输入转移排序组合
$ b a - - - a
a $ b - - - n
a n a - - - n
a n a - - - b
b a n - - - $
n a $ - - - a
n a n - - - a
a $ b a - - -
n a $ b - - -
n a n a - - -
b a n a - - -
$ b a n - - -
a n a $ - - -
a n a n - - -
$ b a n - - -
a $ b a - - -
a n a $ - - -
a n a n - - -
b a n a - - -
n a $ b - - -
n a n a - - -
$ b a n - - a
a $ b a - - n
a n a $ - - n
a n a n - - b
b a n a - - $
n a $ b - - a
n a n a - - a
  1. 5 经过1.4的转移、排序和组合,我们得到了7对邻接字符串:<a$ban> <na$ba> <nana$> <banan> <$bana> <ana$b> <anana>,将这7对邻接字符串进行排序后,得到<$bana> <a$ban> < ana$b > <anana> <banan> <na$ba> <nana$>,由此,我们得到了还原矩阵的第五列“anbana$”
Burrows–Wheeler 还原过程 5
输入转移排序组合
$ b a n - - a
a $ b a - - n
a n a $ - - n
a n a n - - b
b a n a - - $
n a $ b - - a
n a n a - - a
a $ b a n - -
n a $ b a - -
n a n a $ - -
b a n a n - -
$ b a n a - -
a n a $ b - -
a n a n a - -
$ b a n a - -
a $ b a n - -
a n a $ b - -
a n a n a - -
b a n a n - -
n a $ b a - -
n a n a $ - -
$ b a n a - a
a $ b a n - n
a n a $ b - n
a n a n a - b
b a n a n - $
n a $ b a - a
n a n a $ - a
  1. 6 经过1.5的转移、排序和组合,我们得到了7对邻接字符串:<a$bana> <na$ban> <nana$b> <banaan> <$banan> <ana$ba> <anana$>,将这7对邻接字符串进行排序后,得到<$banan> <a$bana> < ana$ba> <anana$> <banana> <na$ban> <nana$b>,由此,我们得到了还原矩阵的第六列“naa$anb”。
Burrows–Wheeler 还原过程 5
输入转移排序组合
$ b a n a - a
a $ b a n - n
a n a $ b - n
a n a n a - b
b a n a n - $
n a $ b a - a
n a n a $ - a
a $ b a n a -
n a $ b a n -
n a n a $ b -
b a n a n a -
$ b a n a n -
a n a $ b a -
a n a n a $ -
$ b a n a n -
a $ b a n a -
a n a $ b a -
a n a n a $ -
b a n a n a -
n a $ b a n -
n a n a $ b -
$ b a n a n a
a $ b a n a n
a n a $ b a n
a n a n a $ b
b a n a n a $
n a $ b a n a
n a n a $ b a

经过六次排序转移与组合,还原出了原有的字符串即“$banana”。

def bwt(s):    """对字符串进行Burrows-Wheeler变换 不使用唯一字符('EOF')做标记 返回索引值列表"""    #创建所有循环字符串    table =  + s for i in range(len(s))]    #获取排序后的结果    table_sorted = table    table_sorted.sort()    #获取已排序表每个字符串在未排序表中对应字符串的下一个字符串在已排序表中的索引值    indexlist =     for t in table_sorted:        index1 = table.index(t)        index1 = index1+1 if index1 < len(s)-1 else 0        index2 = table_sorted.index(table)        indexlist.append(index2)    #取排序后结果的最后一列作为结果字符串    r = ''.join( for row in table_sorted])    return r, indexlistdef ibwt(r,indexlist):    """对字符串进行反Burrows-Wheeler变换 有索引值的反变换比使用唯一标记的反变换简单很多"""    s=''    x = indexlist    for _ in r:        s = s + r        x = indexlist    return s

python实现(基于末尾添加唯一字符方式)

通过在末尾添加唯一字符(不与输入字串中任何字符相同)后再进行变换,可以不需要传递索引值列表,不过逆变换的时候要做更多计算。

下面的伪代码提供了一个逆过程的朴素实现(输入字符串s为原过程之输出):

相关

  • 钠的同位素钠(原子量:22.98976928(2))共有22个同位素,其中有1个是稳定的。备注:画上#号的数据代表没有经过实验的证明,只是理论推测而已,而用括号括起来的代表数据不确定性。
  • 含巯基或硫基类血管紧张肽I转化酶抑制剂(英语:ACE inhibitor,简称为ACEI)是一类抗高血压药。血管紧张素转化酶(ACE)是肾素-血管紧张素-醛固酮(RAA)系统中的一个重要环节,该系统对血压的调节有着及其
  • 心搏骤停心脏停止(Cardiac arrest)或称为心搏停止,是心脏因不能够有效收缩,而导致血液循环停止的现象,症状包含丧失意识(英语:Unconsciousness)、呼吸异常或中止(英语:respiratory arrest),有些
  • 负债高雄市的负债又称为高雄市的举债是指高雄市政府的债务。包括高雄市本身的债务,以及2010年合并高雄县,所继承高雄县的债务。高雄市政府至2019年1月18日时,1年期以上债务为2,431
  • 辣椒红素辣椒红素(英语:capsanthin)是一种从辣椒属果实中提取出来的一种深红色脂溶性物质,分子式C40H56O3,属于叶黄素,是辣椒显深红色的主要因素,用于食品着色剂。辣椒提取物(Paprika oleore
  • 建设世界旅游休闲中心委员会建设世界旅游休闲中心委员会(葡萄牙语:Comissão para a Construção do Centro Mundial de Turismo e Lazer,葡文缩写:CCCMTL),在澳门特别行政区行政长官管辖及指导下运作。根据
  • 苏禄海苏禄海(Sulu Sea),位于西南太平洋的一个海域,周围被菲律宾的苏禄群岛、巴拉望岛、棉兰老岛以及马来西亚的沙巴地区围绕,连接南海和苏拉威西海。该片海域是海龟的繁殖场所,盛产海龟
  • 朝鲜哲宗朝鲜哲宗(朝鲜语:조선 철종/朝鮮 哲宗 ;1831年7月25日-1863年1月16日),朝鲜王朝的第25代君主,1849年至1863年在位。讳李昪(朝鲜语:이변/李昪 ),字道升(朝鲜语:도승/道升 )。初名元范(朝鲜语
  • 三位一体 (壮游)name = 'Transport',description = '交通',content = {{ type = 'text', text = ] },{ type = 'item', original = 'articulated bus', rule = 'zh-cn:铰接客车;zh-tw:双节
  • 弗莱什·卡罗伊弗莱什·卡罗伊(匈牙利语:Flesch Károly,英语:Carl Flesch,1873年10月9日-1944年11月15日),英译“卡尔·弗莱什”,匈牙利小提琴家、音乐教育家。弗莱什·卡罗伊出生于奥匈帝国的莫雄