前作简单介绍了计算机硬件的发展历史和当前计算机硬件的基本结构。我们知道,作为软件开发者,我们几乎只需要知道计算机硬件由 CPU、内存和 I/O 设备组成就可以了,其他细节不一定要详细地了解。

本文我们将简单介绍计算机的层次化结构和操作系统;而后讨论 Linux 中的进程与线程。

阅读全文 »

本文又名:你对真正的 Times 字体一无所知

Times New Roman 在很长时间内是 Windows 平台上 M$ Word 的默认西文字体。所以,很多机构要求作者在文章中使用 Times New Roman 作为西文字体,于是这些作者就开始到处问:怎样在 LaTeX 中使用 Times New Roman 字体。

阅读全文 »

XGBoost 是陈天奇(怪)领衔开发的一套 Gradient Boost 算法实现,比如我会用到它做 LambdaMART 的实验。如果要给它一个评价,那应该是:好用、耐操。

不过,也有甜蜜的烦恼。XGBoost 在每轮迭代后,能够贴心地给出模型在数据集上的指标。比如我会关心 NDCG 指标。然而,这里列印出来的指标,会比事后用标准算法计算出来的值要高不少。

阅读全文 »

所谓字符串匹配,就是拿着一个字符串(也称为模式串),去到另一个字符串(母串)里去查找完全相同的子串的过程。显然,只要能定义相等关系,那么字符串匹配算法可以扩展到任意的序列匹配算法。因此,这会是一类用途很广的算法。

解决字符串匹配问题,最朴素的办法就是拿着模式串逐字符地沿着待匹配的串去比对,每次向前移动一个字符,直到完全匹配或者找不到匹配。显然,这个算法的复杂度是 $O(n\cdot m)$($n$ 表示母串的长度,$m$ 表示模式串的长度),是比较高的。

这里介绍的 KMP 算法,能够在 $O(n)$ 时间内完成任务,它是由 Donald Knuth/James H. Morris/Vaughan Pratt 发明的。当然,你也可以称之为「看毛片算法」——你高兴就好。

阅读全文 »

在软件工程课中,有一个经典的作业题:实现一个小学四则运算器。当然,它有不少变种,比如要求学生预先生成合规的四则运算题目。但不论如何变形,此类问题都绕不开 Dijkstra 提出的调度场算法。

阅读全文 »