Посчитать энтропию для каждой буквы и сумму энтропии в конце - 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);
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д