01串的熵(蓝桥杯)

文章目录

01串的熵

问题描述

对于一个长度为n的01串 S= x 1 x 2 x 3 x_{1}x_{2}x_{3} x1x2x3... x n x_{n} xn,香农信息熵的定义为 H(S) = − ∑ 1 n p ( x i ) l o g 2 ( p ( x i ) ) -\sum {1}^{n}p(x{i})log_{2}(p(x_{i})) −∑1np(xi)log2(p(xi)),其中 p(0), p(1) 表示在这个01串中0和1出现的占比。

比如,对于 S=100 来说,信息熵 H(S) = − 1 3 l o g 2 ( 1 3 ) − 2 3 l o g 2 ( 2 3 ) − 2 3 l o g 2 ( 2 3 ) -\frac{1}{3}log_{2}(\frac{1}{3})-\frac{2}{3}log_{2}(\frac{2}{3})-\frac{2}{3}log_{2}(\frac{2}{3}) −31log2(31)−32log2(32)−32log2(32) = 1.3083

对于一个长度为23333333的01串,如果其信息熵为11625907.5798,且0出现次数比1少,那么这个01串中0出现了多少次?

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填与这个整数,填与多余的内容将无法得分。

答案:11027421

题意解释

这道题目是关于香农信息熵的计算问题。香农信息熵是信息论中用来量化信息预期值的一个概念,通常用于衡量信息的不确定性。在这个问题中,我们需要根据给定的信息熵值和一些条件来计算一个长度为23333333的01串中0出现的次数。

题目描述了一个长度为n的二进制字符串S,由0和1组成。香农信息熵H(S)的计算公式为:

H(S) = − ∑ 1 n p ( x i ) l o g 2 ( p ( x i ) ) -\sum {1}^{n}p(x{i})log_{2}(p(x_{i})) −∑1np(xi)log2(p(xi))

其中, p(x~i~) 表示在字符串中字符i出现的相对频率。对于二进制字符串,i只能是0或1,所以上式中的求和是对i=0和i=1的情况。

题目给出了一个具体的例子,对于字符串S=100,其信息熵计算如下:
H ( S ) = − p ( 0 ) log ⁡ 2 ( p ( 0 ) ) − p ( 0 ) log ⁡ 2 ( p ( 0 ) ) − p ( 1 ) log ⁡ 2 ( p ( 1 ) ) H(S) = -p(0) \log_2(p(0)) -p(0) \log_2(p(0))- p(1) \log_2(p(1)) H(S)=−p(0)log2(p(0))−p(0)log2(p(0))−p(1)log2(p(1))

由于字符串S=100中,0出现了两次,1出现了一次,所以p(0)=2/3,p(1)=1/3,代入公式得到:
H ( S ) = − 2 3 log ⁡ 2 ( 2 3 ) − 2 3 log ⁡ 2 ( 2 3 ) − 1 3 log ⁡ 2 ( 1 3 ) H(S) = -\frac{2}{3} \log_2\left(\frac{2}{3}\right) -\frac{2}{3} \log_2\left(\frac{2}{3}\right)- \frac{1}{3} \log_2\left(\frac{1}{3}\right) H(S)=−32log2(32)−32log2(32)−31log2(31)

现在,我们有一个长度为23333333的01串,其信息熵已知为11625907.5798。题目还告诉我们,这个字符串中0出现的次数比1少。我们的任务是计算出0出现的次数。

为了解决这个问题,我们需要设置两个变量,分别表示0和1出现的次数,然后根据信息熵的定义和给定的条件建立方程,求解这个方程即可得到0出现的次数。需要注意的是,由于0出现的次数比1少,我们可以设0的次数为x,1的次数为23333333-x。

暴力枚举

这段代码是用C++编写的,目的是计算在一个给定长度和信息熵的01串中0出现的次数。下面我会逐行进行注释:

cpp 复制代码
#include<bits/stdc++.h>  // 引入几乎所有的C++标准库
using namespace std;  // 使用标准命名空间

int main()  // 程序的主函数
{
    int n=23333333;  // 01串的长度
    double m=11625907.5798;  // 给定的信息熵
    
    // 从0试探到n,找出0的出现次数
    for(int ling=0; ling<=n; ling++)  
    {
        int yi=n-ling;  // 1出现的次数为总长度减去0出现的次数

        double p_ling=1.0*ling/n;  // 计算0出现的概率
        double p_yi=1.0*yi/n;  // 计算1出现的概率

        // 计算以0出现的概率为基础的熵部分
        double h_ling= - ling * p_ling *log2(p_ling);
        // 计算以1出现的概率为基础的熵部分
        double h_yi= - yi * p_yi * log2(p_yi);

        double h=h_ling+h_yi;  // 计算总熵

        // 检查当前总熵h是否接近给定的信息熵m,1e-4为容差值
        if(fabs(h-m)<1e-4)
        {
            cout<<ling;  // 如果是,输出0出现的次数
            break;  // 找到答案后结束循环
        }
    }
    return 0;  // 程序正常结束
}

这个程序会枚举0出现的次数从0到n(串的总长度),对于每一个可能的出现次数,计算出相应的信息熵,然后与给定的信息熵m进行比较。如果计算出的信息熵与给定的信息熵在一定的误差范围内(小于 ( 1 × 1 0 − 4 ) (1 \times 10^{-4}) (1×10−4)),程序就会输出当前枚举的0的出现次数,并结束循环。

相关推荐
A懿轩A35 分钟前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
机器视觉知识推荐、就业指导40 分钟前
C++设计模式:享元模式 (附文字处理系统中的字符对象案例)
c++
半盏茶香40 分钟前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
Ronin3052 小时前
11.vector的介绍及模拟实现
开发语言·c++
✿ ༺ ོIT技术༻2 小时前
C++11:新特性&右值引用&移动语义
linux·数据结构·c++
字节高级特工2 小时前
【C++】深入剖析默认成员函数3:拷贝构造函数
c语言·c++
唐诺8 小时前
几种广泛使用的 C++ 编译器
c++·编译器
不想当程序猿_9 小时前
【蓝桥杯每日一题】求和——前缀和
算法·前缀和·蓝桥杯
冷眼看人间恩怨9 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
红龙创客9 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++