BWT实现使用列表c#

时间:2014-06-15 05:39:19

标签: c#

我试图通过读取文件字节(字节数组而不是字符串)来实现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}}

1 个答案:

答案 0 :(得分:1)

这并不奇怪,因为实际上你的数据实际上比文件中的数据更多 - 整个文件复制(并移位)文件中的每个字节。

Burrows–Wheeler transform你不需要这个。您可以使用它开始的索引表示每个旋转,保留原始文件和仅“权重”4倍的文件(文件中每个字节一个int),文件中每个字节总共5个字节(对于几乎每个文件,都比文件的副本小得多。)

这可以比使用后缀数组创建索引和天真排序更快。