Algorithm Burrows-Wheeler变换(BWT)算法的旋转串排序

Algorithm Burrows-Wheeler变换(BWT)算法的旋转串排序,algorithm,Algorithm,我目前正与BWT合作以获得乐趣。:-) 我已经学习了BWT,我认为BWT在理论上并不复杂。但是,直到现在我还不知道如何在实际实现中对旋转字符串进行排序 我是否应该先将所有旋转的字符串保存到一个数组中,以便使用简单的排序算法(如冒泡排序、选择或其他)对它们进行排序?有人告诉我这是一种糟糕的做法,因为将N个元素保存到一个数组中需要更多的时间 那么,在旋转字符串时,如何对旋转的字符串进行排序 任何能回答这个问题的人都将不胜感激 提前谢谢你 Thompson不是一个很好的答案,但是当我为客户机实现BWT

我目前正与BWT合作以获得乐趣。:-)

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

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

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

任何能回答这个问题的人都将不胜感激

提前谢谢你


Thompson不是一个很好的答案,但是当我为客户机实现BWT算法时,我使用了作为基础的代码

历史注释中,出现的C q排序比C++ STD::排序算法快很多。CodeGuru上有人建议使用std::stable_排序,这将性能提升到了Cqsort的水平。这是在VC6中


还要运行测试以找到字符串的理想长度-排序不是线性的。我正在为一个传输协议编写一个压缩例程,所以压缩必须足以支付自己的费用。如果内存对我来说合适的话,它在733MHz的机器上工作大约4kb。

BWT是一个非常容易实现的方法,但它的缺点是随着要压缩的数据越来越大,它会变得越来越慢

我对这个算法做了一点快速分析,结果是(如果我错了,请纠正我),最坏的情况下需要O(n^2),但在最好的情况下可以实现恒定时间

事实证明,BWT花费的时间最多的是对旋转的字符串进行排序。对于那些喜欢玩算法的人来说,现在改进排序似乎是一个热点问题。:-)

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

香蕉$ANANA$bnana$baana$banna$BANA$BANAN$香蕉

旋转字符串:$香蕉

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

我已经发布了一篇关于这个算法的拙劣文章


现代后缀数组构造(和BWT)算法(如SA-IS)在线性时间内运行,额外空间非常小: