我试图通过读取文件字节(字节数组而不是字符串)来实现bwt,但是我在使用内存时遇到了问题:
List<List<byte>> shifts = new List<List<byte>>();
List<byte> shift = new List<byte>();
shift.AddRange(content);
int shiftby = 0;
while (shiftby < content.Count)
{
for (int i = content.Count - shiftby; i < content.Count; i++)
shift.Add(content[i]);
for (int i = 0; i < content.Count - shiftby; i++)
{
shift.Add(content[i]);
}
List<byte> clone = new List<byte>();
//shift.ForEach((item) => clone.Add(item));
clone.AddRange(shift);
shifts.Add(clone);
shift.Clear();
shiftby++;
}
它在小尺寸上工作正常 - 文件(1-20Kb)但是当涉及到500(或接近)时我的电脑被冻结并且所有8gb操作都被使用,我知道什么是全部因为使用&#34;克隆&#34; -list,但它只是将内存中的链接保持在&#34; shift&#34;列表,当我改变&#34; shift&#34; - 我改变了我所保留的一切&#34; shift&#34;。所以我需要你的建议和意见, 附:抱歉我的英语 p.s.这里你可以看到循环移位算法(就像你有字符串123,它将保持下一个字符串在&#34;移位&#34; {{123},{312},{231}}
答案 0 :(得分:1)
这并不奇怪,因为实际上你的数据实际上比文件中的数据更多 - 整个文件复制(并移位)文件中的每个字节。
Burrows–Wheeler transform你不需要这个。您可以使用它开始的索引表示每个旋转,保留原始文件和仅“权重”4倍的文件(文件中每个字节一个int),文件中每个字节总共5个字节(对于几乎每个文件,都比文件的副本小得多。)
这可以比使用后缀数组创建索引和天真排序更快。