【CSP试题回顾】202012-2-期末预测之最佳阈值

2024-03-09 13:52

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

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

关键点:时间复杂度优化

时间复杂度的优化主要来自于有效地利用排序和累计的分类正确数来避免对每个可能的决策阈值进行完全的暴力枚举。

1.暴力枚举(70分)

在暴力枚举方法中,对每一个可能的决策阈值 y,我们都需要遍历所有数据点来确定在此阈值下的分类正确数目。这意味着如果有 n 个数据点,且有 m 个不同的决策阈值,则时间复杂度为 O ( m n ) O(mn) O(mn)。这是因为对于每一个决策阈值,我们都重新计算整个数据集中的正确分类数量。

2.优化方法(100分)

相比之下,优化方法利用了排序和动态更新的概念,大幅降低了时间复杂度:

  1. 排序和初始化:首先,通过排序(这通常涉及在输入阶段隐式完成,因为我们使用的是 map 结构,它会根据 key(y 值)进行排序),我们可以确保在遍历数据结构时是按照决策阈值的顺序进行的。初始化部分(包括第一次遍历)的时间复杂度为 O ( n ) O(n) O(n),因为它基于数据点的总数。

  2. 单次遍历更新:在之后的处理中,对于每个后续的决策阈值 y,我们不需要重新计算整个数据集来确定分类正确的数量。相反,我们可以利用上一个阈值的结果,通过简单的加法和减法更新正确分类的数量。因此,对于每一个新的阈值,更新操作仅需要 O ( 1 ) O(1) O(1) 的时间(原因详见下一节)。

解题思路

  1. 数据结构定义

    • MyScore 结构用于存储每个决策阈值 y 下,分类结果为 0 和 1 的数量。
    • 使用 map<int, MyScore> 来存储每个决策阈值 y 和对应的 MyScore 结构,键是 y,值是 MyScore
  2. 输入处理

    • 通过循环,读取每个数据点的 y 值和实际分类结果 r(0 或 1)。
    • 根据读入的 y 和 r,更新对应 y 的 MyScore 结构中的 resultIsZeroNumresultIsOneNum
  3. 初始化和遍历处理

    • 定义 ac 为当前决策阈值 y 下分类正确的数据点数目,acMax 为最大的分类正确数目,acMaxY 为使得 acMax 最大的 y 值。
    • 在开始遍历 scoreMap 之前,预先处理第一个元素(最小的 y 值),因为基于问题的设定,因为scoreMap中的第一个元素是y的最小值,当y为最小值时,此时 θ \theta θ 小于等于所有的y,因此所有 r e s u l t = 1 result=1 result=1 都正确,也就是输入中1的总数
    • 遍历 scoreMap,对于每一个不同的 y 值(除了第一个),计算在此阈值下的分类正确数目 ac。计算方法为从上一个 y 的正确数目 ac 减去在上一个阈值下被正确分类为 1 的数量(这些现在被分类为错误),然后加上在上一个阈值下被错误分类为 0 的数量(这些现在被分类为正确)
      • 【注意】这样做的本质是:y的改变只影响其前一个元素 p r e d i c t predict predict 的结果,而不影响其他的,因此不要用遍历所有的 p r e d i c t predict predict ,从而只需要计算一次,大大降低了时间复杂度。
  4. 更新最优解

    • 在遍历每个 y 时,如果当前的 ac(分类正确的数量)大于或等于 acMax,则更新 acMax 为当前的 ac,并且更新 acMaxY 为当前的 y。

完整代码

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;struct MyScore
{int resultIsZeroNum; // 同一个y下,result为0的数量int resultIsOneNum; // 同一个y下,result为1的数量
};int n, y, r, ac, acMax, acMaxY; // ac:每个y下对应的正确数;acMax:最大ac数;acMaxY:最大ac数对应的y(theta)
map<int, MyScore>scoreMap; // 键-y 值-MyScore(记录y下result为0和1的数量)int main() {cin >> n;for (int i = 0; i < n; i++){cin >> y >> r;if (r)  ac++, scoreMap[y].resultIsOneNum++; // r = 1; 同时统计y_min时的acelse scoreMap[y].resultIsZeroNum++; // r = 0}bool firstTime = 1; // 跳过第一次循环(y_min),因为此时的ac已经在前面统计了pair<int, MyScore> last = *scoreMap.begin(); // it的前一个元素for (auto& it : scoreMap){if (firstTime) {firstTime = 0;acMax = ac; // 初始化acMaxacMaxY = it.first; // 初始化acMaxYcontinue;}ac = ac - last.second.resultIsOneNum + last.second.resultIsZeroNum; // ac的增减本质上是当前元素的前一个元素预测正确性的改变,对其他元素无影响if (ac >= acMax) // 检测更新{acMax = ac;acMaxY = it.first;}last = it; }cout << acMaxY;return 0;
}

请添加图片描述

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



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

相关文章

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

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

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(

Java基础回顾系列-第五天-高级编程之API类库

Java基础回顾系列-第五天-高级编程之API类库 Java基础类库StringBufferStringBuilderStringCharSequence接口AutoCloseable接口RuntimeSystemCleaner对象克隆 数字操作类Math数学计算类Random随机数生成类BigInteger/BigDecimal大数字操作类 日期操作类DateSimpleDateForma

Java基础回顾系列-第三天-Lambda表达式

Java基础回顾系列-第三天-Lambda表达式 Lambda表达式方法引用引用静态方法引用实例化对象的方法引用特定类型的方法引用构造方法 内建函数式接口Function基础接口DoubleToIntFunction 类型转换接口Consumer消费型函数式接口Supplier供给型函数式接口Predicate断言型函数式接口 Stream API 该篇博文需重点了解:内建函数式

Java基础回顾系列-第二天-面向对象编程

面向对象编程 Java类核心开发结构面向对象封装继承多态 抽象类abstract接口interface抽象类与接口的区别深入分析类与对象内存分析 继承extends重写(Override)与重载(Overload)重写(Override)重载(Overload)重写与重载之间的区别总结 this关键字static关键字static变量static方法static代码块 代码块String类特

Java基础回顾系列-第六天-Java集合

Java基础回顾系列-第六天-Java集合 集合概述数组的弊端集合框架的优点Java集合关系图集合框架体系图java.util.Collection接口 List集合java.util.List接口java.util.ArrayListjava.util.LinkedListjava.util.Vector Set集合java.util.Set接口java.util.HashSetjava