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) 算法的旋转字符串排序