用于大弦的 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 变换 (BWT) 重复字符串