
「2019 Python开发者日」,购票请扫码咨询 ↑↑↑
整理 | 琥珀
出品 | AI科技大本营(ID:rgznai100)
一年一度的国际大学生程序设计竞赛(International Collegiate Programming Contest,ICPC)经过 30 多年的发展,已经发展成为颇具影响力的大学生算法编程竞赛,截止目前共吸引来自 111 个国家和地区的超过 5 万名学生、3000 所大学前来参赛,现场比赛共有 400 多次。
近日,第 34 届 ICPC World Final 2019 在葡萄牙波尔图刚刚落下帷幕。
据悉,来自俄罗斯的莫斯科国立大学卫冕成功摘得桂冠。而来自中国的国立台湾大学摘得银牌,排名第五;香港中文大学摘得铜牌,排名第 12。其他入围总决赛的 17 所中国高校分别是:复旦大学、南京大学、北京大学、上海交大、清华大学(并列 13)、北航、浙大、中山大学(并列 21)、华东师范、华南理工、西安交大(并列 41)、北师大、广东工业大学、东北大学、东南大学(并列62) ,此外还有两所高校哈尔滨工业大学、南京理工大学获得荣誉奖。
本次全部排名及参赛成绩如下:
ICPC 2019 试题:
https://icpc.baylor.edu/xwiki/wiki/public/download/worldfinals/WebHome/icpc2019.pdf
历史上,上海交通大学曾分别在 2002 年、2005 年、2010 年三次获得世界冠军。浙江大学也于 2011 年夺冠。在随后紧接着的几年时间里,北京大学团队表现优异,并于 2018 年世界总决赛摘得金牌。
综合情况来看,此次中国仅有两所高校拿牌,必然有其失利原因,不少经历了此次赛事的同学给出了其看法:
以教练身份参赛的 @吴争锴将问题焦点指向了赛题设置的难易度以及参赛者本身是否为职业选手,
“事后跟 PKU 的学弟交流,确实不论从我场外感受还是他们实际经验,感觉榜都是被 Warsaw 带歪的,E 我认为绝对不是场上最简单的题,题意就七弯八绕很费解,A 和 D 都要直观很多(D 的题意也蛮难理解的)。”
“我只能说这比赛又不是职业竞赛,参赛全凭兴趣,人各有志,不同人参加的目的不同,想得到的东西不同,投入程度自然也不同,没必要强求。”
参赛选手之一的 @shgqmrf15 认为总决赛意味着代表国家出战,
“我参赛真的不是说,想着为国争光这种事情,而是怎样自己的经历更好看,想着可以出来旅游了。但我真切的希望,少一点我这样的人,多一点真正热爱算法竞赛,真正能担负起出征 final 是代表国家这种想法的人。”
@sunset 则希望不要单纯只看重夺金这件事,
“近年 ICPC 金牌含金量逐年下降,希望国内队伍能把追求提高一点,不要局限于拿了金牌就满足了。”
甚至某青少儿编程培训机构也前来留言:
“如果从娃娃阶段开始接触算法竞赛,在 ICPC 这类国际性赛事要取得理想成绩,将会上新台阶。”
历届赛程
据官网介绍,ICPC 最早可追溯到上世纪 70 年代,当时的主办方是当时的主办方是the Alpha Chapter of the UPE Computer Science Honor Society。随后,该赛事得到美国、加拿大等高校支持,从 1977 年在 ACM 计算机科学会议期间举办了首次总决赛起,ICPC 开始演变成为一年一届的多国参与的国际性比赛。
进入 1990 年后,中国、俄罗斯等国的大学开始出现在 ICPC 的赛场上,并多次包揽冠军。
ICPC 由几个级别的竞赛组成:本地比赛、区域竞赛、区域锦标赛、世界总决赛(worldfinal)。一个大学可以有多支队伍参加区域预赛,但只能有一支队伍参加全球总决赛。全球总决赛第一名将获得奖杯一座。另外,成绩靠前的参赛队伍也将获得金、银和铜牌。而解题数在中等以下的队伍会得到确认但不会进行排名。
实际上,ICPC 考验的并非单纯考验学生的编程能力,正如其官网所述:“该赛事是一项旨在展示学生创新力、团队精神,以及在压力环境下编写程序、分析和解决问题的创新力的年度竞赛。”
从 ICPC 走出的 AI 王者
王小川
区域赛金奖,入围 WF,现任搜狗 CEO
WF 银牌,今年秋季将加入普林斯顿大学计算机科学系担任助理教授
楼天城
两次 WF 亚军,现为小马智行(Pony.ai)联合创始人、CTO
图:右一
戴文渊
WF 冠军,现为第四范式创始人
唐文斌
WF 银牌,现为旷视科技联合创始人
左一:唐文斌
Percy Liang
WF 亚军,NLP 大牛,现为斯坦福大学计算机系助理教授、斯坦福人工智能实验室成员
值得一提的是,2018 年之后,美国计算机协会(ACM)不再赞助 ICPC。本届赛事,我们看到:中国企业华为成为 ICPC 赞助方之一。
最后附上此次赛事 YouTube 链接:
https://www.youtube.com/watch?v=8-RHNxmYI7Q&feature=youtu.be
(本文为 AI大本营整理文章,转载请微信联系 1092722531)
◆
精彩推荐
◆
「2019 Python开发者日」演讲议题全揭晓!这一次我们依然“只讲技术,拒绝空谈”10余位一线Python技术专家共同打造一场硬核技术大会。更有深度培训实操环节,为开发者们带来更多深度实战机会。更多详细信息请咨询13581782348(微信同号)。
推荐阅读:
❤点击“阅读原文”,查看历史精彩文章。
在前端开发的面试中,关于如何控制并发的问题经常被提及。无论是处理网络请求、文件上传还是其他异步操作,有效地管理并发都是确保应用性能和用户体验的关键。本文将通过一个简单的例子来探讨如何使用JavaScript实现并发控制,并解释其中涉及的核心概念。
一. 问题的提出
想象这样一个场景:你需要同时发起多个网络请求,但出于对服务器负载或客户端性能的考虑,你希望限制同时进行的最大请求数量。例如,如果一次性发送过多的请求,可能会导致服务器过载,或者客户端资源耗尽,影响用户体验。因此,我们需要一种机制来控制并发执行的任务数量。假设每次只能允许两个请求发送,这两个请求完成后其他请求才能发送,我们要怎么实现呢?
思考过程
- 为什么需要控制并发? 当我们有大量任务需要执行时(比如批量上传图片),如果不加以控制,所有任务会同时开始,这可能导致系统资源耗尽,响应变慢,甚至崩溃。
- 目标是什么? 我们的目标是设计一个可以动态调整并发数的机制,使得我们可以控制任意时刻最多有多少个任务正在执行。
二. 设计思路
要想保证每次只能两个任务进行,那我们首先能想到哪种数据结构呢?当然是数组了,先存入两个要执行的任务,当这个数组里有任务完成后,再添加进新的任务。这样每次都保证数组里的两个任务执行,从而实现并发控制。
核心思考点
- 任务队列:我们需要一个地方来存放所有的待执行任务。这里我们可以使用数组作为我们的任务队列。
- 状态管理:我们需要跟踪当前正在运行的任务数量。可以通过一个计数器变量来实现这一点。
- 调度逻辑:当某个任务完成时,我们应该从队列中取出下一个任务并开始执行它。为了实现这一逻辑,我们需要监听任务完成的事件,并根据情况调用调度函数。
三. 实现难点
1. 监听任务完成
由于每个任务都是异步的(比如网络请求),我们需要知道什么时候这些任务完成了。JavaScript中的Promise
对象提供了一种很好的方式来处理异步操作的结果。通过.then()
方法,我们可以在任务成功完成时得到通知;通过.catch()
方法,我们可以在任务失败时得到通知。
2. 动态调度任务
一旦我们知道了一个任务已经完成,我们就需要触发下一轮的任务调度。这意味着我们需要重新检查当前是否还有空闲的并发槽位,并从任务队列中取出新的任务来执行。
代码实现
js 代码解读复制代码class Limit {
constructor(paralleCount = 2) {
this.tasks = [];
this.runningCount = 0;
this.paralleCount = paralleCount;
}
add(task) {
return new Promise((resolve, reject) => {
this.tasks.push({task, resolve, reject});
this._run();
});
}
_run() {
while (this.runningCount < this.paralleCount && this.tasks.length) {
const {task, resolve, reject} = this.tasks.shift();
this.runningCount++;
task().then(() => { // 一个任务完毕了
resolve()
this.runningCount--
this._run()
}).catch((err) => {
reject(err)
this.runningCount--
this._run()
})
}
}
}
const limit = new Limit(2);
function addTask(time, name) {
limit.add(() => ajax(time))
.then(() => console.log(`任务${name}完成`))
.catch(() => console.log(`任务${name}出错`));
}
运行结果如下:
通过上述分析和实现,我们不仅解决了并发控制的问题,还深入理解了其背后的原理和设计思想。这种模式不仅可以应用于网络请求,还可以扩展到任何需要控制并发执行的任务场景中。
评论记录:
回复评论: