在不知道最后一个字符的情况下反转 BWT
Posted
技术标签:
【中文标题】在不知道最后一个字符的情况下反转 BWT【英文标题】:Reverse BWT without knowing last character 【发布时间】:2016-04-22 16:04:29 【问题描述】:通常在 Burrows-Wheeler 变换算法中,一个 $ 字符用于表示字符串的结束,但在很多情况下,这个 $ 被省略了。
我想知道如何在不知道最后一个字符位置的情况下反转它?
例如,我有这个 BWT:
[[[[[1[[11endgnad1234245ndbnbbb]]]]]]]nnnngnabbbdiaaaaaaii
按照该算法,我可以轻松构建 BWT 矩阵的第一列,我选择以如下压缩方式表示:
Character : Occurrences
1 : 4
2 : 2
3 : 1
4 : 2
5 : 1
[ : 7
] : 7
a : 7
b : 7
d : 4
e : 1
g : 2
i : 4
n : 9
在不知道原始字符串中的最后一个字符的情况下,我无法看到如何重建原始字符串。
非常感谢任何帮助。 唐
P/S:如果您想知道原始字符串是什么:
[1]ban[2]banana[3]band[4]bandage[12]bin[14]bind[15]绑定
【问题讨论】:
【参考方案1】:你不能(但你可以试试 ;-)。 您的第一个 bwt 符号是原始字符串“S”中的最后一个。 现在您应该通过 LF 映射向后展开原始字符串。 实际上是 bin[sym] + rank(sym, i) + 1,从 i = 0 开始。 您可以轻松地从事件中获取 bin[] 数组。 问题是一旦你的 'i' 更大然后省略 '$' 你不应该添加最后一个 '1' 所以你打破了字符串并且事情变得讨厌。 如果您还重建 sa[] 并覆盖已设置的索引,则可以检测到错误。因此,您可以将任意 $ 位置设置为 '0' 并尝试恢复,然后如果失败将其设置为 1... 直到您正确重建。不知道能不能优化一下。
干杯,
D.
【讨论】:
以上是关于在不知道最后一个字符的情况下反转 BWT的主要内容,如果未能解决你的问题,请参考以下文章
在不使用javascript中的内置函数的情况下逐字反转字符串
Burrows Wheeler 变换 (BWT) 算法的旋转字符串排序