知识运用的思维
其中一次作业是 approximate bit counting 的C语言实现,这是一个以时间换空间的近似计数算法,具体说来,这个算法将大小为
n
n
n 的滑动窗口的计数问题的空间复杂度降低到
O
(
log
n
)
\mathcal{O}(\log n)
O(logn),对于给定参数
k
k
k,使用由小到大依次为
2
0
2^0
20,
2
1
2^1
21,
2
2
2^2
22,
…
\dots
… 的分组来存储当前窗口的计数信息,每组中 bucket 的个数为
k
k
k 或者
k
+
1
k+1
k+1,我发现对于
2
0
2^0
20,
2
1
2^1
21,
2
2
2^2
22的具体实现,95%的作业实现使用了pow
函数或者循环,而不是表达更为直接的移位操作。
对于 merges 的计数和复杂度分析,我自己在做这个问题的时候第一反应是使用平摊分析,推演后得到了结果。批改作业时,有很多思路不明晰的同学写了一些分析过程,有的凑巧接近答案,有的并不接近答案,但是根据给出的代码框架,完全可以通过观察控制台的输出给出一个合理的结论而不是仅凭主观猜测。
科学方法是一种有系统地寻求知识的程序,涉及了以下三个步骤:问题的认知与表述、实验数据的收集、假说的构成与测试。——Wikipedia
从17世纪培根倡导的实验科学,到数学工具和理论分析能力的发展和进步,然后才是计算机学科的诞生。对于这门很新的学科的知识探索,我在思考的过程中完全摒弃实验而直接进入理论分析的行为是否需要更正呢?
也许要从科学的起源分类谈起。
据说文解字,科,会意字:“从禾从斗,斗者量也”;故“科”学一词乃取“测量”之学问之义为名。从唐朝到近代以前,“科学”作为“科举之学”的略语,“科学”一词虽在汉语典籍中偶有出现,但古中文中“科学”一词所指涉的概念与近代中文“科学”不同,大多指“科举之学”。
现代科学一般说来可划分为三大分支:形式科学(如逻辑、数学、理论计算机科学),研究抽象概念;自然科学(如生物学、化学、物理学、地理学),在最宽泛的意义上研究自然;以及社会科学(如经济学、心理学、社会学),研究个体与社会。不过,对于形式科学能否确实算作一类科学存在不同意见,因为其并不依赖经验证据(empirical evidence)。而运用既有科学知识以达成实用目的的学科,如工程学和医学,则被归为应用科学。
我更倾向于计算机科学是应用科学的观点,而其中的某些小的分支,也在一定程度上隶属于形式科学。这样说来,直接把计算机学科归属于某一类科学的做法本身就是不妥当的,而对于我的思维方式,我将其归于自己对形式科学的盲目崇拜。通俗地说,我曾一度觉得只有充满了逻辑推演的草稿纸才是真正的大牛,所以在思维上更多会想为什么是这样,而不是从实验分析入手。可是同时,作为一名码农,每日进行的最基本的调试过程就是切切实实的实验,这样看来并不应该小觑实验的价值。
如何优雅地写证明
来自K老师的建议:
- 合理使用符号:正确选择符号,先给出明确的、无歧义的定义
- 使用简短清楚的句子
- 不要在证明中重复定义(如,单调性)
- 使用数学归纳法先给出明确的陈述,明确表述归纳对象
- 每一步推理都给出明确的论据
- 多使用前向推理可以使推理更自然流畅
- 对于量词的使用要谨慎
- 证明中省略的步骤必须是最简单的推理
- 好的证明不应该太长也不应该太短,而是刚刚好
批改作业的原则
- 分数要真实反映作业水平
- 扣的每一分都要能解释清楚出原因
- 最低分要给谨慎打出
- 打分时的不谨慎会给答疑时增添无数麻烦
- 作业评语多总比少好,学生希望从扣的分数中学到东西
降低自己的工作量
使用脚本对作业进行批处理,如解压一大波递归文件时使用的命令
find . -name "*.zip" | while read filename; do unzip -o -d "`basename -s .zip "$filename"`" "$filename"; done;
习题课
一共上了两次90分钟的习题课,第一次是讲作业答案,第二次是说明作业要求。讲作业答案的要点:问题有多重解法,一定先讲清楚一种解法;不要针对某些同学的答案;多使用白板。
说到白板,最近被要求在组里定期做白板报告,还让我从头复习DFA,绝望.jpg
后续
老师第一次开这门课,我也是第一次做助教,一边学一边以其昏昏使人昭昭,好说歹说一学期挺过来了,学期末打分时候学生对于作业的评价怨声载道,主要是作业覆盖知识点和发布时间的分布不合理。这学期也在做助教,因为是上过的内容而且今年的难度降低,选课人数少,工作量就下降了不少!