在不知道最后一个字符的情况下反转 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的主要内容,如果未能解决你的问题,请参考以下文章

在不使用反向函数的情况下反转给定的字符串[关闭]

c_cpp 在不影响特殊字符的情况下反转字符串

在不使用javascript中的内置函数的情况下逐字反转字符串

Burrows Wheeler 变换 (BWT) 算法的旋转字符串排序

java - 在不知道模式的情况下从字符串中提取当前日期模式

在不知道 JSON 格式的情况下用 Java 解析 JSON