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

Posted

技术标签:

【中文标题】Burrows Wheeler 变换 (BWT) 算法的旋转字符串排序【英文标题】:Sorting Rotated Strings of Burrows Wheeler Transform (BWT) Algorithm 【发布时间】:2010-11-10 11:15:15 【问题描述】:

我目前与 BWT 合作是为了好玩。 :-)

我学过 BWT,我认为 BWT 理论上并不复杂。但是,直到现在我还不知道如何在实际实现中对旋转的字符串进行排序。

我是否应该首先将所有旋转的字符串保存到一个数组中,以便我可以使用诸如冒泡排序、选择或其他简单排序算法对它们进行排序?有人告诉我这是不好的做法,因为将 N 个元素保存到数组中需要更多次。

那么,如何在旋转字符串时对旋转的字符串进行排序?

谁能回答这个问题,将不胜感激!

提前致谢!

汤普森

【问题讨论】:

【参考方案1】:

不是一个完整的答案,但是当我为客户端实现 BWT 算法时,我使用了 here 提供的代码作为基础。

一项历史记录,似乎 C qsort 比 C++ std::sort 算法快得多。 CodeGuru 上有人建议使用 std::stable_sort ,这将性能提升到了 C qsort 的水平。这是在 VC6 中。

还运行测试以找到理想的字符串长度 - 排序不是线性的。我正在为传输协议编写压缩例程,因此压缩必须足以收回成本。如果我没记错的话,在 733MHz 的机器上工作大约 4kb。

【讨论】:

【参考方案2】:

BWT 很容易实现,但它的弱点是随着要压缩的数据变大而变慢。

我已经对该算法进行了快速分析,结果是(如果我错了,请纠正我)在最坏的情况下它需要 O(n^2),但在最好的情况下可以达到恒定的时间.

事实证明,BWT 的大部分消耗时间是在对旋转后的字符串进行排序时。对于那些喜欢玩算法的人来说,现在改进排序似乎是一个热门问题。 :-)

好的,当您使用 BWT 对数据进行编码时,您应该做的第一件事是在数据中放置一个唯一字符。它用于告诉编码器在找到该字符时终止排序过程。例如:说要压缩字符串“BANANA”,步骤:

香蕉$ ANA$B NANA$BA ANA$BAN NA$BANA A$BANAN $BANANA

旋转字符串:$BANANA

使用“$BANANA”之类的唯一字符 (EOF) 对字符串进行排序会比不使用任何唯一字符更快。

我已经发布了一篇关于这个算法的糟糕文章......

http://philipstel.wordpress.com/2010/02/10/discussion-of-burrows-wheeler-transform-algorithm/

【讨论】:

现代后缀数组构造(和 BWT)算法(如 SA-IS)以线性时间运行,几乎没有额外空间:code.google.com/p/ge-nong

以上是关于Burrows Wheeler 变换 (BWT) 算法的旋转字符串排序的主要内容,如果未能解决你的问题,请参考以下文章

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

哪种算法最适合 Burrows-Wheeler 变换?

BWT (Burrows–Wheeler_transform)数据转换算法

Burrows Wheeler 变换 - 变换向量

Burrows-Wheeler 压缩

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