Посчитать энтропию для каждой буквы и сумму энтропии в конце - C#
Формулировка задачи:
Нужно найти частотность каждой буквы в тексте и определить энтропию H,
в итоге после последней буквы должна выводится сумма H (сумма энтропии по каждой букве),
но у меня ошибка, выводится в файл только энтропия последней буквы.
Нужно где-то прописать, чтобы к энтропии первой буквы добавлялось значение энтропии второй буквы и так далее.
Вроде не сложно, но что-то я запуталась
Вот сам код
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; namespace laboratorna1 { class Program { static void Main(string[] args) { string[] alphabet = File.ReadAllLines("russian_alphabet.txt", Encoding.GetEncoding(1251)); string text2 = File.ReadAllText("russian_text2.txt", Encoding.GetEncoding(1251)); Dictionary<string, int> frequency2 = new Dictionary<string, int>(); for (int i = 0; i < alphabet.Length; i++) { alphabet[i] = alphabet[i].Trim(); frequency2[alphabet[i].ToString()] = 0; } for (int i = 0; i < text2.Length; i++) { if (frequency2.ContainsKey(text2[i].ToString())) { frequency2[text2[i].ToString()]++; } } StringBuilder answer2 = new StringBuilder(); for (int i = 0; i < alphabet.Length; i++) { if (frequency2.ContainsKey(alphabet[i].ToString())) { double p2, H2=0; p2 = (double)frequency2[alphabet[i].ToString()] / text2.Length; for (int j = 0; j < alphabet.Length; j++) { H2 = ((-p2)*Math.Log(p2,2.0)); } answer2.AppendLine(alphabet[i] + ' ' + p2.ToString()); if (alphabet[i] == alphabet[alphabet.Length-1]) { answer2.AppendLine("H2 = " + H2.ToString()); } } else { answer2.AppendLine(alphabet[i] + " 0"); } } File.WriteAllText("answer_file2.txt", answer2.ToString(), Encoding.GetEncoding(1251)); File.WriteAllLines("answer_file2.txt", File.ReadAllLines("answer_file2.txt", Encoding.GetEncoding(1251)).OrderByDescending(a => a.Substring(2)), Encoding.GetEncoding(1251)); } } }
Решение задачи: «Посчитать энтропию для каждой буквы и сумму энтропии в конце»
textual
Листинг программы
StringBuilder answer2 = new StringBuilder(); for (int i = 0; i < alphabet.Length; i++) { double p2, H2, sumH2 = 0; p2 = (double)frequency2[alphabet[i]] / text2.Length; for (int j = 0; j < alphabet.Length; j++) { H2 = ((-p2) * Math.Log(p2, 2.0)); sumH2 += H2; answer2.AppendFormat("{0} p={1} H={2}\r\n", alphabet[i], p2, H2); } answer2.AppendFormat("Sum H={0}\r\n", sumH2); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д