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

时间:2013-05-03 17:52:33

标签: algorithm burrows-wheeler-transform

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

输入:

stackoverflow

BWT输出:

wtavrcfkle$soo

后缀数组:

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

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您只需传输BWT输出。

关于这种转换的惊人之处在于原始字符串只能从置换的输出字符串重建。

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

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

转换的好处在于,它往往产生长长的相似字符(如果源材料中有结构),因此运行长度编码效果很好。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

后缀数组只需要计算bwt变换,变换完成后就可以丢弃了。

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

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

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

答案 4 :(得分:0)

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