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;
        }

        // 计算predict
        for (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; // 正确预测的初始数量,假设所有数据点的预测结果都是1
    for (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;
}

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/381577.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ClickHouse的优缺点和应用场景

当业务场景需要一个大批量、快速的、可支持聚合运算的数据库&#xff0c;那么可选择ClickHouse。 选择ClickHouse 的原因&#xff1a; 记录类型类似于LOG&#xff0c;读取、运算远远大于写入操作选取有限列&#xff0c;对近千万条数据&#xff0c;快算的运算出结果。数据批量…

springboot176基于Spring Boot的装饰工程管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

网络请求库axios

一、认识Axios库 为什么选择axios? 功能特点: 在浏览器中发送 XMLHttpRequests 请求在 node.js 中发送 http请求支持 Promise API拦截请求和响应转换请求和响应数据 补充: axios名称的由来? 个人理解没有具体的翻译. axios: ajax i/o system 二、axios发送请求 1.axios请求…

2.6日学习打卡----初学RabbitMQ(一)

2.6日学习打卡 初识RabbitMQ、 一. MQ 消息队列 MQ全称Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保 存消息的容器。多用于系统之间的异步通信。 同步通信相当于两个人当面对话&#xff0c;你一言我一语。必须及时回复 异步通信相当于通…

Redis核心技术与实战【学习笔记】 - 27.限制Redis Cluster规模的因素(通信开销)

简述 Redis Cluster 能保存的数据量以及支撑的吞吐量&#xff0c;跟集群实例规模相关。 Redis 官方给出了 Redis Cluster 的规模上线&#xff0c;就是一个集群运行 1000 个实例。 其实&#xff0c;限定 Redis Cluster 集群规模的一个关键因素就是&#xff0c;实例间的通信开销…

入门指南|Chat GPT 的兴起:它如何改变数字营销格局?

随着数字营销的不断发展&#xff0c;支持数字营销的技术也在不断发展。OpenAI 的 ChatGPT 是一项备受关注的突破性工具。凭借其先进的自然语言处理能力&#xff0c;ChatGPT 已被证明是全球营销人员的宝贵资产。在这份入门指南中&#xff0c;我们将探讨Chat GPT对数字营销专家及…

社区店选址要素揭秘:人流量与商业潜力的关键

开店五年&#xff0c;我深刻体会到选址对于社区店的重要性。 不管是哪个行业的实体店&#xff0c;选址更是决定成败的关键因素之一。今天&#xff0c;我就以一名资深鲜奶吧创业者的身份&#xff0c;来揭秘社区店选址的几大要素&#xff0c;帮助大家在创业的道路上少走弯路。 …

Maven - 编译报错:程序包 XXX 不存在(多模块项目)

问题描述 编译报错&#xff1a;程序包 XXX 不存在&#xff08;多模块项目&#xff09; 原因分析 检查依赖模块 pom 文件&#xff0c;看是不是引入了如下插件 <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-pl…

【深度学习】实验7布置,图像超分辨

清华大学驭风计划 因为篇幅原因实验答案分开上传&#xff0c; 实验答案链接http://t.csdnimg.cn/P1yJF 如果需要更详细的实验报告或者代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢迎私信博主&#xff0c;大家可以相互讨论交流哟~~ 深度学习训练营 案例 7 &#xff1…

2024年【起重机司机(限桥式起重机)】最新解析及起重机司机(限桥式起重机)考试资料

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 起重机司机(限桥式起重机)最新解析是安全生产模拟考试一点通生成的&#xff0c;起重机司机(限桥式起重机)证模拟考试题库是根据起重机司机(限桥式起重机)最新版教材汇编出起重机司机(限桥式起重机)仿真模拟考试。2024…

Idea里自定义封装数据警告解决 Spring Boot Configuration Annotation Processor not configured

我们自定对象封装指定数据&#xff0c;封装类上面一个红色警告&#xff0c;虽然不影响我们的执行&#xff0c;但是有强迫症看着不舒服&#xff0c; 去除方式&#xff1a; 在pom文件加上坐标刷新 <dependency><groupId>org.springframework.boot</groupId><…

Stata实证命令代码汇总

Stata代码命令汇总 数据内容&#xff1a;包括数据导入和管理、数据的处理、描述性统计、相关性分析、实证模型、内生性解决、检验分析、结果导出 具体如下&#xff1a; 一、数据导入和管理&#xff1a;数据导入、数据导出 二、数据的处理&#xff1a;生成新变量、格式转换、…

FTP 文件传送协议

目录 1 文件传送协议 FTP 1.1 FTP 的基本工作原理 FTP 特点 主进程的工作步骤 两个连接 两个不同的端口号 NFS 采用另一种思路 1.2 简单文件传送协议 TFTP TFTP 的主要特点 TFTP 的工作&#xff08;很像停止等待协议&#xff09; 1 文件传送协议 FTP 文件传送协议 …

计算机算术

计算机算术 数据是什么 数据是各种各样的信息&#xff0c;如数字、文本、计算机程序、音乐、图像、符号等等&#xff0c;实际上&#xff0c;信息可以是能够被计算机存储和处理的任何事物。 位与字节 计算机中存储和处理信息的最小单位是位&#xff08;Binary digit比特&#x…

C++,stl,list容器详解

目录 1.list基本概念 2.list构造函数 3.list的赋值和交换 4.list大小操作 5.list的插入的删除 6.list数据存取 7.list反转和排序 排序案例 1.list基本概念 2.list构造函数 #include<bits/stdc.h> using namespace std;void print(const list<int> &lk) …

【Ubuntu 20.04/22.04 LTS】最新 esp-matter SDK 软件编译环境搭建步骤

仓库链接&#xff1a;esp-matter SDK官方软件说明&#xff1a;ESP Matter Programming Guide官方参考文档&#xff1a;使用 Matter-SDK 快速搭建 Matter 环境 (Linux) 环境要求 Ubuntu 20.04 或 Ubuntu22.04网络环境支持访问 Gihub 在安装 esp-matter SDK 软件编译环境之前&a…

行程开关方向

平板打印机的行程开关方向通常取决于设备的特定设计和制造商的指导。一般来说&#xff0c;行程开关的方向是指当行程开关被触发时&#xff0c;设备移动的方向。例如&#xff0c;如果一个行程开关被设计为当它被触发时&#xff0c;设备会向左移动&#xff0c;那么这个行程开关的…

Oracle 几种行转列的方式 sum+decode sum+case when pivot

目录 原始数据&#xff1a; 方式一&#xff1a; 方式二&#xff1a; 方式三&#xff1a; unpivot的使用&#xff1a; 原始数据&#xff1a; 方式一&#xff1a; select t_name,sum(decode(t_item, item1, t_num, 0)) item1,sum(decode(t_item, item2, t_num, 0)) item2,s…

【51单片机】添加模块代码的常见问题(图示&代码演示)

前言 大家好吖&#xff0c;欢迎来到 YY 滴 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 本章节是Lcd1602章节的一部分&#xff0c;以把4个Lcd驱动程序添加为例子&#xff0c;完整传送门在下方传送门 欢迎订阅 YY滴C专栏&…

【蓝桥杯冲冲冲】[CEOI2015 Day2] 世界冰球锦标赛

蓝桥杯备赛 | 洛谷做题打卡day32 文章目录 蓝桥杯备赛 | 洛谷做题打卡day32题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示样例解释 题解代码我的一些话 [CEOI2015 Day2] 世界冰球锦标赛 题目描述 译自 CEOI2015 Day2 T1「Ice Hockey World Championship」 今年的…