【CSP试题回顾】202012-2-期末预测之最佳阈值(优化)
CSP-202012-2-期末预测之最佳阈值
关键点
1.map的遍历方式
map<int, int>occ0Num, occ1Num;
for (auto it = thetaSet.begin(); it != thetaSet.end(); ++it) {num = num + occ0Num[*it] - occ1Num[*it];auto nextIt = next(it); // 获取下一个迭代器if (num >= maxNum && nextIt != thetaSet.end()) {bestTheta = *nextIt; // 使用下一个元素的值maxNum = num;}
}
2.时间复杂度优化:减少重复计算
100分思路通过预处理(排序和计数)以及有效地更新正确预测的次数来避免了不必要的重复计算,显著提高了效率。与70分的暴力枚举方法相比,它将时间复杂度从 O ( n 2 ) O(n^2) O(n2) 降低到了 O ( n l o g n ) O(n log n) O(nlogn),这对于大数据集来说是一个重大的改进。
暴力枚举方法(70分思路):
-
这个方法通过对所有可能的阈值进行枚举来找到最佳阈值。对于每个可能的阈值,它遍历所有样本,计算以该阈值进行分类时的准确性(即正确预测的次数)。这需要两层嵌套循环:外层循环遍历所有可能的阈值,内层循环遍历所有样本来计算准确性。
- 时间复杂度: 如果有 n 个样本,则外层循环执行 n 次(因为阈值是从样本中选取的),内层循环也执行 n 次(每次都要检查所有样本)。因此,总时间复杂度为 O ( n 2 ) O(n^2) O(n2)。
减少重复运算方法(100分思路):
-
首先,预先计算每个可能阈值对应的分类结果,这是通过对样本进行排序和统计每个特征值下真实结果为真和假的样本数量来实现的。接下来,它只遍历一次排序后的样本列表来初始化正确预测次数,然后遍历所有不同的特征值作为可能的阈值,而不是重新计算每个可能阈值的正确预测次数。这是通过更新一个累计计数来完成的,该计数在遍历过程中根据当前阈值下样本分类的变化而调整。
- 时间复杂度: 对所有样本排序的时间复杂度为 O ( n l o g n ) O(n log n) O(nlogn)。初始化正确预测次数的循环时间复杂度为 O(n)(单次遍历)。遍历不同的特征值(可能的阈值)来调整正确预测次数的循环也是 O ( n ) O(n) O(n),因为即使是在所有不同的特征值上迭代,这个数量也不会超过 n(在最坏情况下,所有特征值都不相同)。因此,整体时间复杂度是 O ( n l o g n + n ) O(n log n + n) O(nlogn+n),即 O ( n l o g n ) O(n log n) O(nlogn),这主要由排序决定。
解题思路
题目是关于找到一个最佳阈值(θ)来评价预测模型的性能。这个预测模型基于一个特征值(y)来预测是否达到某个结果,使用二分类的方式,即预测结果为真(1)或假(0)。评价的核心是找到一个阈值,使得当预测值与真实结果相等时的次数最多。代码的解题思路如下:
-
数据读取:读取样本数量以及每个样本的特征值(y)和真实结果(result)。同时,初始化两个映射(
occ0Num
和occ1Num
),它们分别记录每个特征值对应的结果为假(0)和真(1)的样本数量。还有一个集合(thetaSet
)来存储所有可能的阈值(即所有不同的特征值)。 -
预处理:对样本按照特征值(y)进行排序,确保后续处理有序进行。排序同时也方便后续确定阈值的选择。
-
初始化:初始化当前的最佳预测次数
num
为最小特征值作为阈值时的正确预测次数,这通过比较每个样本的特征值与最小特征值(作为初始阈值)来确定,并计算满足条件(预测等于真实结果)的样本数。 -
寻找最佳阈值:遍历所有可能的阈值(通过遍历每个不同的特征值)。对每个阈值,根据其将样本分为两类(大于等于阈值、小于阈值)的能力来调整正确预测的次数。每次迭代调整基于前一个阈值的正确次数,并考虑当前阈值导致的结果变化(即增加因特征值大于等于阈值且结果为假的样本数,减少因特征值小于阈值且结果为真的样本数)。每当找到更好的分割(即正确预测的次数增加),更新最佳阈值
bestTheta
和最大预测正确次数maxNum
。 -
输出最佳阈值:在完成所有可能的阈值检验后,输出能得到最多正确预测次数的阈值
bestTheta
。
完整代码
【100分思路-减少重复运算】
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <set>
using namespace std;struct MyScore
{int y;bool result;
};bool predict(int y, int theta) {return y >= theta;
}bool cmp(MyScore& a, MyScore& b) {return a.y < b.y;
}int n, bestTheta, maxNum, num;
map<int, int>occ0Num, occ1Num;
set<int>thetaSet;int main() {cin >> n;vector<MyScore>list(n);for (size_t i = 0; i < n; i++) {cin >> list[i].y >> list[i].result;auto it0 = occ0Num.find(list[i].y), it1 = occ1Num.find(list[i].y);;if (it0 == occ0Num.end()) occ0Num[list[i].y] = 0;if (it1 == occ1Num.end()) occ1Num[list[i].y] = 0;if (list[i].result) occ1Num[list[i].y]++;else occ0Num[list[i].y]++;thetaSet.insert(list[i].y);}sort(list.begin(), list.end(), cmp);for (auto& it : list) {if (predict(it.y, list[0].y) == it.result) num++;}bestTheta = list[0].y, maxNum = num;for (auto it = thetaSet.begin(); it != thetaSet.end(); ++it) {num = num + occ0Num[*it] - occ1Num[*it];auto nextIt = next(it); // 获取下一个迭代器if (num >= maxNum && nextIt != thetaSet.end()) {bestTheta = *nextIt; // 使用下一个元素的值maxNum = num;}}cout << bestTheta;return 0;
}
【70分思路-暴力枚举】
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;struct MyScore
{int y;bool result;
};bool predict(int y, int theta) {return y >= theta;
}bool cmp(MyScore& a, MyScore& b) {return a.y > b.y;
}int n, bestTheta, maxNum;int main() {cin >> n;vector<MyScore>list(n);for (size_t i = 0; i < n; i++){cin >> list[i].y >> list[i].result;}sort(list.begin(), list.end(), cmp);for (size_t i = 0; i < n; i++){int theta = list[i].y, num = 0;for (auto& it : list){if (predict(it.y, theta) == it.result) num++;}if (num > maxNum){bestTheta = theta;maxNum = num;} }cout << bestTheta;return 0;
}
相关文章:
【CSP试题回顾】202012-2-期末预测之最佳阈值(优化)
CSP-202012-2-期末预测之最佳阈值 关键点 1.map的遍历方式 map<int, int>occ0Num, occ1Num; for (auto it thetaSet.begin(); it ! thetaSet.end(); it) {num num occ0Num[*it] - occ1Num[*it];auto nextIt next(it); // 获取下一个迭代器if (num > maxNum &a…...

docker学习笔记 三-----docker安装部署
我使用的部署环境是centos 7.9 1、安装依赖工具 yum install -y yum-utils device-mapper-persistent-data lvm2 安装完成如下图 2、添加docker的软件信息源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo url地址为如…...

FastAPI+React全栈开发02 什么是FARM技术栈
Chapter01 Web Development and the FARM Stack 02 What is the FARM stack and how does it fit together? FastAPIReact全栈开发02 什么是FARM技术栈 It is important to understand that stacks aren’t really special, they are just sets of technologies that cover…...
C#程序结构详解
目录 背景: 一、C#程序的基本组成部分 二、C# Hello World示例 三、程序结构解析 四、编译与执行C#程序 五、总结 背景: 在学习C#编程语言的过程中,了解程序的基本结构是非常重要的。C#程序由多个组成部分构成,每个部分都有其特定的功能和作用。下面…...
linux 清理空间
1. 根目录下执行命令,查看每个目录下文件大小总和 rootvm10-88-88-3 /]# du -h --max-depth1 79M ./tmp 123M ./etc 4.0K ./media 4.0K ./srv 104M ./boot 5.3G ./var 0 ./sys 8.6M ./dev 196G ./usr 4.0K ./mnt 285M ./opt…...

C语言:给结构体取别名的4种方法
0 前言 在进行嵌入式开发的过程中,我们经常会见到typedef这个关键字,这个关键字的作用是给现有的类型取别名,在实际使用过程中往往是将一个复杂的类型名取一个简单的名字,便于我们的使用。就像我们给很熟的人取外号一样ÿ…...

今天聊聊Docker
在数字化时代,软件应用的开发和部署变得越来越复杂。环境配置、依赖管理、版本控制等问题给开发者带来了不小的挑战。而Docker作为一种容器化技术,正以其独特的优势成为解决这些问题的利器。本文将介绍Docker的基本概念、优势以及应用场景,帮…...

【C语言】结构体
个人主页点这里~ 结构体 一、结构体类型的声明1、结构的声明2、结构体变量的创建和初始化3、声明时的特殊情况4、自引用 二、结构体内存对齐1、对齐规则2、存在内存对齐的原因3、修改默认对齐数 三、结构体传参四、结构体实现位段 一、结构体类型的声明 我们在指针终篇中提到过…...

Git基础(24):分支回退
文章目录 前言放弃已修改的内容分支回退到指定commit 前言 将分支回退到之前的某个版本 开发中,可能开发某个功能不需要了,或者想要回退到之前历史的某个commit, 放弃后来修改的内容。 放弃已修改的内容 如果未提交,直接使用 …...
复试专业前沿问题问答合集1
复试专业前沿问题问答合集1 人工智能基础知识问答 Q1: 什么是人工智能(AI)? A1: 人工智能(AI)是计算机科学的一个分支,它涉及创建能够执行通常需要人类智能的任务的机器和软件。这些任务包括学习(获取信息并根据信息对其进行规则化以达到结论)、推理(使用规则达到近…...
C++标准库中提供的用于处理正则表达式的类std::regex
std 是 C 标准库的命名空间,包含了大量标准的 C 类、函数和对象。这些类和函数提供了广泛的功能,包括输入输出、容器、算法、字符串处理等。 通常,为了使用标准库中的对象和函数,需在代码中包含相应的头文件,比如 #in…...

.NET Core 服务实现监控可观测性最佳实践
前言 本次实践主要是介绍 .Net Core 服务通过无侵入的方式接入观测云进行全面的可观测。 环境信息 系统环境:Kubernetes编程语言:.NET Core ≥ 2.1日志框架:Serilog探针类型:ddtrace 接入方案 准备工作 DataKit 部署 DataK…...

AI基础知识扫盲
AI基础知识扫盲 AIGCLangchain--LangGraph | 新手入门RAG(Retrieval-Augmented Generation)检索增强生成fastGPT AIGC AIGC是一种新的人工智能技术,它的全称是Artificial Intelligence Generative Content,即人工智能生成内容。 …...

分布式系统面试全集通第一篇(dubbo+redis+zookeeper----分布式+CAP+BASE+分布式事务+分布式锁)
目录 分布式系统面试全集通第一篇什么是分布式?和微服务的区别什么是分布式分布式与微服务的区别 什么是CAP?为什么不能三者同时拥有分区容错性一致性可用性 Base理论了解吗基本可用软状态最终一致性 什么是分布式事务分布式事务有哪些常见的实现方案?2PC(Two Ph…...

Prompt-RAG:在特定领域中应用的革新性无需向量嵌入的RAG技术
论文地址:https://arxiv.org/ftp/arxiv/papers/2401/2401.11246.pdf 原文地址:https://cobusgreyling.medium.com/prompt-rag-98288fb38190 2024 年 3 月 21 日 虽然 Prompt-RAG 确实有其局限性,但在特定情况下它可以有效地替代传统向量嵌入 …...

线性代数 - 应该学啥 以及哪些可以交给计算机
AI很热,所以小伙伴们不免要温故知新旧时噩梦 - 线代。 (十几年前,还有一个逼着大家梦回课堂的风口,图形学。) 这个真的不是什么美好的回忆,且不说老师的口音,也不说教材的云山雾绕,单…...

力扣面试150 Pow(x, n) 快速幂 负指数
Problem: 50. Pow(x, n) 解题方法 👨🏫 参考题解 复杂度 时间复杂度: O ( l o g 2 n ) O(log_{2}n) O(log2n) 空间复杂度: O ( 1 ) O(1) O(1) Code class Solution {public double myPow(double x, int n){if (x 0.0f)return 0.0d;long b…...
连接navicat报错2059 解决办法
这里写自定义目录标题 连接navicat报错2059 解决办法 连接navicat报错2059 解决办法 打开终端工具输入 mysql -hlocalhost -uroot -p回车(enter),输入密码后进入 mysql 。(PS: -h 后面是数据库地址, -u 后…...

Unity-UGUI系统
UGUI是什么 UGUI是Unity引擎内自带的UI系统官方称之为:Unity Ul 是目前Unity商业游戏开发中使用最广泛的UI系统开发解决方案 它是基于Unity游戏对象的UI系统,只能用来做游戏UI功能 不能用于开发Unity编辑器中内置的用户界面 六大基础组件 概述 Canvas EventS…...

配置AC和AP上报KPI指标信息实验
配置AC和AP上报KPI指标信息示例 组网图形 图1 AP直接上报KPI指标 图2 AP通过AC透传上报KPI指标 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 在云管理的ACFIT AP组网中,通过WMI上报机制,将AC和AP的KPI指标信息上报到iMast…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...