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

2024-04-29 02:38

本文主要是介绍2020华为软挑热身赛-这些坑我帮你踩过了(华为软件精英挑战赛编程闯关),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

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

他来了,他来了,他带着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,做好阅读理解,先简化条件,提交一个有成绩代码。在此基础上,再继续迭代算法,相信我,你的心态会完全不一样。

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

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

完。

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

这篇关于2020华为软挑热身赛-这些坑我帮你踩过了(华为软件精英挑战赛编程闯关)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/944918

相关文章

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

软件设计师备考——计算机系统

学习内容源自「软件设计师」 上午题 #1 计算机系统_哔哩哔哩_bilibili 目录 1.1.1 计算机系统硬件基本组成 1.1.2 中央处理单元 1.CPU 的功能 1)运算器 2)控制器 RISC && CISC 流水线控制 存储器  Cache 中断 输入输出IO控制方式 程序查询方式 中断驱动方式 直接存储器方式(DMA)  ​编辑 总线 ​编辑

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)

免费也能高质量!2024年免费录屏软件深度对比评测

我公司因为客户覆盖面广的原因经常会开远程会议,有时候说的内容比较广需要引用多份的数据,我记录起来有一定难度,所以一般都用录屏工具来记录会议内容。这次我们来一起探索有什么免费录屏工具可以提高我们的工作效率吧。 1.福晰录屏大师 链接直达:https://www.foxitsoftware.cn/REC/  录屏软件录屏功能就是本职,这款录屏工具在录屏模式上提供了多种选项,可以选择屏幕录制、窗口