【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

相关文章

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Java Response返回值的最佳处理方案

《JavaResponse返回值的最佳处理方案》在开发Web应用程序时,我们经常需要通过HTTP请求从服务器获取响应数据,这些数据可以是JSON、XML、甚至是文件,本篇文章将详细解析Java中处理... 目录摘要概述核心问题:关键技术点:源码解析示例 1:使用HttpURLConnection获取Resp

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

Python 中的 with open文件操作的最佳实践

《Python中的withopen文件操作的最佳实践》在Python中,withopen()提供了一个简洁而安全的方式来处理文件操作,它不仅能确保文件在操作完成后自动关闭,还能处理文件操作中的异... 目录什么是 with open()?为什么使用 with open()?使用 with open() 进行

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

Spring Boot中定时任务Cron表达式的终极指南最佳实践记录

《SpringBoot中定时任务Cron表达式的终极指南最佳实践记录》本文详细介绍了SpringBoot中定时任务的实现方法,特别是Cron表达式的使用技巧和高级用法,从基础语法到复杂场景,从快速启... 目录一、Cron表达式基础1.1 Cron表达式结构1.2 核心语法规则二、Spring Boot中定

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

SpringBoot项目中Maven剔除无用Jar引用的最佳实践

《SpringBoot项目中Maven剔除无用Jar引用的最佳实践》在SpringBoot项目开发中,Maven是最常用的构建工具之一,通过Maven,我们可以轻松地管理项目所需的依赖,而,... 目录1、引言2、Maven 依赖管理的基础概念2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J