我需要在线性时间内执行着名的Burrows-Wheeler变换。我找到了一个带后缀排序和EOF字符的解决方案,但附加EOF会改变转换。例如:考虑字符串bcababa
和两次旋转
abababc
ababcab
很明显,s1< S2。现在有了EOF字符:
现在s2< S1。由此产生的转变将是不同的。如何在没有EOF的情况下执行BWT?
答案 0 :(得分:4)
通过计算与自身连接的字符串的后缀数组,您可以在没有EOF字符的情况下在线性时间和空间中执行变换。然后迭代后缀数组。如果当前后缀数组值小于n
,则在输出数组中添加从后缀数组中当前值表示的位置开始的旋转的最后一个字符。然而,这种方法会产生略微不同的BWT变换结果,因为字符串旋转不像EOF字符那样被排序。
答案 1 :(得分:1)
你需要在字符串中使用EOF字符才能使BWT工作,否则你无法执行逆变换来获取原始字符串。没有EOF,字符串“ba”和“ab”都具有相同的变换版本(“ba”)。使用EOF,变换是不同的
ab ba
a b | a | b
b | a b a |
| a b | b a
即。 ab转换为“| ab”,ba转换为“b | a”。
BWT需要EOF,因为它标志着角色循环的开始点。
Re:根据维基百科的说法,没有EOF角色,
由于输入字符串的任何旋转都会导致相同 变换后的字符串,BWT不能在没有添加'EOF'的情况下倒置 输入标记或用信息增加输出 作为索引,可以从中识别输入字符串 所有轮换的等级。
有一个双向版本的变换,通过它 转换后的字符串唯一标识原始。在这个版本中, 每个字符串都有一个相同长度的唯一倒数。
通过首先将输入分解为来计算双射变换 一个不增加的Lyndon词序列;存在这样的因子分解 由Chen-Fox-Lyndon定理,可以在线性时间内找到。 然后,算法将所有这些旋转的所有旋转一起排序 话;就像通常的Burrows-Wheeler变换一样,这会产生一个 排序的n个字符串序列。然后获得变换后的字符串 通过选择这个排序中的每个字符串的最后一个字符 列表。
答案 2 :(得分:0)
我知道这个帖子很老但我遇到了同样的问题,并提出了以下解决方案: