计算机科学是个新领域,不过它几乎已经触及人类工作的每个方面。计算机、信息系统、文本编辑器、电子表格的普及,以及使得计算机更便于使用、人们生产效率的精彩应用程序的激增,都显示出计算机科学对社会的影响。该领域有个重要的部分,涉及如何让程序设计更容易以及让软件更可靠。不过从根本上讲,计算机科学是一门抽象的科学,它为人们思考问题以及找到适当的机械化技术解决问题而建立模型。
其他科学是顺其自然地研究宇宙。例如,物理学家的工作就是理解世界是如何运转的,而不是去创造一个用物理定律能更好地理解的世界。而计算机科学家则必须抽象现实世界中的问题,使其既可以为计算机用户所理解,又可以在计算机内加以表示和操作。
进行抽象的过程有时很简单。例如,我们能熟练地用“命题逻辑”这种抽象方式,为制造计算机所使用的电子电路的行为建模。通过逻辑表达式进行的电路建模是不准确的,它简化了或者说是抽象掉了很多细节,比如电子流经电路和门所花的时间。然而,命题逻辑模型已经足够帮助我们顺利设计计算机电路了。我们将在第12章中更多地探讨命题逻辑。
再举个例子,假设我们要为各种课程的期末考试排定时间。也就是说,我们必须为各门课程的考试指定时段,只有在没有学生同时选择某两门课程的前提下,才将这两门课程的考试安排在同一时段。如何为这一问题建模,起初可能不太好确定。一种方式是为每门课程画一个称为节点(node)的圆,如果有学生同时选择了两门课程,就画一条线来连接相应的两个节点,这条线称为边(edge)。图1-1表示了5门课程可能的关系图,这幅图就是课程冲突图。

图 1-1 5门课程的课程冲突图,两门课程之间的边表示至少有一个学生同时选择了这两门课程
有了课程冲突图,我们就可以通过在图中反复找出并删除“最大独立集”来解决考试安排问题。独立集是没有边相连接的节点的集合。如果不能再向某独立集添加图中的其他节点了,那么就说这个独立集是最大独立集。即,一个图中包含节点数目最多的独立集称为最大独立集。在说课程时,最大独立集就是指没有共同学生的课程的最大集合。在图1-1中,{经济学,英语,物理}就是一个最大独立集。最大独立集中的这些课程被指定到第一个时段。
我们从图中删除第一个最大独立集中的节点以及这些节点附带的边,接着在剩下的课程中找出最大独立集。下一个可选的最大独立集是单元素集{计算机科学}。这个最大独立集中的课程便被分配到第二个时段。
如此重复找出并删除最大独立集,直到课程冲突图中不再有任何节点。至此,所有课程都已经被分配到各时段中。本例中,在两次迭代之后,课程冲突图中就只剩下数学节点了,而它就组成了最后一个最大独立集,将被指定到第三个时段中。形成的考试排期如下:
时段 | 课程考试 |
---|
1 | 经济学,英语,物理 |
2 | 计算机科学 |
3 | 数学 |
这一算法不见得会将各门需要考试的课程分布在数目尽可能少的时段中,不过它很简单,而且生成的时间安排中所含的时段数目往往接近最小值。利用第9章介绍的技术,它也很容易被设计成计算机程序。
请注意,这种方式会将一些可能很重要的问题细节抽象掉。例如,它可能会让某个学生在5个连续的时段内参加5科考试。也许我们可以建立这样一个模型,对某个学生一次可能连续参加考试的科目数加以限制,不过这样一来,建立的模型和考试安排问题的解决方案都可能变得更加复杂。
抽象:不用担心
读者可能会对“抽象”这个词有所忌惮,因为我们都有这样一种直觉:抽象的东西都是难以理解的。例如,人们一般会认为抽象代数(研究群、环,诸如此类)要比高中时学的代数难。然而,我们所使用的抽象意味着简化,是将现实中复杂而详细的情景替换为解决问题所使用的可理解模型。也就是说,我们将那些对解决问题而言影响甚微或根本没有影响的细节“抽象掉”了,从而建立一个让我们能处理问题实质的模型。
通常情况下,找到好的抽象方式是相当困难的,因为计算机能执行的任务有限,执行速度也有限。在计算机科学的初期阶段,一些乐观主义者认为机器人很快就能像《星球大战》中的C3PO机器人那样神通广大。自那时起,我们已经了解到,要让计算机(或机器人)具有“智能”行为,就需要为计算机提供一个本质上跟人类所支配的世界一样详细的模型,不仅要包括事实(“萨莉的电话号码是555-1234”),还要包括原则和关系(“如果抛出某物体,它通常会向下 坠落”)。
我们在“知识的表示”这一问题上已经取得了很大的进步,设计出了一些抽象方式,可用来构建进行某类推理的程序。有向图便是这种抽象的一个例子,它用节点表示实体(“猫”或“松毛”),用从一个节点指向另一个节点的箭头(称为弧)代表关系(“松毛是只猫”,“猫是动物”,“松毛的牛奶碟子归松毛所有”),图1-2就展示了这样一幅图。

图 1-2 这幅图用于表示与“松毛”相关的知识
另一种实用的抽象是形式逻辑,它让我们可以运用推理规则推导事实,比如“如果X 是只猫,Y 是X 的母亲,那么Y 是只猫”。不过,为现实世界或其关键部分建模(或者说是对其进行抽象)的过程,却仍是计算机科学所面临的一大挑战,是近期没法彻底解决的。