CSP-202012-2-期末预测之最佳阈值

2024-02-10 18:04

本文主要是介绍CSP-202012-2-期末预测之最佳阈值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CSP-202012-2-期末预测之最佳阈值

【70分思路】

  • 本题的难点还是时间复杂度,暴力枚举会导致时间超限。
  • 对于每一个可能的阈值theta,代码都重新计算了整个predict数组,统计预测正确的数目,因为有两个嵌套的循环,使得时间复杂度是O(m^2)
#include <iostream>
using namespace std;
int main() {int m;cin >> m;int* y = new int[m];int* result = new int[m];int* ac_num = new int[m];int ac_num_max = -1, y_max = -1;for (int i = 0; i < m; i++){cin >> y[i] >> result[i];ac_num[i] = 0;}for (int i = 0; i < m; i++){int theta = y[i];int* predict = new int[m];for (int j = 0; j < m; j++){predict[j] = 0;}// 计算predictfor (int j = 0; j < m; j++){if (y[j] >= theta){predict[j] = 1;}}// 统计正确次数for (int j = 0; j < m; j++){if (predict[j] == result[j]){ac_num[i]++;}}// 预测正确的次数最多if (ac_num[i] > ac_num_max){ac_num_max = ac_num[i];y_max = theta;}// 多个阈值均可以达到最高准确率时,选取其中最大的else if (ac_num[i] == ac_num_max){if (theta > y_max){y_max = theta;}}delete[]predict;}cout << y_max;delete[]y;delete[]result;delete[]ac_num;return 0;
}

【100分思路】

【核心思路】:利用排序一次遍历来减少计算量。思路是先将输入的y数组和结果result数组按照y值排序,然后一次性计算不同theta值对应的正确预测数量。这样做可以将时间复杂度降低到O(m log m)(主要是排序的时间复杂度,之后只需线性时间就可以计算所有可能的theta值)
上述代码通过一种巧妙的方法实现了对不同theta(阈值)的处理,仅通过单次遍历数据即可更新基于不同theta值的预测正确数。这种方法的核心在于利用排序后的数据和对预测正确数的连续更新,而不是重新计算每一个可能的theta值对应的预测正确数。以下是这个过程的详细解释:

具体思路

  1. 排序数据: 首先,通过将数据点按y值进行排序,确保在遍历数据时,theta值是逐渐增加的。这意味着,我们只需要考虑在这些y值变化的地方theta可能会导致预测结果的变化,而不是在每个可能的y

  2. 初始化正确预测数: 在开始遍历之前,计算了一个初始的正确预测数,这是基于假设theta小于最小y值(即所有数据点的预测结果都是1)的情况。这相当于设置了一个非常低的初始阈值,使得所有预测都是1,然后计算这个情况下正确预测的数量。

  3. 遍历并更新: 遍历排序后的数据时,每次遇到一个新的y值,都相当于theta发生了变化

    • 如果theta小于当前的y值,当前点的预测结果会是1;
    • 如果theta等于或大于当前的y值,当前点的预测结果则为0(假设预测规则是y >= theta为1,否则为0)。
    • 每当theta变化,都会影响到当前点的预测正确与否。
      • 如果当前点实际结果为1,那么当theta增加到等于当前点的y值时,之前计入的正确预测数需要减1(因为这个点现在被错误地预测为0)
      • 如果当前点的实际结果为0,相反的,当theta增加到等于当前点的y值时,之前未计入的正确预测数需要增加1(因为这个点现在被正确地预测为0)。这一逻辑体现在对currentPredictions的更新上。
  4. 处理相同的y值: 在实际数据中,可能存在多个数据点具有相同的y值。当处理这样的数据点时,只有在所有具有相同y值的数据点都被考虑完毕后,才会更新theta值。这意味着,如果连续几个数据点有相同的y值,我们会在遍历到最后一个具有该y值的数据点后,才考虑theta值的变化对预测正确数的影响。这一点通过跳过重复y值的逻辑实现,从而确保了每个不同的theta值只被考虑一次。

  5. 更新最大准确预测数和theta 在遍历过程中,每次theta变化后,都会评估当前的正确预测数。如果这个数值超过了之前记录的最大准确预测数,或者在达到相同的最大准确预测数时具有更大的theta值,则更新记录的最大准确预测数和对应的theta值。这保证了在所有考虑的theta值中,选择了能够产生最大准确预测数的最大theta值。

#include <iostream>
#include <algorithm>
using namespace std;struct Data {int y;int result;
};// 比较函数,用于sort对Data数组进行排序,基于y值升序排列
bool compareData(const Data& a, const Data& b) {return a.y < b.y;
}int main() {int m;cin >> m; Data* data = new Data[m]; for (int i = 0; i < m; i++) {cin >> data[i].y >> data[i].result;}    sort(data, data + m, compareData); // 对数据点按y值进行升序排序int correctPredictions = 0; // 正确预测的初始数量,假设所有数据点的预测结果都是1for (int i = 0; i < m; i++) {if (data[i].result == 1) {correctPredictions++; // 统计实际结果为1的数量}}int ac_num_max = correctPredictions; // 记录最大准确预测数int y_max = data[0].y; // 记录达到最大准确预测数的y阈值int currentPredictions = correctPredictions; // 当前阈值下的准确预测数for (int i = 0; i < m; i++) {// 如果当前点的实际结果为0,则假设以当前点的y值为阈值时,将使得预测为1的数量增加// 因为实际为0但预测为1的情况会减少if (data[i].result == 0) {currentPredictions++;}else {// 反之,如果实际结果为1,以当前点的y值为阈值会使得这个点预测错误(预测为0),因此准确预测数减少currentPredictions--;}// 跳过重复的y值,避免对相同阈值的重复计算if (i < m - 1 && data[i].y == data[i + 1].y) {continue;}// 更新记录的最大准确预测数及对应的y阈值// 这里的条件是为了确保,当有多个阈值产生相同的最大准确预测数时,选择y值较大的那个if (currentPredictions >= ac_num_max) {ac_num_max = currentPredictions;// 选择下一个不同的y值作为阈值,确保在所有相同的最大准确预测数中选择最大的y值y_max = i < m - 1 ? data[i + 1].y : data[i].y;}}cout << y_max; // 输出达到最大准确预测数的最大y阈值delete[] data; // 释放动态分配的内存return 0;
}

请添加图片描述

这篇关于CSP-202012-2-期末预测之最佳阈值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/697751

相关文章

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

Prometheus与Grafana在DevOps中的应用与最佳实践

Prometheus 与 Grafana 在 DevOps 中的应用与最佳实践 随着 DevOps 文化和实践的普及,监控和可视化工具已成为 DevOps 工具链中不可或缺的部分。Prometheus 和 Grafana 是其中最受欢迎的开源监控解决方案之一,它们的结合能够为系统和应用程序提供全面的监控、告警和可视化展示。本篇文章将详细探讨 Prometheus 和 Grafana 在 DevO

springboot整合swagger2之最佳实践

来源:https://blog.lqdev.cn/2018/07/21/springboot/chapter-ten/ Swagger是一款RESTful接口的文档在线自动生成、功能测试功能框架。 一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务,加上swagger-ui,可以有很好的呈现。 SpringBoot集成 pom <!--swagge

CSP-J基础之数学基础 初等数论 一篇搞懂(一)

文章目录 前言声明初等数论是什么初等数论历史1. **古代时期**2. **中世纪时期**3. **文艺复兴与近代**4. **现代时期** 整数的整除性约数什么样的整数除什么样的整数才能得到整数?条件:举例说明:一般化: 判断两个数能否被整除 因数与倍数质数与复合数使用开根号法判定质数哥德巴赫猜想最大公因数与辗转相除法计算最大公因数的常用方法:举几个例子:例子 1: 计算 12 和 18

CSP-J基础之数学基础 初等数论 一篇搞懂(二)

文章目录 前言算术基本定理简介什么是质数?举个简单例子:重要的结论:算术基本定理公式解释:举例: 算术基本定理的求法如何找出质因数:举个简单的例子: 重要的步骤:C++实现 同余举个例子:同余的性质简介1. 同余的自反性2. 同余的对称性3. 同余的传递性4. 同余的加法性质5. 同余的乘法性质 推论 总结 前言 在计算机科学和数学中,初等数论是一个重要的基础领域,涉及到整数

《C++中的移动构造函数与移动赋值运算符:解锁高效编程的最佳实践》

在 C++的编程世界中,移动构造函数和移动赋值运算符是提升程序性能和效率的重要工具。理解并正确运用它们,可以让我们的代码更加高效、简洁和优雅。 一、引言 随着现代软件系统的日益复杂和对性能要求的不断提高,C++程序员需要不断探索新的技术和方法来优化代码。移动构造函数和移动赋值运算符的出现,为解决资源管理和性能优化问题提供了有力的手段。它们允许我们在不进行不必要的复制操作的情况下,高效地转移资源

CSP-J基础之cmath常见函数

文章目录 前言1. **`sin` 函数**2. **`cos` 函数**3. **`exp` 函数**4. **`log` 函数**5. **`fabs` 函数**6. **`pow` 函数**7. **`sqrt` 函数**8. **`ceil` 函数**9. **`floor` 函数** 总结 前言 在计算机科学与编程中,数学函数是解决各种计算问题的基础工具。C++标准

Tensorflow lstm实现的小说撰写预测

最近,在研究深度学习方面的知识,结合Tensorflow,完成了基于lstm的小说预测程序demo。 lstm是改进的RNN,具有长期记忆功能,相对于RNN,增加了多个门来控制输入与输出。原理方面的知识网上很多,在此,我只是将我短暂学习的tensorflow写一个预测小说的demo,如果有错误,还望大家指出。 1、将小说进行分词,去除空格,建立词汇表与id的字典,生成初始输入模型的x与y d

临床基础两手抓!这个12+神经网络模型太贪了,免疫治疗预测、通路重要性、基因重要性、通路交互作用性全部拿下!

生信碱移 IRnet介绍 用于预测病人免疫治疗反应类型的生物过程嵌入神经网络,提供通路、通路交互、基因重要性的多重可解释性评估。 临床实践中常常遇到许多复杂的问题,常见的两种是: 二分类或多分类:预测患者对治疗有无耐受(二分类)、判断患者的疾病分级(多分类); 连续数值的预测:预测癌症病人的风险、预测患者的白细胞数值水平; 尽管传统的机器学习提供了高效的建模预测与初步的特征重