上海交通大学暑假学校,讲授《AlgorithmsAndAnalysis》(2)

在上海交通大学暑假学校的讲课,已经3周,也就是一个字:“累”。
此前,主讲夏令营和冬令营,每次两个星期,上午讲课,下午则是将上午讲课的内容设置为比赛,学生在测试数据、解析和带注解的程序支持下,进行解题。两周后,学生疲劳;而我,也非常累。所以,对于这次上海交大暑期学校的授课,此前,除了学术上的准备,在体能上,也进行了储备。
一方面,上海进入酷热盛夏,每天从复旦到交大,讲课两小时,再回复旦;另一方面,由于我的中文版著作新版已经脱胎换骨,同学们要求双语版授课;所以,对于体力,消耗极大。
本周的讲课和解题实验,基于《Algorithm Design Practice for Collegiate
Programming Contests and Education》的第2章、第5章和第6章。
周一,讲授模拟,在讲授了直叙式模拟,筛选法模拟,构造法模拟的思想,阐述了相关的实验试题及其解析之后,讲授试题“Robocode”,这样的试题,规则复杂,要求读题的时候,非常清晰地将复杂的规则组织好;然后,将规则转化为长段代码,在写代码的过程中,不能有任何遗漏;在读题和写代码的过程中,任何小的疏漏都会导致未来debug的庞大的工作量。如果要参加程序设计竞赛,这样的试题,就要在假期训练中,进行磨炼,犹如体育中的体能训练。
周二和周三,讲授贪心算法(Greedy algorithm,又称贪婪算法)的实验范例。
周二的课程,全面回顾数据结构中的贪心算法及其实现:首先,讲授优先队列、小根堆及其算法实现;然后,回顾哈夫曼树以及哈夫曼算法,一方面,体会贪心思想,另一方面,论述基于小根堆的哈夫曼算法实现;最后,讲授实验试题“Fence
Repair”。然后,同样的方法,回顾并查集的算法实现,回顾Kruskal算法,体会贪心思想,论述基于并查集的Kruskal算法实现;最后,论述实验试题。等等。
周三的课程,从经典问题,讲授贪心。
周四和周五,讲授动态规划。从经典的问题入手,让同学们体会动态规划:阶段、状态、状态转移方程、最优化。
Facebook提醒,七年前的现在,我是在台湾交通大学讲课;而现在,我是在上海交通大学讲课。此情此景,我想到台湾纪录片《疾风魅影》的主题歌《飞将在》的歌词:“你真的飞过,五岳三江雄关要塞;可你却飞不过,人生许多的意外。”