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