【问题标题】:Reduce memory usage in the below anagram program - C#减少以下 anagram 程序中的内存使用量 - C#
【发布时间】:2013-08-06 15:13:33
【问题描述】:

通过输入段落尝试Anagram checker,输出清晰,但内存限制超过指定

这是我尝试过的代码

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 小时。 丹的头上戴着一条带子,以表明自己是领导者,他 想知道他面前有什么样的陷阱。

输出:

零件带陷阱
丹和

【问题讨论】:

  • 在你的主循环中使用StringBuilder ..你一直在用可变结果切割和更改字符串变量..这会导致创建大量字符串数据。使用StringBuilder 来阻止它。

标签: c# .net string optimization


【解决方案1】:

我注意到的几点:

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

我认为我的第二点对你来说是最重要的。如果您有更多不同单词的更大文件,但相同字谜的“命中”最少,那么第 1 点和第 3 点将很重要。

【讨论】:

    【解决方案2】:

    尽量减少字符串操作,尤其是没有 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 2010-09-28
      相关资源
      最近更新 更多