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

C++ 在不知道最后一个字符的情况下反转BWT,c++,burrows-wheeler-transform,C++,Burrows Wheeler Transform,在Burrows-Wheeler变换算法中,通常使用$字符作为字符串结尾的信号,但在许多情况下,忽略了$ 我想知道,在不知道最后一个字符的位置的情况下,它是如何反转的 例如,我有一个BWT: [1[[11endgnad1234245ndbnbb][3][3][4]nnnngnabdiaaaaii 按照该算法,我可以很容易地构造BWT矩阵的第一列,我选择以压缩方式表示,如下所示: Character : Occurrences 1 : 4 2 : 2 3

在Burrows-Wheeler变换算法中,通常使用$字符作为字符串结尾的信号,但在许多情况下,忽略了$

我想知道,在不知道最后一个字符的位置的情况下,它是如何反转的

例如,我有一个BWT:

[1[[11endgnad1234245ndbnbb][3][3][4]nnnngnabdiaaaaii

按照该算法,我可以很容易地构造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] 禁止[2]香蕉[3]带[4]绷带[12]箱[14]捆扎[15]捆扎

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

干杯

D