用于大弦的 Burrow Wheeler 实现

Posted

技术标签:

【中文标题】用于大弦的 Burrow Wheeler 实现【英文标题】:Burrow wheeler implementation for large strings 【发布时间】:2012-12-07 04:46:39 【问题描述】:

我尝试在 burrow Wheelers 循环字符串数组中旋转一个非常大的字符串。

但是我的输入大约是 200000 个字符,当输入这么大时,由于堆空间不足,我无法运行代码。

我的教授说实现它的唯一方法是线性内存占用。我不知道这是什么意思。

我能知道还有什么其他方法可以创建一个循环字符串,它是内存高效的,并且可以在不耗尽内存的情况下使用它

【问题讨论】:

当字符串太大时,您可以: 1. 在外部执行操作(将移位存储到文件中并在内存中读取块)。这涉及相当混乱的 I/O。 2.如果你是Java/C#,可以增加堆空间,默认不是很多。 【参考方案1】:

减少内存使用的技巧是创建一个循环后缀数组,在平均情况下,可以在与n lg n 成正比的时间(并且内存与n 成正比)使用考虑每个字符的快速排序变体来完成单独在字符串中(又名 3 路字符串快速排序;它在概念上类似于基数排序)。

即使占用太多内存,您也需要限制 burrows-wheeler 变换以对固定大小的块进行操作(对 X 个字符执行编码,然后是下一个 X 个字符,等等,直到您对整个字符串进行编码,反转解码过程)。

【讨论】:

以上是关于用于大弦的 Burrow Wheeler 实现的主要内容,如果未能解决你的问题,请参考以下文章

Burrows-Wheeler 压缩

Burrows-Wheeler 变换 (BWT) 重复字符串

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

如何推迟/推迟 f 弦的评估?

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

David Wheeler 格言中的“间接程度”是啥意思?