反向BWT,不知道最后一个字符

时间:2016-04-22 16:04:30

标签: c++ burrows-wheeler-transform

通常在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]禁止[2]香蕉[3]频带[4]绷带[12]箱[14]结合[15]结合

1 个答案:

答案 0 :(得分:1)

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

干杯,

d