<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.riguz.com/index.php?action=history&amp;feed=atom&amp;title=Burrows%E2%80%93Wheeler_Transform</id>
	<title>Burrows–Wheeler Transform - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.riguz.com/index.php?action=history&amp;feed=atom&amp;title=Burrows%E2%80%93Wheeler_Transform"/>
	<link rel="alternate" type="text/html" href="https://wiki.riguz.com/index.php?title=Burrows%E2%80%93Wheeler_Transform&amp;action=history"/>
	<updated>2026-06-02T19:18:34Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.42.3</generator>
	<entry>
		<id>https://wiki.riguz.com/index.php?title=Burrows%E2%80%93Wheeler_Transform&amp;diff=3767&amp;oldid=prev</id>
		<title>Riguz：​Riguz移动页面Blog:Burrows-Wheeler变换(Burrows–Wheeler Transform)至Burrows–Wheeler Transform，不留重定向</title>
		<link rel="alternate" type="text/html" href="https://wiki.riguz.com/index.php?title=Burrows%E2%80%93Wheeler_Transform&amp;diff=3767&amp;oldid=prev"/>
		<updated>2023-12-19T05:53:02Z</updated>

		<summary type="html">&lt;p&gt;Riguz移动页面&lt;a href=&quot;/index.php?title=Blog:Burrows-Wheeler%E5%8F%98%E6%8D%A2(Burrows%E2%80%93Wheeler_Transform)&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Blog:Burrows-Wheeler变换(Burrows–Wheeler Transform)（页面不存在）&quot;&gt;Blog:Burrows-Wheeler变换(Burrows–Wheeler Transform)&lt;/a&gt;至&lt;a href=&quot;/Burrows%E2%80%93Wheeler_Transform&quot; title=&quot;Burrows–Wheeler Transform&quot;&gt;Burrows–Wheeler Transform&lt;/a&gt;，不留重定向&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;zh-Hans-CN&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2023年12月19日 (二) 05:53的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;zh-Hans-CN&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;（没有差异）&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key wiki_db:diff:1.41:old-2640:rev-3767 --&gt;
&lt;/table&gt;</summary>
		<author><name>Riguz</name></author>
	</entry>
	<entry>
		<id>https://wiki.riguz.com/index.php?title=Burrows%E2%80%93Wheeler_Transform&amp;diff=2640&amp;oldid=prev</id>
		<title>imported&gt;Riguz：​最近听一个医学专业的同学提到了在进行基因分析中用到BWT算法，觉得挺有意思的，正巧赶上这次疫情在家，于是想研究一下这个算法。这个算法的核心思想在于，调整原来的字符串中字符的顺序（而不改变其长度及内容）从而更多的将重复的字符排列到一起，这样有助于其他的压缩算法获得更高的压缩比。这个算法在基因分析中大有用处也就顺理成章了，想想DNA的双链表示大概都是G-T-A-C会有很多这样的字符，那么运用BWT应该可以有比较好的效果。</title>
		<link rel="alternate" type="text/html" href="https://wiki.riguz.com/index.php?title=Burrows%E2%80%93Wheeler_Transform&amp;diff=2640&amp;oldid=prev"/>
		<updated>2020-03-04T00:00:00Z</updated>

		<summary type="html">&lt;p&gt;最近听一个医学专业的同学提到了在进行基因分析中用到BWT算法，觉得挺有意思的，正巧赶上这次疫情在家，于是想研究一下这个算法。这个算法的核心思想在于，调整原来的字符串中字符的顺序（而不改变其长度及内容）从而更多的将重复的字符排列到一起，这样有助于其他的压缩算法获得更高的压缩比。这个算法在基因分析中大有用处也就顺理成章了，想想DNA的双链表示大概都是G-T-A-C会有很多这样的字符，那么运用BWT应该可以有比较好的效果。&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;最近听一个医学专业的同学提到了在进行基因分析中用到BWT算法，觉得挺有意思的，正巧赶上这次疫情在家，于是想研究一下这个算法。这个算法的核心思想在于，调整原来的字符串中字符的顺序（而不改变其长度及内容）从而更多的将重复的字符排列到一起，这样有助于其他的压缩算法获得更高的压缩比。这个算法在基因分析中大有用处也就顺理成章了，想想DNA的双链表示大概都是G-T-A-C会有很多这样的字符，那么运用BWT应该可以有比较好的效果。&lt;br /&gt;
&lt;br /&gt;
= 算法实现=&lt;br /&gt;
考虑一个字符串，要想将相同的字符排列到一起，那么最简单的办法就是，将字符串中的字符进行排序。可是单纯的排序之后，虽然还是那么多字符，但是丢失了一个重要的信息就是字符原来的顺序，而BWT的核心思想就是在于排序并想办法保存字符的顺序信息。&lt;br /&gt;
&lt;br /&gt;
== 编码==&lt;br /&gt;
编码方式如下：&lt;br /&gt;
&lt;br /&gt;
* 将 ${\displaystyle \$}$ 作为字符串结尾标记加入到原字符串（记为 ${\displaystyle S}$ )末尾&lt;br /&gt;
* 将字符串从左到右进行轮换，对于一个长度为 ${\displaystyle N}$ 的字符串，产生 ${\displaystyle N}$ 个新的字符串，记为 ${\displaystyle S_{n}}$ &lt;br /&gt;
* 将 ${\displaystyle S, S_{1}...S_{n}}$ 进行字典序排序， ${\displaystyle \$}$ 权值最小放在最前面，也即 ${\displaystyle S_{n}}$ 在第一个&lt;br /&gt;
* 取排序后的所有字符串的最后一个字符，生成一个新的字符串（记为${\displaystyle S^{&amp;quot;}}$ )，即编码完成&lt;br /&gt;
&lt;br /&gt;
以字符串`banana`举例来说：&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
S = banana, N = 6\\&lt;br /&gt;
\begin{cases}&lt;br /&gt;
S_{0} = banana\color{blue}{$}\\&lt;br /&gt;
S_{1} = anana\color{blue}{$}b\\&lt;br /&gt;
S_{2} = nana\color{blue}{$}ba\\&lt;br /&gt;
S_{3} = ana\color{blue}{$}ban\\&lt;br /&gt;
S_{4} = na\color{blue}{$}bana\\&lt;br /&gt;
S_{5} = a\color{blue}{$}banan\\&lt;br /&gt;
S_{6} = \color{blue}{$}banana&lt;br /&gt;
\end{cases}&lt;br /&gt;
\xrightarrow[\text{字典序排序}]{}&lt;br /&gt;
\begin{cases}&lt;br /&gt;
S_{6} = \color{blue}{$}banana\\&lt;br /&gt;
S_{5} = a\color{blue}{$}banan\\&lt;br /&gt;
S_{3} = ana\color{blue}{$}ban\\&lt;br /&gt;
S_{1} = anana\color{blue}{$}b\\&lt;br /&gt;
S_{0} = banana\color{blue}{$}\\&lt;br /&gt;
S_{4} = na\color{blue}{$}bana\\&lt;br /&gt;
S_{2} = nana\color{blue}{$}ba&lt;br /&gt;
\end{cases}&lt;br /&gt;
\xrightarrow[\text{获取最后一个字符}]{}&lt;br /&gt;
\begin{cases}&lt;br /&gt;
S_{6} = $banan\color{red}{a}\\&lt;br /&gt;
S_{5} = a$bana\color{red}{n}\\&lt;br /&gt;
S_{3} = ana$ba\color{red}{n}\\&lt;br /&gt;
S_{1} = anana$\color{red}{b}\\&lt;br /&gt;
S_{0} = banana\color{red}{$}\\&lt;br /&gt;
S_{4} = na$ban\color{red}{a}\\&lt;br /&gt;
S_{2} = nana$b\color{red}{a}&lt;br /&gt;
\end{cases}\\&lt;br /&gt;
S^{&amp;quot;} = BWT(banana) = annb$aa&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
可以看出，转换后的字符串`annb$aa`比原来的字符串重复相连的字符的确更多了。实际上[http://www.bzip.org/ bzip]就是应用了BWT结合进行压缩的：&lt;br /&gt;
&lt;br /&gt;
&amp;gt; bzip2 compression program is based on Burrows–Wheeler algorithm.&lt;br /&gt;
&lt;br /&gt;
BWT转换后的重复相连字符更多并不绝对，有时候可能转换后的情况反而更糟，比如这个例子：&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
BWT(appellee) = e$elplepa&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
反而不如原始字符串了。&lt;br /&gt;
&lt;br /&gt;
== 解码==&lt;br /&gt;
=== 利用还原矩阵法===&lt;br /&gt;
解码的过程分为以下几步：&lt;br /&gt;
&lt;br /&gt;
* 根据编码后的字符串 ${\displaystyle S^{&amp;quot;}}$ ，得到还原矩阵&lt;br /&gt;
* 根据还原矩阵，逐个还原出原来的顺序&lt;br /&gt;
&lt;br /&gt;
根据编码的过程我们知道，实际上是这样的对应：&lt;br /&gt;
$$&lt;br /&gt;
\begin{cases}&lt;br /&gt;
S_{6} = \color{green}{$}banan\color{red}{a}\\&lt;br /&gt;
S_{5} = \color{green}{a}$bana\color{red}{n}\\&lt;br /&gt;
S_{3} = \color{green}{a}na$ba\color{red}{n}\\&lt;br /&gt;
S_{1} = \color{green}{a}nana$\color{red}{b}\\&lt;br /&gt;
S_{0} = \color{green}{b}anana\color{red}{$}\\&lt;br /&gt;
S_{4} = \color{green}{n}a$ban\color{red}{a}\\&lt;br /&gt;
S_{2} = \color{green}{n}ana$b\color{red}{a}&lt;br /&gt;
\end{cases}&lt;br /&gt;
\xrightarrow[\text{还原矩阵}]{}&lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
$ &amp;amp; a\\&lt;br /&gt;
a &amp;amp; n\\&lt;br /&gt;
a &amp;amp; n\\&lt;br /&gt;
a &amp;amp; b\\&lt;br /&gt;
b &amp;amp; $\\&lt;br /&gt;
n &amp;amp; a\\&lt;br /&gt;
n &amp;amp; a&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
得到这个矩阵非常简单，直接将字符串 ${\displaystyle S^{&amp;quot;}}$ 排个序就可以得到：&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{cases}&lt;br /&gt;
------a\\&lt;br /&gt;
------n\\&lt;br /&gt;
------n\\&lt;br /&gt;
------b\\&lt;br /&gt;
------$\\&lt;br /&gt;
------a\\&lt;br /&gt;
------a&lt;br /&gt;
\end{cases}&lt;br /&gt;
\xrightarrow[\text{排序}]{}&lt;br /&gt;
\begin{cases}&lt;br /&gt;
------$\\&lt;br /&gt;
------a\\&lt;br /&gt;
------a\\&lt;br /&gt;
------a\\&lt;br /&gt;
------b\\&lt;br /&gt;
------n\\&lt;br /&gt;
------n&lt;br /&gt;
\end{cases}&lt;br /&gt;
\xrightarrow[\text{还原矩阵}]{}&lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
$ &amp;amp; a\\&lt;br /&gt;
a &amp;amp; n\\&lt;br /&gt;
a &amp;amp; n\\&lt;br /&gt;
a &amp;amp; b\\&lt;br /&gt;
b &amp;amp; $\\&lt;br /&gt;
n &amp;amp; a\\&lt;br /&gt;
n &amp;amp; a&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
在这样的一个还原矩阵中，每一个字符对应的就是它最末尾的字符。解码的过程如下：&lt;br /&gt;
&lt;br /&gt;
* 从左边列的 ${\displaystyle S}$ 开始，找到对应的字符作为下一个字符 ${\displaystyle C_{n}}$&lt;br /&gt;
* 根据 ${\displaystyle C_{n}}$ 这个字符，在左边列找到对应的字符，其对应的字符即 ${\displaystyle C_{n-1}}$&lt;br /&gt;
* 以此类推，直到结尾&lt;br /&gt;
* 如果出现了多个相同的字符，那么就从上到下按顺序找就可以了&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
\color{red}{$} &amp;amp; \color{red}{a}\\&lt;br /&gt;
a &amp;amp; n\\&lt;br /&gt;
a &amp;amp; n\\&lt;br /&gt;
a &amp;amp; b\\&lt;br /&gt;
b &amp;amp; $\\&lt;br /&gt;
n &amp;amp; a\\&lt;br /&gt;
n &amp;amp; a&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
\xrightarrow[\text{\$a}]{}&lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
\color{gray}{$} &amp;amp; \color{gray}{a}\\&lt;br /&gt;
\color{red}{a} &amp;amp; \color{red}{n}\\&lt;br /&gt;
a &amp;amp; n\\&lt;br /&gt;
a &amp;amp; b\\&lt;br /&gt;
b &amp;amp; $\\&lt;br /&gt;
n &amp;amp; a\\&lt;br /&gt;
n &amp;amp; a&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
\xrightarrow[\text{\$an}]{}&lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
\color{gray}{$} &amp;amp; \color{gray}{a}\\&lt;br /&gt;
\color{gray}{a} &amp;amp; \color{gray}{n}\\&lt;br /&gt;
a &amp;amp; n\\&lt;br /&gt;
a &amp;amp; b\\&lt;br /&gt;
b &amp;amp; $\\&lt;br /&gt;
\color{red}{n} &amp;amp; \color{red}{a}\\&lt;br /&gt;
n &amp;amp; a&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
\xrightarrow[\text{\$ana}]{}&lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
\color{gray}{$} &amp;amp; \color{gray}{a}\\&lt;br /&gt;
\color{gray}{a} &amp;amp; \color{gray}{n}\\&lt;br /&gt;
\color{red}{a} &amp;amp; \color{red}{n}\\&lt;br /&gt;
a &amp;amp; b\\&lt;br /&gt;
b &amp;amp; $\\&lt;br /&gt;
\color{gray}{n} &amp;amp; \color{gray}{a}\\&lt;br /&gt;
n &amp;amp; a&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
\xrightarrow[\text{\$anan}]{}&lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
\color{gray}{$} &amp;amp; \color{gray}{a}\\&lt;br /&gt;
\color{gray}{a} &amp;amp; \color{gray}{n}\\&lt;br /&gt;
\color{gray}{a} &amp;amp; \color{gray}{n}\\&lt;br /&gt;
a &amp;amp; b\\&lt;br /&gt;
b &amp;amp; $\\&lt;br /&gt;
\color{gray}{n} &amp;amp; \color{gray}{a}\\&lt;br /&gt;
\color{red}{n} &amp;amp; \color{red}{a}\\&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
\xrightarrow[\text{\$anana}]{}&lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
\color{gray}{$} &amp;amp; \color{gray}{a}\\&lt;br /&gt;
\color{gray}{a} &amp;amp; \color{gray}{n}\\&lt;br /&gt;
\color{gray}{a} &amp;amp; \color{gray}{n}\\&lt;br /&gt;
\color{red}{a} &amp;amp; \color{red}{b}\\&lt;br /&gt;
b &amp;amp; $\\&lt;br /&gt;
\color{gray}{n} &amp;amp; \color{gray}{a}\\&lt;br /&gt;
\color{gray}{n} &amp;amp; \color{gray}{a}\\&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
\xrightarrow[\text{\$ananab}]{}&lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
\color{gray}{$} &amp;amp; \color{gray}{a}\\&lt;br /&gt;
\color{gray}{a} &amp;amp; \color{gray}{n}\\&lt;br /&gt;
\color{gray}{a} &amp;amp; \color{gray}{n}\\&lt;br /&gt;
\color{gray}{a} &amp;amp; \color{gray}{b}\\&lt;br /&gt;
\color{red}{b} &amp;amp; \color{red}{$}\\&lt;br /&gt;
\color{gray}{n} &amp;amp; \color{gray}{a}\\&lt;br /&gt;
\color{gray}{n} &amp;amp; \color{gray}{a}\\&lt;br /&gt;
\end{pmatrix}\\&lt;br /&gt;
S^{&amp;#039;} = \$ananab\\&lt;br /&gt;
S = reverse(S^{&amp;#039;}) \\= banana\$&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
=== 变种===&lt;br /&gt;
另一种方式可能更清晰，但实质上是一回事，只是做法看着不一样。在上述构建还原矩阵的过程中，我们实际已知的是最后一列的数据，那么，如果我们想办法把其他的列都构建出来，就可以得到原来的字符串了。&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{cases}&lt;br /&gt;
------a\\&lt;br /&gt;
------n\\&lt;br /&gt;
------n\\&lt;br /&gt;
------b\\&lt;br /&gt;
------$\\&lt;br /&gt;
------a\\&lt;br /&gt;
------a&lt;br /&gt;
\end{cases}&lt;br /&gt;
\xrightarrow[\text{想办法变成这样}]{}&lt;br /&gt;
\begin{cases}&lt;br /&gt;
S_{6} = \color{green}{$}banan\color{red}{a}\\&lt;br /&gt;
S_{5} = \color{green}{a}$bana\color{red}{n}\\&lt;br /&gt;
S_{3} = \color{green}{a}na$ba\color{red}{n}\\&lt;br /&gt;
S_{1} = \color{green}{a}nana$\color{red}{b}\\&lt;br /&gt;
S_{0} = \color{green}{b}anana\color{red}{$}\\&lt;br /&gt;
S_{4} = \color{green}{n}a$ban\color{red}{a}\\&lt;br /&gt;
S_{2} = \color{green}{n}ana$b\color{red}{a}&lt;br /&gt;
\end{cases}&lt;br /&gt;
\xrightarrow[\text{然后拿到S6就可以了}]{}&lt;br /&gt;
S_{6} = \color{green}{$}banan\color{red}{a}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
过程是这样的：&lt;br /&gt;
$$&lt;br /&gt;
\begin{cases}&lt;br /&gt;
------a\\&lt;br /&gt;
------n\\&lt;br /&gt;
------n\\&lt;br /&gt;
------b\\&lt;br /&gt;
------$\\&lt;br /&gt;
------a\\&lt;br /&gt;
------a&lt;br /&gt;
\end{cases}&lt;br /&gt;
\xrightarrow[\text{将最后一列排序，作为第一列}]{}&lt;br /&gt;
\begin{cases}&lt;br /&gt;
$-----a\\&lt;br /&gt;
a-----n\\&lt;br /&gt;
a-----n\\&lt;br /&gt;
a-----b\\&lt;br /&gt;
b-----$\\&lt;br /&gt;
n-----a\\&lt;br /&gt;
n-----a&lt;br /&gt;
\end{cases}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
得到这个之后，从又到左得到`a$,na,na,ba,$b, an, an`，再将其排序作为第二列, 以此类推：&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
\begin{cases}&lt;br /&gt;
------a\\&lt;br /&gt;
------n\\&lt;br /&gt;
------n\\&lt;br /&gt;
------b\\&lt;br /&gt;
------$\\&lt;br /&gt;
------a\\&lt;br /&gt;
------a&lt;br /&gt;
\end{cases}&lt;br /&gt;
\rightarrow&lt;br /&gt;
\begin{cases}&lt;br /&gt;
$-----a\\&lt;br /&gt;
a-----n\\&lt;br /&gt;
a-----n\\&lt;br /&gt;
a-----b\\&lt;br /&gt;
b-----$\\&lt;br /&gt;
n-----a\\&lt;br /&gt;
n-----a&lt;br /&gt;
\end{cases}&lt;br /&gt;
\rightarrow&lt;br /&gt;
\begin{cases}&lt;br /&gt;
a$\\&lt;br /&gt;
na\\&lt;br /&gt;
na\\&lt;br /&gt;
ba\\&lt;br /&gt;
$b\\&lt;br /&gt;
an\\&lt;br /&gt;
an&lt;br /&gt;
\end{cases}&lt;br /&gt;
\xrightarrow[\text{排序}]{}&lt;br /&gt;
\begin{cases}&lt;br /&gt;
$\color{green}{b}\\&lt;br /&gt;
a\color{green}{$}\\&lt;br /&gt;
a\color{green}{n}\\&lt;br /&gt;
a\color{green}{n}\\&lt;br /&gt;
n\color{green}{a}\\&lt;br /&gt;
n\color{green}{a}\\&lt;br /&gt;
b\color{green}{a}&lt;br /&gt;
\end{cases}&lt;br /&gt;
\xrightarrow[\text{得到第三列}]{}&lt;br /&gt;
\begin{cases}&lt;br /&gt;
$b----a\\&lt;br /&gt;
a$----n\\&lt;br /&gt;
an----n\\&lt;br /&gt;
an----b\\&lt;br /&gt;
ba----$\\&lt;br /&gt;
na----a\\&lt;br /&gt;
na----a&lt;br /&gt;
\end{cases}\\&lt;br /&gt;
\rightarrow&lt;br /&gt;
\begin{cases}&lt;br /&gt;
a$b\\&lt;br /&gt;
na$\\&lt;br /&gt;
nan\\&lt;br /&gt;
ban\\&lt;br /&gt;
$ba\\&lt;br /&gt;
ana\\&lt;br /&gt;
ana&lt;br /&gt;
\end{cases}&lt;br /&gt;
\rightarrow&lt;br /&gt;
\begin{cases}&lt;br /&gt;
$b\color{green}{a}\\&lt;br /&gt;
a$\color{green}{b}\\&lt;br /&gt;
an\color{green}{a}\\&lt;br /&gt;
an\color{green}{a}\\&lt;br /&gt;
ba\color{green}{n}\\&lt;br /&gt;
na\color{green}{$}\\&lt;br /&gt;
na\color{green}{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
\xrightarrow[\text{得到第三列}]{}&lt;br /&gt;
\begin{cases}&lt;br /&gt;
$ba---a\\&lt;br /&gt;
a$b---n\\&lt;br /&gt;
ana---n\\&lt;br /&gt;
ana---b\\&lt;br /&gt;
ban---$\\&lt;br /&gt;
na$---a\\&lt;br /&gt;
nan---a&lt;br /&gt;
\end{cases}&lt;br /&gt;
\xrightarrow[\text{如此反复，最终得到全部列}]{}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
= 代码实现=&lt;br /&gt;
看似复杂的操作，没想到用python可以写的如此简单，不过不见得一看就懂...&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
EOL = &amp;#039;$&amp;#039;&lt;br /&gt;
&lt;br /&gt;
def encode(source):&lt;br /&gt;
    source = source + EOL&lt;br /&gt;
    table = [source[i:] + source[:i] for i in range(len(source))]&lt;br /&gt;
    table.sort()&lt;br /&gt;
&lt;br /&gt;
    return &amp;#039;&amp;#039;.join([row[-1] for row in table])&lt;br /&gt;
&lt;br /&gt;
def decode(encoded):&lt;br /&gt;
    length = len(encoded)&lt;br /&gt;
    table = [&amp;#039;&amp;#039;] * length&lt;br /&gt;
&lt;br /&gt;
    for i in range(length):&lt;br /&gt;
        table = sorted([encoded[m] + table[m] for m in range(length)])&lt;br /&gt;
        print(table)&lt;br /&gt;
    s = [row for row in table if row.endswith(EOL)][0]&lt;br /&gt;
    return s.rstrip(EOL)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解码的这个循环不大好理解，打出来一看就懂了：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&amp;#039;$&amp;#039;, &amp;#039;a&amp;#039;, &amp;#039;a&amp;#039;, &amp;#039;a&amp;#039;, &amp;#039;b&amp;#039;, &amp;#039;n&amp;#039;, &amp;#039;n&amp;#039;]&lt;br /&gt;
[&amp;#039;$b&amp;#039;, &amp;#039;a$&amp;#039;, &amp;#039;an&amp;#039;, &amp;#039;an&amp;#039;, &amp;#039;ba&amp;#039;, &amp;#039;na&amp;#039;, &amp;#039;na&amp;#039;]&lt;br /&gt;
[&amp;#039;$ba&amp;#039;, &amp;#039;a$b&amp;#039;, &amp;#039;ana&amp;#039;, &amp;#039;ana&amp;#039;, &amp;#039;ban&amp;#039;, &amp;#039;na$&amp;#039;, &amp;#039;nan&amp;#039;]&lt;br /&gt;
[&amp;#039;$ban&amp;#039;, &amp;#039;a$ba&amp;#039;, &amp;#039;ana$&amp;#039;, &amp;#039;anan&amp;#039;, &amp;#039;bana&amp;#039;, &amp;#039;na$b&amp;#039;, &amp;#039;nana&amp;#039;]&lt;br /&gt;
[&amp;#039;$bana&amp;#039;, &amp;#039;a$ban&amp;#039;, &amp;#039;ana$b&amp;#039;, &amp;#039;anana&amp;#039;, &amp;#039;banan&amp;#039;, &amp;#039;na$ba&amp;#039;, &amp;#039;nana$&amp;#039;]&lt;br /&gt;
[&amp;#039;$banan&amp;#039;, &amp;#039;a$bana&amp;#039;, &amp;#039;ana$ba&amp;#039;, &amp;#039;anana$&amp;#039;, &amp;#039;banana&amp;#039;, &amp;#039;na$ban&amp;#039;, &amp;#039;nana$b&amp;#039;]&lt;br /&gt;
[&amp;#039;$banana&amp;#039;, &amp;#039;a$banan&amp;#039;, &amp;#039;ana$ban&amp;#039;, &amp;#039;anana$b&amp;#039;, &amp;#039;banana$&amp;#039;, &amp;#039;na$bana&amp;#039;, &amp;#039;nana$ba&amp;#039;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [https://zh.wikipedia.org/wiki/Burrows-Wheeler%E5%8F%98%E6%8D%A2 维基百科-Burrows-Wheeler变换]&lt;br /&gt;
* [https://www.cs.cmu.edu/~ckingsf/bioinfo-lectures/bwt.pdf BWT]&lt;/div&gt;</summary>
		<author><name>imported&gt;Riguz</name></author>
	</entry>
</feed>