0

段落を入力してアナグラムチェッカーを試して出力するとクリアですが、メモリ制限が指定された制限を超えています

これは私が試したコードです

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();
    }
}

プロファイラーで確認すると、文字列関数は多くのメモリと他の辞書も必要とするため、上記のコードを最小のメモリに最適化するにはどうすればよいですか、または使用しているコードや宣言は不要ですか?

入力:

世界の一部では、夏の間、24 時間近く日光があります。ダンは自分がリーダーであることを示すために頭にストラップを巻いており、彼の前にどんな種類の罠があるのか​​ 疑問に思っていました。

出力:

パーツ ストラップ トラップ
だんと

4

2 に答える 2

2

私が気づいたいくつかの点:

  • ファイル全体をメモリにロードする代わりに、単語ごとに読み取ります。より複雑になるかもしれませんが、大きなファイルのメモリを減らします。あなたが提供したテキストの例は重要ではありません。
  • 結果出力を(aに)蓄積する代わりに、単語を辞書自体、おそらくリストに保存し、ファイル全体を実行した後に出力します。
  • 辞書を使用する代わりに基数ツリーを使用してみてください。

ここでの私の2番目のポイントは、あなたの場合に最も重要だと思います. 1 番目と 3 番目のポイントは、より多くの異なる単語を含むはるかに大きなファイルがあり、等しいアナグラムの「ヒット」が最小限である場合に重要になります。

于 2013-08-06T05:32:48.103 に答える