01串的熵(蓝桥杯)详解

本文介绍了如何计算字符串的熵(信息熵),使用浮点数判断范围的方法,以及在编程中处理0个数枚举范围的技巧。重点在于理解熵的计算公式和避免整型溢出问题。
摘要由CSDN通过智能技术生成

难点:

(1)读懂题意,熵怎么计算的

 根据题目给出的例子,也就是S=100,H(S)如何计算,其实也就是 -p(1)log2p(1)-p(0)log2p(0)-p(0)log2p(0)=-1*p(1)log2p(1)-2*p(0)log2p(0),其实我们可以发现规律了吧。

h = -o*(o / n) * log2(o / n) - (n - o)*((n - o) / n) * log2((n - o) / n);

o表示0的个数,n表示总的个数,字符串不是0就是1,那1的个数很明显不就是n-o吗

-(o / n) * log2(o / n):表示的是一个0的信息熵是多少,那我字符串有多少个0不就是乘以多少就行来了吗。

-o*(o / n) * log2(o / n) :表示字符串中出现了几个0的,它们的信息熵总和是多少

- (n - o)*((n - o) / n) * log2((n - o) / n):表示字符串中出现了几个1,它们的信息熵总和是多少

(2)怎么判断浮点数是否在一个范围之内

浮点数的范围判断不像整数一样,而是要判断它是否属于某一范围,或者二者差的绝对值属于某一范围一般取<0.01。这个知识算是积累吧。记住就行了。所以应该怎么判断呢。

h > 11625907.5 && h < 11625907.6

(3)枚举0的个数,,枚举的范围应该是什么呢。

最小是0,这个是肯定的,最大应该是多少呢,题目中说0的个数比1少,也就是说0的个数应该小于总数的一半。

(4)n不能定义为整型,原因在注释中有。

代码如下:

#include<iostream>
#include<cmath>
using namespace std;

int main()
{
    double h = 0;
    //如果n也定义为整型的话,由于o和n都是整数,这将导致整数除法,结果将丢失小数部分。
    double n = 23333333;
    int o = 0;
    for(o = 0;o < n/2;o++)
    {
        h = -o*(o / n) * log2(o / n) - (n - o)*((n - o) / n) * log2((n - o) / n);
        if(h > 11625907.5 && h < 11625907.6)
        {
            cout<<o<<endl;
            break;
        }
    }
    return 0;
}

  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值