Оптимизировать программу на поиск одинаковых вхождений - C#

Узнай цену своей работы

Формулировка задачи:

Всем привет! Ребята, помогите пожалуйста ускорить быстродействие программы. Нужно найти Топ-50 повторяющихся слов из текста и выводить их на экран в отсортированном виде. Пока что мне удалось добраться до заполнения словаря, но к сожалению он сортируется по алфавиту, а надо по значению. Если добавить еще цикл, который получит и все Values словаря и отсортирует их, а потом еще раз foreach пройтись по ContainsValue() - это еще больше затормозит программу. Будьте добры подсказать более оптимальное решение задачи, очень буду рад увидеть альтернативные решения.
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections;
  4. using System.Text;
  5. using System.IO;
  6. using System.Text.RegularExpressions;
  7. using System.Linq;
  8. /*1. посчитать, сколько раз = каждое = слово встречается в заданном тексте.
  9. текст берётся из файла (например, это может быть текст романа "война и мир").
  10. перед подсчётами необходимо избавиться от знаков пунктуации в тексте!
  11. результаты сохранить в любую коллекцию, поддерживающую хранение ключей-значений.
  12. вывести на экран топ-100 наиболее часто встречающихся слов, длиной от 5 символов и более.
  13. Проверяем существует ли слово в массиве, если да, то подымаем счетчик.*/
  14. namespace dNET_17
  15. {
  16. class NotationFilter : StreamReader
  17. {
  18. string path;
  19. public StringBuilder newstr = new StringBuilder();
  20. Encoding encode;
  21. SortedDictionary<string, int> dic = new SortedDictionary<string, int>();
  22. List<string> keys = new List<string>();
  23. List<int> values = new List<int>();
  24. public NotationFilter(string _path, Encoding enc)
  25. : base(_path)
  26. {
  27. path = _path;
  28. encode = enc;
  29. }
  30. public static int GetOccurenceCount(string text, string search, StringComparison option = StringComparison.Ordinal)
  31. {
  32. // Console.WriteLine(String.Format("{0}", text));
  33. return Regex.Matches(String.Format("{0}", text), @"\b\w+\b").Cast<Match>().Select(x => x.Value).Count(x => x.Equals(search, option));
  34. }
  35. public void ShowText(string str)
  36. {
  37. for (int i = 0; i < str.Length; i++) // убираю знаки препинания
  38. {
  39. if (!(str[i] >= (char)33 && str[i] <= (char)47) && str[i] != ';' && str[i] != ':' && str[i] != '?')
  40. {
  41. newstr.Append(str[i]);// Console.Write(str[i]);
  42. }
  43. }
  44. string st = newstr.ToString().ToLower();
  45. // string[] star = newstr.ToString().Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
  46. // Создаю список с набором слов, при этом убираю все пробелы в тексте.
  47. List<string> list = new List<string>(st.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries));
  48. list.Sort();
  49.  
  50. foreach(string i in list)
  51. {
  52. if (!dic.ContainsKey(i))
  53. try
  54. {
  55. dic.Add(i, GetOccurenceCount(st, i));
  56. }
  57. catch
  58. { }
  59. }
  60. Console.WriteLine();
  61. }
  62. static void Main()
  63. {
  64. string path = ".\\x1.txt";
  65. DateTime time = DateTime.Now;
  66. NotationFilter not = new NotationFilter(path, Encoding.UTF8);
  67.  
  68. string text = not.ReadToEnd();
  69.  
  70. not.ShowText(text);
  71. Console.WriteLine("done!");
  72. // Console.WriteLine(not.newstr);
  73. Console.WriteLine(DateTime.Now - time);
  74. foreach (var entry in not.dic)
  75. {
  76. Console.WriteLine("[{0} : {1}]", entry.Key, entry.Value);
  77. }
  78. }
  79. }
  80. }

Решение задачи: «Оптимизировать программу на поиск одинаковых вхождений»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Text.RegularExpressions;
  7.  
  8. namespace ConsoleApplication202
  9. {
  10.     class Program
  11.     {
  12.         static void Main(string[] args)
  13.         {
  14.             var parser = new FileParser();
  15.             parser.Parse("c:\\1.txt");
  16.  
  17.             foreach (var wordFreq in parser.GetTopFrequency(5).Take(100))
  18.                 Console.WriteLine("{0}: {1}", wordFreq.Key, wordFreq.Value);
  19.  
  20.             Console.ReadKey();
  21.         }
  22.     }
  23.  
  24.     class FileParser
  25.     {
  26.         private Dictionary<string, int> wordFrequency = new Dictionary<string, int>();
  27.  
  28.         public void Parse(string fileName)
  29.         {
  30.             foreach(var line in File.ReadLines(fileName))
  31.             foreach(Match m in Regex.Matches(line, @"\w+"))
  32.             {
  33.                 var word = m.Value.ToLower();
  34.                 var counter = 0;
  35.                 wordFrequency.TryGetValue(word, out counter);
  36.                 counter++;
  37.                 wordFrequency[word] = counter;
  38.             }
  39.         }
  40.  
  41.         public IEnumerable<KeyValuePair<string, int>> GetTopFrequency(int minLength)
  42.         {
  43.             return wordFrequency.Where(pair => pair.Key.Length >= minLength).OrderBy(pair => -pair.Value);
  44.         }
  45.     }
  46. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы