当前位置:   article > 正文

01串的熵(蓝桥杯)详解_01串的熵为什么做不对

01串的熵为什么做不对

难点:

(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不能定义为整型,原因在注释中有。

代码如下:

  1. #include<iostream>
  2. #include<cmath>
  3. using namespace std;
  4. int main()
  5. {
  6. double h = 0;
  7. //如果n也定义为整型的话,由于o和n都是整数,这将导致整数除法,结果将丢失小数部分。
  8. double n = 23333333;
  9. int o = 0;
  10. for(o = 0;o < n/2;o++)
  11. {
  12. h = -o*(o / n) * log2(o / n) - (n - o)*((n - o) / n) * log2((n - o) / n);
  13. if(h > 11625907.5 && h < 11625907.6)
  14. {
  15. cout<<o<<endl;
  16. break;
  17. }
  18. }
  19. return 0;
  20. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/438832
推荐阅读
相关标签
  

闽ICP备14008679号