2013-08-06 19 views
0

通過輸入段和輸出是清楚嘗試字謎檢查器,但內存限制超過該我試圖減少內存使用在下面字謎程序 - C#

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個小時的陽光。丹在他的頭上戴了一根皮帶,以表明自己是領導者,他想知道在他前面躺着什麼樣的陷阱。

輸出:

部分帶陷阱
丹和

+2

在你的主循環使用'StringBuilder' ..你變化無常的字符串變量所有的時間與不同的結果。這導致很多創建的字符串數據。使用'StringBuilder'來停止這個。 –

回答

2

幾點我注意到:

  • 不必加載整個文件到內存中,讀它字處理通過字。這可能會讓事情變得更加複雜,但它會減少大文件的內存。這並不是說你所提供的文字很重要。
  • 而不是積累結果輸出(在一個),只是保存字典本身,可能在列表中的單詞,並在整個文件中運行後輸出它。
  • 嘗試使用Radix Tree而不是使用字典。

我覺得我的第二點在這裏是最重要的你的情況。如果你有更多更大的文件和更多不同的單詞,但是第一和第三點會很重要,但是最小的「點擊」是相同的字母。

0

儘量減少字符串操作,特別是沒有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);