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

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

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

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

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

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

提前致谢!

汤普森

【问题讨论】:

    标签: algorithm


    【解决方案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
      猜你喜欢
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 2013-06-20
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多