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

Reverse BWT without knowing last character

通常在Burrows-Wheeler Transform算法中,$字符用于表示字符串结束,但在很多情况下,这个$被省略了。

不知道最后一个字符的位置如何反转?

例如,我有这个 BWT:

[[[[[1[[11endgnad1234245ndbnbbb]]]]]]]nnnngnabbbdiaaaiaaii

按照该算法,我可以轻松构建 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]binding

你不能(但你可以试试 ;-)。 您的第一个 bwt 符号是原始字符串中的最后一个 'S'。 现在您应该通过 LF 映射向后展开原始字符串。 它实际上是 bin[sym] + rank(sym, i) + 1,你从 i = 0 开始。 您可以轻松地从事件中获取 bin[] 数组。 问题是,一旦你的 'i' 更大然后省略了 '$' 你不应该添加最后一个 '1' 这样你就破坏了字符串并且事情变得讨厌。 如果您还重建 sa[] 并覆盖已设置的索引,则可以检测到错误。因此,您可以将任意 $ position 设置为“0”并尝试恢复,如果失败则将其设置为 1...直到您正确重建。不知道这个能不能优化。

干杯,

D.