C++ 在不知道最后一个字符的情况下反转BWT
在Burrows-Wheeler变换算法中,通常使用$字符作为字符串结尾的信号,但在许多情况下,忽略了$ 我想知道,在不知道最后一个字符的位置的情况下,它是如何反转的 例如,我有一个BWT: [1[[11endgnad1234245ndbnbb][3][3][4]nnnngnabdiaaaaii 按照该算法,我可以很容易地构造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
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