Burrows-Wheeler 变换 (BWT) - 存储数据

Posted

技术标签:

【中文标题】Burrows-Wheeler 变换 (BWT) - 存储数据【英文标题】:Burrows-Wheeler Transform (BWT) - Stored Data 【发布时间】:2013-05-03 17:52:32 【问题描述】:

使用 BWT 后,我们在编码数据中需要哪组数据?我们需要编码(或导出)后缀数组吗?

输入:

***

BWT 输出:

wtavrcfkle$soo

后缀数组:

13, 2, 3, 7, 9, 4, 10, 5, 11, 8, 0, 1, 6, 12

【问题讨论】:

【参考方案1】:

后缀数组只需要计算bwt变换,变换完成后可以去掉。

BWT("***")="wtavrcfkle$soo"

UNBWT("wtavrcfkle$soo")="***"

如果您愿意,也可以从转换后的输出中恢复后缀数组:)

【讨论】:

【参考方案2】:

您需要反转转换的是输出字符串(在您的示例中为wtavrcfkle$soo)。

【讨论】:

【参考方案3】:

您只需要传输 BWT 输出。

这种转换令人惊讶的是,原始字符串可以仅从置换后的输出字符串中重构出来。

wikipedia article 包含执行此反向操作的示例代码。

请注意,正常的操作模式是在传输之前使用游程编码对 BWT 输出进行编码(或者您没有实现任何压缩)。

转换的好处是它倾向于产生类似字符的长时间运行(如果源材料中有结构),因此运行长度编码效果很好。

【讨论】:

【参考方案4】:

要反转 BWT,您只需要原始最后一个字符的索引,而不是整个后缀数组。如果您没有此索引,我相信选择任意索引会导致原始字符串的旋转版本。

请注意,如果您包含行尾代码(如您的示例中),则原始最后一个字符很明显,因此不需要单独提供索引...

【讨论】:

【参考方案5】:

需要明确的是,后缀数组和 BWT 输出是一回事。如果您查看示例中的后缀数组,它包含从 BWT 输入(从 1 开始)获取的 BWT 输出中字母的索引:13 -> w、2 -> t、3 -> a 等。 .. 使用后缀数组只是一种以线性时间计算 BWT 输出的机制。传输后缀数组或BWT输出意味着传输相同的信息。

【讨论】:

以上是关于Burrows-Wheeler 变换 (BWT) - 存储数据的主要内容,如果未能解决你的问题,请参考以下文章

哪种算法最适合 Burrows-Wheeler 变换?

在不知道最后一个字符的情况下反转 BWT

BWA/BWT 比对软件

Burrows Wheeler 变换 (BWT) 算法的旋转字符串排序

Burrows-Wheeler 压缩

比对算法总结(二)——基于BWT索引结构的比对算法-Bowite1