繁体   English   中英

减少下面的anagram程序中的内存使用量 - C#

[英]Reduce memory usage in the below anagram program - C#

通过输入段落和输出来尝试Anagram检查器是明确的,但内存限制超出了指定的范围

这是我试过的代码

using System;

class Program
{
    static void Main(string[] args)
    {

        string[] arr = (Punct(Console.ReadLine()).ToLower()).Split(' ');
        string a = string.Empty;
        System.Collections.Generic.Dictionary<string, string> dn = new System.Collections.Generic.Dictionary<string, string>(); // *2
        foreach (string s in arr)
        {
            string st = sort(s);
            if (dn.ContainsKey(st))
            {
                if (dn[st] != s)
                {
                    if (a.Contains(dn[st]))
                        a = a.Replace(dn[st], dn[st] + " " + s); // *1
                    else
                        a = a + dn[st] + " " + s + "\n";
                    dn[st] = s;
                }
            }
            else
                dn.Add(st, s);
        }
        Console.Write(a);
    }

    public static string sort(string s)
    {
        char[] chars = s.ToCharArray();
        Array.Sort(chars);
        return new string(chars);
    }

    public static string Punct(string s)
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();
        foreach (char c in s)
        {
            if (!char.IsPunctuation(c))
                sb.Append(c);
        }
        return sb.ToString();
    }
}

在使用分析器检查时,String函数也占用了大量内存和其他字典,因此,我的问题是如何将上述代码优化到最少内存,或者我使用的任何代码或声明是不必要的?

输入:

夏季,世界各地都有近24小时的阳光照射。 Dan头上有一条带子,以表明自己是领导者,他想知道他前面有什么样的陷阱。

输出:

零件表带陷阱
丹和

我注意到几点:

  • 而不是将整个文件加载到内存中,而是逐字读取。 它可能会使事情变得更复杂,但它会减少大文件的内存。 并不重要,例如您提供的文字。
  • 而不是累积结果输出(在a中),只需将单词保存在字典本身中,可能在列表中,并在运行整个文件后输出。
  • 尝试使用Radix Tree而不是使用字典。

我认为我的第二点在你的情况下是最重要的。 如果你有更大的文件,有更多不同的单词,但是相同的字谜最小的“命中率”,第一点和第三点都很重要。

尝试最小化String操作,尤其是没有StringBuilder的连接。 另外,只需使用C#LINQ技术:

string input = Console.ReadLine();
string[] words = (Punct(input).ToLower()).Split(' ');

var anagramStrings = words
    .Distinct()
    .GroupBy(sort)
    .Where(anagrams => anagrams.Count() > 1)
    .Select(anagrams => String.Join(" ", anagrams));

string output = String.Join("\n", anagramStrings);

Console.Write(output);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM