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

news2025/1/13 10:32:39

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

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

各版本安卓的彩蛋一览

目录 前言前彩蛋纪Android 2.3 GingerbreadAndroid 3 HoneycombAndroid 4.0 Ice Cream SandwichAndroid 4.1-4.3 JellybeanAndroid 4.4 KitKatAndroid 5 LollipopAndroid 6 MarshmallowAndroid 7 NougatAndroid 8 OreoAndroid 9 PieAndroid 10 Queen CakeAndroid 11 Red Velvet…

分享66个相册特效,总有一款适合您

分享66个相册特效&#xff0c;总有一款适合您 66个相册特效下载链接&#xff1a;https://pan.baidu.com/s/1jqctaho4sL_iGSNExhWB6A?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不…

【Java EE初阶十】多线程进阶二(CAS等)

1. 关于CAS CAS: 全称Compare and swap&#xff0c;字面意思:”比较并交换“&#xff0c;且比较交换的是寄存器和内存&#xff1b; 一个 CAS 涉及到以下操作&#xff1a; 下面通过语法来进一步进项说明&#xff1a; 下面有一个内存M&#xff0c;和两个寄存器A,B; CAS(M,A,B)&am…

社区店营销新趋势:如何吸引并留住顾客?

作为一名资深的鲜奶吧创业者&#xff0c;我已经在这个行业摸爬滚打了五年。 这五年的时间&#xff0c;我见证了社区店营销的变迁&#xff0c;也积累了一些关于如何吸引并留住顾客的经验。今天&#xff0c;我想和大家分享一些留住顾客的核心干货。&#xff08;可以点赞收藏&…

YOLOv8改进 | 检测头篇 | 独创RFAHead检测头超分辨率重构检测头(适用Pose、分割、目标检测)

一、本文介绍 本文给大家带来的改进机制是RFAHead,该检测头为我独家全网首发,本文主要利用将空间注意力机制与卷积操作相结合的卷积RFAConv来优化检测头,其核心在于优化卷积核的工作方式,特别是在处理感受野内的空间特征时。RFAConv主要的优点就是增加模型的特征提取能力,…

MATLAB实现LSTM时间序列预测

LSTM模型可以在一定程度上学习和预测非平稳的时间序列&#xff0c;其具有强大的记忆和非线性建模能力&#xff0c;可以捕捉到时间序列中的复杂模式和趋势[4]。在这种情况下&#xff0c;LSTM模型可能会自动学习到时间序列的非平稳性&#xff0c;并在预测中进行适当的调整。其作为…

股票均线的使用方法和实战技术,看涨看空的均线形态与案例教学

一、教程描述 本套教程讲解了14种均线的特殊形态&#xff0c;通过直观图形以及大量案例的教学&#xff0c;将深奥、繁琐的均线变得生动与具体&#xff0c;广大投资者在认真学习以后&#xff0c;可以学会均线的使用方法&#xff0c;掌握最强的均线应用实战技术。本套教程不仅适…

Qt可视化大屏布局

科技大屏现在非常流行&#xff0c;这里分享一下某个项目的大屏布局&#xff08;忘了源码是哪个博主的了&#xff09; 展示 这个界面整体是垂直布局&#xff0c;分为两个部分&#xff0c;标题是一个部分&#xff0c;然后下面的整体是一个layout布局&#xff0c;为另外一部分。 l…

Shell脚本系列| SSH分发公钥方法 - expect脚本的使用

ssh原理&#xff1a;在SSH安全协议的原理中&#xff0c; 是一种非对称加密与对称加密算法的结合。用于确保远程登录和其他网络服务的会话安全&#xff0c;通过非对称加密、会话加密、多重验证机制等手段&#xff0c;保护数据传输的机密性和完整性。 ssh登录有2种方法&#xff1…

图书商城系统

文章目录 图书商城系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目&#xff08;9.9&#xffe5;带走&#xff09; 图书商城系统 一、项目演示 网上书城 二、项目介绍 基于SSM的图书商城网站 运行环境:idea或eclipse 数据库:mysql 开发语…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Web组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Web组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Web组件 提供具有网页显示能力的Web组件&#xff0c;ohos.web.webview提供web控制能…

4. TypeScript

目录 1 TypeScript 介绍 2 TypeScript 常用类型 2.1 类型标注的位置 2.2 字符串、数字、布尔类型 2.3 字面量类型 2.4 interface 类型 2.5 class 类型 Vue1&#xff1a;基础跟使用方式 Vue2&#xff1a;路由方面 Vue3&#xff1a;状态管理 vuex 状态管理库 1 TypeScrip…

鸿蒙原生应用再添新丁!央视新闻 入局鸿蒙

鸿蒙原生应用再添新丁&#xff01;央视新闻 入局鸿蒙 来自 HarmonyOS 微博2月9日消息&#xff0c;#央视新闻启动鸿蒙原生应用开发#中央广播电视总台旗舰央视新闻客户端正式宣布&#xff0c;将基于HarmonyOS NEXT鸿蒙星河版&#xff0c;启动央视新闻 鸿蒙原生应用开发&#xf…

springboot微信小程序 uniapp学习资料分享系统v9uy4

理论意义 当今网络教学已成为各国教育改革 和发展的趋势。因此&#xff0c;构建一个适合交互式课堂教学模式的教学平台就成了当务之 急。 在国内高校&#xff0c;目前交互平台主要用于网络学院的远程教学&#xff0c;至于校园内的正规教学&#xff0c;老师自发建立课程主页的比…

Web后端开发:事务与AOP

事务管理 在学习数据库时&#xff0c;讲到&#xff1a;事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位。事务会把所有的操作作为一个整体&#xff0c;一起向数据库提交或者是撤销操作请求&#xff0c;要么同时成功&#xff0c;要么同时失败。 事务的操作主要有三…

VUE学习——数组变化侦测

官方文档 变更方法&#xff1a; 使用之后&#xff0c;ui可以直接发生改变。改变原数组 替换数组&#xff1a; 使用之后需要接受重新赋值&#xff0c;不然ui不发生改变。不改变原数组

深度学习的进展及其在各领域的应用

深度学习&#xff0c;作为人工智能的核心分支&#xff0c;近年来在全球范围内引起了广泛的关注和研究。它通过模拟人脑的学习机制&#xff0c;构建复杂的神经网络结构&#xff0c;从大量数据中学习并提取有用的特征表示&#xff0c;进而解决各种复杂的模式识别问题。 一、深度…

一、OpenAI API介绍

Open AI API可以应用到任何的业务场景。 文本生成 创造助理 嵌入数据 语音转化 图片生成 图片输入 1. 核心概念 1.1 Text generation models OpenAI 的文本生成模型(通常被称为generative pre-trained transformers 模型简称&#xff1a;GPT),有GPT-4和G…

RCS-YOLO复现

复现结果–Precision&#xff1a;0.941&#xff0c;Recall&#xff1a;0.945&#xff0c;AP 50 _{50} 50​&#xff1a;0.941&#xff0c;AP 50 : 95 _{50:95} 50:95​&#xff1a;0.693&#xff0c;误差在5个点内&#xff0c;可以接受 感想 第5篇完全复现的论文

postman接口功能测试

前言 之前还没实际做过接口测试的时候呢&#xff0c;对接口测试这个概念比较渺茫&#xff0c;只能靠百度&#xff0c;查看各种接口实例&#xff0c;然后在工作中也没用上&#xff0c;现在呢是各种各样的接口都丢过来&…