2020华为软挑热身赛-这些坑我帮你踩过了(华为软件精英挑战赛编程闯关)

article/2025/9/15 15:45:46

本文始发于个人公众号【两猿社】。

声明,为保证比赛公平,本文不会提供比赛源码,仅提供思路与踩坑经验。

他来了,他来了,他带着面试绿卡走来了。

他来了,他来了,他带着20w大奖走来了。

一年一度的华为软件秃头挑战赛如约而至,为了帮大家踩坑,社长又一次参赛了,你还不来吗?


2月下旬,我写过一篇有关华为软挑参赛经验的推文:O准备如何苟进复赛圈?华为软挑开挂指南(附赛题预测),本以为这样的题目能吸引不少的读者,甚至找大佬公众号转载过,不曾想阅读量依旧十分惨淡。

但,实话实话,里面还是有点东西,比如有关赛题的预测、时间的预测,相信今年的参赛者会会心一笑。

除此之外,还有满满的参赛经验,如果还没读过的同学,建议读一下。虽然不会保证你进复赛,但至少可以让你在冲往复赛的路上,多一些信心,少一些遗憾。


  • 00 新赛制吐槽
  • 01 赛题解析
  • 02 代码反馈
  • 03 思路分享
  • 04 并行讨论
  • 05 好言相劝

00 新赛制吐槽

今年的赛制与往年不同,多了一个**“热身赛”**,这在流程上繁琐了不少,不遗余力推广鲲鹏平台的目的却明显了许多。

热身赛分为两个阶段,知识竞答和编程闯关全程都围绕鲲鹏处理器展开。不过,推广自家产品也是人之常情嘛。

说回比赛本身,知识竞答和编程闯关是递进式比赛,其中知识竞答取得80分,满两个小时后,自动进入编程闯关

这种赛程设定,社长目前还不能领会赛方的用意,难道是打广告?那这广告是不是硬了点啊…

最后吐槽一下,比赛官网和评分系统。我完全相信华为公司的技术实力,但热身赛刚开始,却颇有一种大家都来找bug的韵味。

  • 细数系统上线至今的Bug
    • 第一阶段达到80分两个小时后,却无法在第二阶段上传代码
    • 上传了代码,过了一天却没有任何评分和反馈
    • 登录界面跳转延迟
    • 定时更新时,提交代码延迟

不过,能用就好了,不能要求太多…


01 赛题解析

赛题摘录

  • 在本次比赛中,我们准备了已经做好了特征工程处理的数据和对应的样例代码,您需要优化模型提升准确率和性能
  • 请您结合对机器学习算法的理解并结合鲲鹏处理器的特点对其进行优化,我们将会利用您的代码针对训练数据进行建模,并对测试数据进行预测。

运行要求与判题指标

  • 建模+预测要求在15分钟之内完成。
  • 模型准确率低于70%不计分,高于70%分为四档,最终执行时间最短者胜出
  • 准确率在 [70%,80%) 之间,其中最终执行时间为实际时间乘以200%
  • 准确率在 [80%,90%) 之间,其中最终执行时间为实际时间乘以150%
  • 准确率在 [90%,95%) 之间,其中最终执行时间为实际时间乘以120%。
  • 准确率在 >=95% ,其中最终执行时间为实际时间乘以100%

赛题解读

  • 之前的赛题预测,我提到过,为了照顾参赛者,刚开始不会全线上AI和机器学习。这次的热身赛数据,虽然披着机器学习的外衣,但对参赛者真的是保姆式照顾。跳过数据清洗和特征工程步骤,直接将提取好的特征作为赛题输入,极大的降低了参赛者门槛。
  • 通俗讲,赛题打算通过研究现有数据的规律,然后对新数据进行二分类。
  • 赛题数据
    • 训练数据8000条,1001列。 其中,前1000列为特征,特征数据为浮点型。最后一列表示二分类结果,数据为整型,0和1。
    • 测试数据2000条,1000列,全部表示特征,数据为浮点型,正负样本比例接近3:7
  • 判题指标
    • 代码运行时,从文件读取开始,经过模型训练和模型测试,到生成结果文件为止。
    • 后台对新数据的分类结果进行测试,最终比赛结果以运行时间进行排名。
    • 只要够快,70准确率的算法也可以打败100准确率的算法。
  • 示例代码
    • 完整且规范的输入输出
    • 基础的逻辑回归算法实现

02 代码反馈

面对提交后的代码反馈,很多初次提交代码的同学表示疑惑不解。这里,社长对各个参数进行简单介绍。

反馈信息

  • 31% THE RESULT IS INCORRECT.
    • 这种情况得分为无,表示没有分数。
    • 31%,表示测试集的通过率。按判题要求,31小于70,模型准确率低于70%不计分。
  • 83% PASSED.
    • 这种情况下,有分数。
    • 具体的,按照四档要求,与运行时间挂钩。
  • 0% TIME LIMIT EXCEEDED.
    • 这种情况下,表示超时。
    • 有两种情况,其一是你的模型线上时间过长,超过15分钟;其二是你修改了官方路径

日志下载

  • 平时写代码习惯了,都是查看日志来调试。
  • 但这里的日志下载,目前来看没什么用。比赛群里答疑专家也说,不提供日志下载

恕我直言,那,你放个选项在这里有什么用?

假装有日志,黑盒调试?


03 思路分享

始终坚信:最好的成绩可能不是最牛的算法,但肯定是对赛题和业务理解最深入的算法

线上能有成绩并不难,难的是,有成绩了,却发现读个文件都比别人跑完的时间长。

  • 阅读理解要做好
    • 官方的题目要求:我们准备了已经做好了特征工程处理的数据和对应的样例代码,您需要优化模型提升准确率和性能
    • 很多人以为只能在官方示例上调试,硬着头皮看LR,到头来终于看懂了,却发现大清亡了,前十都冲进5秒了
    • 建议目光不要被逻辑回归吸引,那只是示例代码,没有说只能对LR优化。目前可以弃疗,着手看看其他算法了。
  • 逆向工程大法好
    • 之前的推文里有提到逆向工程,比如18年的判题公式漏洞,19年的解死锁判题器。今年,我们同样可以从判题规则出发,开展逆向工程,将规则深入剖析。
    • 判题规则提到,正确率区间内,按运行时间计算分数。那么,两者到底是什么关系?“热身2群”里有位参赛者提出了这样的疑问:(acc0.7, 10s*200%) < (acc0.85, 1min*150%) < (acc0.95, 5min*120%) < (acc 0.99, 10min*100%),最终0.7准确率胜出。所以,相比之下,程序运行时间更有用
    • 在正确率区间内,尽可能调整模型训练参数以降低运行时间。另外,提交的程序中不要有任何输出,比如cout,printf。
  • 时间就是生命
    • 哪里最耗时,就消灭哪里。以C++为例,通过CLOCK函数对程序各模块运行时间进行监测,找出耗时的痛点,一举解决掉它。
  • 上传路径不要动。
    • 官方Demo中的各个文件路径,不要修改。否则,会出现0% TIME LIMIT EXCEEDED. 警告。
  • 版本控制要做好
    • 本来,我以为到正式比赛才会出现这种情况。但昨天下午,群里就有小伙伴发现改不回原来的版本了。这里,社长再啰嗦几句,版本控制一定要做好。
  • 不要过于依赖保姆
    • 今年赛方真的是一站式保姆的典范,示例中文件的输入输出都写的非常完整。
    • 但,官方写的规范但不够大胆,如果最后触及到了I/O瓶颈,一定要记得拿它开刀。

以下是不推荐的做法,这里权当反面教材。

如果这样做,很有可能最后被判定为作弊,切莫以身试法

  • XJB算法之随机调参
    • 各届软挑大赛中流传已久的打法,老油条们应该不陌生,无章无法,自成一派。
    • 相信大家都知道了线上数据集中的分布,1类接近69%,0类接近31%。所以能不能设置随机种子,随机生成类别?万一呢?
  • 线下调参线上用
    • 这种打法适用于线上和线下数据集相似的情况,换了数据也不怕
    • 19年有团队线下训练练习赛地图参数,在正式比赛直接读入参数,输入车辆信息,输出规划的路径。然而,最后被踢出榜单了。
    • 今年比赛,线下数据集和线上数据集特征维度相同,正负样本比例相似,所以?

04 并行讨论

听信群友传言,社长也对代码做了多线程和多进程处理。

但现实太骨感了,使用欧拉系统线下有效,却线上爆表,说多了都是泪啊…

  • Base0Base1均是单进程单线程的处理模式。
  • 多线程0在Base0基础上进行改进,两个线程,相较于单线程的时间不降反增。由于多线程涉及上下文切换与线程切换,从结果来看,多线程的切换开销,相较于比单线程所减少的处理时间而言,得不偿失。
  • 多进程0在Base0基础上进行改进,父子进程通过共享内存通信,相较于单进程时间上升幅度过大。经过后面分析,发现我在子进程里写了睡眠时间20s,发现判题系统中会跟踪所有进程,不是仅计算父进程的运行时间,这一点大家尤其要注意。
  • 多进程1在Base1基础上进行改进。修改上述多进程的问题后,发现时间还是在增大。从结果来看,多进程所涉及的进程切换开销较大,仍是得不偿失。

这里对判题系统和多线程,多进程的使用讨论一下,希望能对各位小伙伴有帮助。

并行与并发

  • 并行
    • 在处理器上,可以同时运行多条指令。
    • 可以同时处理多个任务。
  • 并发
    • 在处理器上
    • 可以处理多个任务,但不是同时。

进程和线程

  • 进程的调度和资源分配是操作系统负责
  • 线程的调度和资源分配是CPU负责
  • 进程是操作系统资源分配(包括cpu、内存、磁盘IO等)的基本单位,一个CPU同时刻只能执行一个进程
    • 单核CPU实现多进程,并发。 通过操作系统的进程调度算法,单核CPU进行进程调度的时候,需要读取上下文+执行程序+保存上下文,即进程切换。
    • 多CPU实现多进程,并行。 不同的进程运行在不同的CPU上。
  • 线程是CPU调度和资源分配的基本单位,一个CPU核心同时刻只能执行一个线程
    • 单核CPU实现多线程,并发。 不同线程为了使用CPU核心,则会进行线程切换,但是由于共享了程序执行环境,这个线程切换比进程切换开销少了很多。
    • 多核CPU实现多线程,并行。 CPU可以将不同线程分配到不同的CPU核心处理器中。
  • 单CPU中进程只能是并发,多CPU计算机中进程可以并行。
  • 单CPU单核中线程只能并发,单CPU多核中线程可以并行。
  • 并行有上限,进程与CPU个数,线程与CPU核心个数有关,并不是所有线程和所有进程都能同时运行

欧拉判题系统分配的资源是单CPU,4核,8G内存。

根据上面的分析,判题系统上可以实现进程并发,线程并行。

多线程和多进程对比

首先,多进程和多线程没有一劳永逸的应用场景,必须要结合实际情况来判断。

  • 多进程
    • 数据共享难,需要用到进程间通信
    • 同步简单
    • 内存占用较多
    • CPU利用率低
    • 切换开销大
    • 创建销毁复杂,速度较慢
    • 编程与调试简单
  • 多线程
    • 共享进程的数据
    • 同步复杂,需要用到锁
    • 内存占用较少
    • CPU利用率高
    • 切换开销小
    • 创建销毁简单,速度较快
    • 编程与调试复杂

大量计算会频繁切换CPU,如有并行处理的必要,建议使用多线程

具体使用情况,由小伙伴自己决定哦。

读文件到底要不要开多线程

个人理解,读文件触及的是I/O的瓶颈,跟CPU是否并行关系不大,而且本来I/O操作就不怎么耗费CPU,所以仅仅读文件,不建议开启多线程

  • 如果非要使用呢?
    • 先忽略线程切换消耗的时间。不同线程切换读文件不同位置的时候,导致磁盘的磁头重新定位就需要一定时间。
    • 读取文件到内存进行存储时,要用到互斥锁,锁竞争也会消耗一定时间。

当然,以上都是理论,具体的,可以代码实战哦。


05 好言相劝

之前的推文,有对参赛经验的总结。这里挑选两个重要的,希望对参加热身赛的各位小伙伴有帮助。

  • 尽量多划水
    • 划群划水划论坛。 划水同学们的福音。混迹八大赛区的群和论坛,与大佬们交流,你总能找到奇思妙想,我是认真的。
  • 步步为营
    • 先完成,再完美。 比赛一开始,不要考虑过于苛刻的条件和因素。基本思路是魔改基础算法+tips,做好阅读理解,先简化条件,提交一个有成绩代码。在此基础上,再继续迭代算法,相信我,你的心态会完全不一样。

最后,预祝大家都能取得理想的成绩。

欢迎骚扰社长,戳文末二维码与社长交流哦。

完。

如果你喜欢这篇文章,不妨顺手关注下面公众号哦。


http://chatgpt.dhexx.cn/article/mlWFM32t.shtml

相关文章

2018华为软挑参赛体验

第一次接触到这个比赛应该是研究生刚入学的时候&#xff0c;在教研室看到了师姐的一份简历&#xff0c;上面就有华为软挑的参赛经历。研一利用空余时间加强C和STL的学习&#xff0c;看完了《C primer》《Effective STL》&#xff0c;自己也写了一些demo&#xff0c;感觉这个比赛…

2022华为软挑编程问题报错总结

for i in number_feature: TypeError: ‘int’ object is not iterable的错误 错误原因&#xff1a;是因为在python里&#xff0c;整型&#xff08;int&#xff09;数据是不能直接用于迭代的&#xff0c;而是应该用range()函数 改为如下图&#xff1a;

2021华为软挑部分答疑——哪些你有错却总是找不到的地方,我来带你找啦(含标准输入代码)

前期工作&#xff1a; 2021华为软挑初探——代码实现 2021华为软挑再探——代码实现 1 关于打包 在windows系统下&#xff0c;先把你写的程序写在src里面的CodeCraft-2021里面 然后在这个页面&#xff0c;将这三个文件压缩就可以上传啦&#xff1a; 2 关于标准输入 标准输…

华为软挑2019

参加软挑的一些感悟 写在前边的话 我本科一直在做嵌入式相关的项目,这是第一次参加软件类的竞赛,不得不说过程确实很刺激,最后止步杭厦赛区50强也很是遗憾,明明很接近,最后输在了代码效率上,本地成绩很好的 python代码 ,上传测评运行时间超限&#xff08;官测环境比本地性能好&…

2021华为软挑初探——代码实现

其他工作&#xff1a; 2021华为软挑部分答疑——哪些你有错却总是找不到的地方&#xff0c;我来带你找啦&#xff08;含标准输入代码&#xff09; 2021华为软挑再探——代码实现 这几天华为软挑好多人也是做的热火朝天&#xff0c;作为一个渣渣小孙也来探探&#xff0c;不探…

2020华为软挑总结

文章目录 一、热身赛编程闯关&#xff1a;评价标准&#xff1a;问题分析 二、初赛问题描述评价标准&#xff1a;问题分析思路一&#xff1a;思路二&#xff1a;思路三&#xff1a;针对思路三的提速&#xff1a; 最终结果&#xff1a; 三、code记录初赛两篇不错的总结三、复活赛…

2022华为软挑比赛(初赛笔记)

文章目录 2022华为软挑&#xff08;初赛笔记&#xff09;1. 赛题要求2. 解决方案2.1 挑选适合的边缘节点2.2 第一轮&#xff1a;最大分配2.3 第二轮&#xff1a;均值分配 总结 本文仓库地址&#xff1a; Github-CodeCraft-2022 2022华为软挑&#xff08;初赛笔记&#xff09; …

2023华为软件精英挑战赛笔记心得(Python实现)

第一次参加华为软挑&#xff0c;问了周围一圈人没人组队&#xff0c;看了眼题目&#xff0c;感觉挺有意思的&#xff0c;就打算自己写来跑一下&#xff0c;不求分数&#xff0c;主要是想学点东西&#xff0c;顺便记录一下。&#xff08;最后跑了195w&#xff0c;自己的能力也就…

2021华为软件精英挑战总结

2021华为软挑32强总结 今年的软挑最终止步于粤港澳赛区第16名&#xff0c;总成本为16亿3979万6349&#xff0c;赛区第一名总成本为15亿3903万4817。 虽然没进入决赛&#xff0c;但是拿到了华为面试直通卡&#xff0c;也喜提广州一日游&#xff0c;算不虚此行了。决赛虽然还在继…

Spring认证中国教育管理中心-Spring Data Neo4j教程一

原标题&#xff1a;Spring认证中国教育管理中心-Spring Data Neo4j教程一&#xff08;Spring中国教育管理中心&#xff09; 5. 开始 我们为 SDN 提供了 Spring Boot 启动器。请通过您的依赖管理包含启动模块并配置要使用的螺栓 URL&#xff0c;例如org.neo4j.driver.uribolt:/…

SpringBoot 整合 Neo4j

1、创建测试类2、集成 SpringBoot 阅读此文之前&#xff0c;必须对 Neo4j 有个初步的了解&#xff0c;如果要实际操作的话&#xff0c;需要自备一个 Neo4j 数据库 本文所涉及代码已开源至 Gitee https://gitee.com/Array_Xiang/spring-boot-neo4j 创建一个 SpringBoot 项目&…

【Neo4j教程之CQL函数基本使用】

&#x1f680; Neo4j &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;C…

Neo4j资料 Neo4j教程 Neo4j视频教程 Neo4j 图数据库视频教程

课程发布地址 地址&#xff1a; 腾讯课堂《Neo4j 图数据库视频教程》 https://ke.qq.com/course/327374?tuin442d3e14 作者 庞国明&#xff0c;《Neo4j权威指南》副主编、《Neo4j 3.x 入门经典》翻译 邮箱&#xff1a;pangguomingyeah.netQQ:1143815700Neo4j技术讨论QQ群&…

Neo4J超详细专题教程,快来收藏起来吧

Neo4J超详细教程 Lecture&#xff1a;波哥 一、Neo4J相关介绍 1.为什么需要图数据库 随着社交、电商、金融、零售、物联网等行业的快速发展&#xff0c;现实社会织起了了一张庞大而复杂的关系 网&#xff0c;传统数据库很难处理关系运算。大数据行业需要处理的数据之间的关系随…

Neo4j教程 Neo4j视频教程 Neo4j 图数据库视频教程

课程发布地址 地址&#xff1a; 腾讯课堂《Neo4j 图数据库视频教程》 https://ke.qq.com/course/327374?tuin442d3e14 作者 庞国明&#xff0c;《Neo4j权威指南》副主编、《Neo4j 3.x 入门经典》翻译 邮箱&#xff1a;pangguomingyeah.netQQ:1143815700Neo4j技术讨论QQ群&…

neo4j教程-安装部署

neo4j教程-安装部署 Neo4j的关键概念和特点 •Neo4j是一个开源的NoSQL图形存储数据库&#xff0c;可为应用程序提供支持ACID的后端。Neo4j的开发始于2003年&#xff0c;自2007年转变为开源图形数据库模型。程序员使用的是路由器和关系的灵活网络结构&#xff0c;而不是静态表…

Neo4j安装教程

1.下载社区版本&#xff0c;java8推荐安装3.*的版本 Neo4j Download Center - Neo4j Graph Data Platformhttps://neo4j.com/download-center/#community 点击下载即可。 2.配置 启动 将提取的文件放在服务器上的永久主页中&#xff0c;例如 D:\neo4j\. 顶级目录称为 NEO4J_…

Neo4j详细介绍及使用教程

文章目录 一、Neo4j介绍1.Neo4j简介2.图数据库简介3.Neo4j的优缺点4.Neo4j的常见应用场景二、使用教程1.下载安装2.数据插入和查询(1)基本概念(2)基本语法Ⅰ.CREATE操作——创建Ⅱ.MERGE——创建或更新Ⅲ.Match操作——查找指定的图数据Ⅳ.DELETE操作——删除节点3.JAVA实战 一…

Neo4j语法教程

neo4j简版教程 create (<node-name:<label-name2>:<label-name2>......>) return <node-name> 可以给一个节点创建多label的node eg: CREATE (dept:Dept { deptno:10,dname:"Accounting",location:"Hyderabad" }) Neo4j CQL创…

【数据库】linux安装neo4j教程(neo4j 4.x)

一.配置jdk neo4j 4.x版本依赖jdk11&#xff0c;需要安装jdk11才能正常启动&#xff08;安装高版本或低版本jdk都不行&#xff09; 1&#xff09;执行uname -a看下系统架构 2&#xff09;根据系统架构下载对应安装包 https://www.oracle.com/java/technologies/javase/jdk11…