赞
踩
1.长度为n的01串S=x1x2x3.....xn
2.香浓信息熵的定义为
3.p(0)和p(1)表示在这个01串中0和1出现的占比。
4.比如,S=100来说
1.30803
5.对于一个长度为 23333333 的 01 串,如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少,那么这个 01 串中 0 出现了多少次?
毫无思路
- #include <bits/stdc++.h>
- using namespace std;
-
- int main() {
- int n = 23333333;
- double target = 11625907.5798;
- double tolerance = 0.0001; // 精度范围,可以根据需要调整
- for (int i = 0; i <= n; i++) {
- double p0 = (double)i / n;
- double p1 = 1 - p0;
- double entropy = -p0 * i * log2(p0) - p1 * (n - i) * log2(p1);
- if (abs(entropy - target) < tolerance) {
- cout << i << endl;
- break;
- }
- }
- return 0;
- }
log2
函数在某些编译环境下可能需要特别的库或者命名空间。
n=23333333
。H(S)=11625907.5798
。H(S) = −Σp(xi) log2(p(xi))
,针对01串,只需要计算0和1出现的概率。n/2
,可设置搜索范围为[0, n/2]。low=0
,high=n
。mid
,利用mid
作为0出现的次数来计算熵。low=mid+1
。high=mid-1
。- #include <iostream>
- #include <cmath>
- using namespace std;
-
- // 计算熵的函数
- double entropy(int zeros, int n) {
- if (zeros == 0 || zeros == n) return 0; // 如果0或1的数量为0,熵为0
- double p0 = static_cast<double>(zeros) / n;
- double p1 = 1.0 - p0;
- double entropy = -p0 * log2(p0) * zeros - p1 * log2(p1) * (n - zeros);
- return entropy;
- }
-
- int main() {
- const int n = 23333333;
- const double targetEntropy = 11625907.5798;
- int low = 0, high = n;
- int mid, zeroCount = 0;
- double calculatedEntropy;
-
- while (low <= high) {
- mid = low + (high - low) / 2;
- calculatedEntropy = entropy(mid, n);
-
- if (fabs(calculatedEntropy - targetEntropy) < 1e-4) { // 稍微增加精度范围
- zeroCount = mid;
- break;
- }
-
- if (calculatedEntropy < targetEntropy) {
- low = mid + 1;
- } else {
- high = mid - 1;
- }
- }
-
- cout << zeroCount << endl;
- return 0;
- }
从这个问题中,我们可以学到以下几点:
二分搜索算法的重要性:这个问题展示了在处理大数据集时,一个有效算法相比暴力搜索的效率提升。二分搜索显著地减少了必要的计算次数。
浮点数精度处理:计算过程中必须考虑到浮点数的精度问题。我们必须设定一个实际的精度范围来比较浮点数,因为直接比较可能会因为微小的误差而失败。
对数学函数的理解:深入理解熵的概念和计算方法以及对数函数的应用是解决这个问题的关键。
编程技巧:如何在C++中正确使用标准库和函数,以及如何处理特殊情况(比如全为0或全为1时熵为0)。
在处理这个问题时,犯下的错误可能包括:
初始的误解:一开始,我没有正确理解题目的要求,这表明在解决问题之前,彻底理解问题描述的重要性。
未能立即提供正确解法:我没有立即提供一个有效的解决方案,比如二分搜索,而是尝试了不适合这个问题的方法。
精度设置不当:在第一次尝试解决问题时,我没有设置一个合适的精度范围,导致没有找到正确的解。
代码实现问题:在实现代码时,我没有立即考虑到所有可能的边界情况,比如熵为0的情况。
通过这些错误,我们能够学习到在未来的问题解决中,如何更好地分析问题、设计算法和实现代码。每个错误都是一个学习和改进的机会。
从这个问题中,我们可以学习和强调几个关键的思想和方法:
分治思想:
算法效率:
浮点数的处理:
边界情况的处理:
代码的优化:
逐步细化:
编程语言工具箱:
持续测试和验证:
通过这个问题,我们不仅学到了具体的技能和方法,还提醒了我们在进行算法设计和编程时,应该保持的思维方式和注意事项。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。