先来看题目:
对于一个长度为n的01串S=x1x2x3::xn,香农信息熵Q的定义为H(S)= -Zn1p(xi) log2(p(xi)),其中 p(O);p(I)表示在这个01 串中0和1出现的占比。
比如,对于S=100来说,信息熵H(S)=-1310g2(1 3) - 2310g2(2 3) - 2 3 10g2(2 3) =1:3083。对于一个长度为23333333的01串,如果其信息熵为 11625907:5798,且0出现次数比1少,那么这个01 串中0出现了多少次?
多读几遍题目你会发现也不是很难理解了,只要把规律找出来,后面的都交给计算机,题目的要求是在23333333中找到0出现的个数(且0出现的次数比1小),同时满足H(S)后面你会发现规律为(设x为1出现的个数,那么她的概率即为(x/n),那么0出现的次数为(n-x),概率为(n-x)/n,n为总长度)H(S)=-x*(n/x)*log2(n/x)-(n-x)*((n-x)/n)*log2((n-x)/n)
#include<iostream>
#include<cmath> // 包含cmath库以使用log2函数
#include<iomanip> // 包含iomanip库以使用cout
#include<cfloat> // 包含cfloat库以使用DBL_MAX
using namespace std;
int main() {
int n = 23333333;
double h = 11625907.5798; // 将h声明为double类型
double min_diff = DBL_MAX; // 初始化最小差值为最大双精度浮点数
int result = 0; // 存储结果的变量
for (int i = 0; i <= n; i++) {
double a = i;
double b = n - i;
double s = -a * (a / n) * log2(a / n) - b * (b / n) * log2(b / n);
double c = h - s; // 将c声明为double类型
double diff = fabs(c); // 计算差值的绝对值
if (diff < min_diff) { // 如果当前差值更小,则更新最小差值和结果
min_diff = diff;
result = i;
}
}
cout << result; // 输出结果
return 0;
}