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) - 存储数据的主要内容,如果未能解决你的问题,请参考以下文章