计算机科学的思考

 

计算机科学的思考

分类: 基础 1213人阅读 评论(0) 收藏 举报
 

计算机科学的思考

(2011-02-24 02:40:01)
标签:

it

分类: 工作篇

对计算机科学的反思

李国杰

从第1台电子计算机问世到现在已经60年了,尽管计算机科学和技术继续保持高速发展的态势,但是计算机科学与技术不能再采用以往一样的方式发展,需要革命性的突破。如果一直顺着过去形成的惯性发展,计算机科学的路子可能会越走越窄。我们需要静下心来,认真进行反思,总结经验和教训,以便将来更快更好地发展。

 

计算机科学的迷途

1.计算机科学不应以把解决方案搞复杂为荣

普遍认为,计算机科学是“算法的科学”。美国计算机学会(ACM)对计算机科学有如下的定义:Computer Science as the "systematic study of algorithmic processes that describe and transform information: their theory, analysis, design, efficiency, implementation and application"。算法研究应该是计算机科学的重要内容,但是从某些意义上讲,计算机科学“成也算法,败也算法”。

计算机科学有两个基础:可计算性和计算复杂性。可惜,目前学习可计算性的主要兴趣在证明某些问题不可计算;学习计算复杂性的主要兴趣在证明NP困难问题。在其他学科中很少见到科学家对不可解或实际上几乎不可解的问题有这么大的兴趣。电子工程科学真正帮助了电路设计,如芯片设计的EDA工具在集成电路产业发展中功不可没。但计算机科学并没有大大减轻编软件的困难,软件设计理论的确需要革命性的突破。

上世纪70年代有一本书《计算机和不可解性(Computers and Intractability)》,作者是M. R. Garey和D. S. Johnson,很多学校都采用作为本科高年级或研究生教材,影响很大。这本书的扉页上有一张漫画,漫画中一个人说:这个问题我不能解决,但是你也不能解决,因为它是NP完全问题。说话那个人表现出十分得意的样子。这幅漫画影响了计算机界几十年,从事计算机科学研究的人对解决不了实际需要攻克的困难问题一般不会有任何内疚,因为这是大家都解决不了的NP问题。这种导向对计算机科学已产生了不好的影响。我们真正需要的不是发现一些理论上复杂的问题,而是要在用户满意的前提下尽可能有效地解决实际存在的复杂问题。计算机科学不应以把解决方案搞复杂为荣,尽可能用简单方法处理复杂问题是信息技术的生存之道。

2.应当重视确定可有效求解的问题边界

我们做的研究工作多数是改进前人的算法或理论模型,至于沿着已开辟的方向究竟还有多大改进的余地却很少考虑,很可能这一方向已到了可有效求解的问题边界,而另一方向有很广阔的改进空间我们反而没有触及。

15年前,美国纽约大学的施瓦茨(Schwartz)教授在智能中心做过一个报告。他说,数学上已知的(knowable)问题边界极不规则(如图1所示)。就像油田开采一样,在某个位置钻井有油,偏离一点就没有油。问题的可解性也很类似,某个问题在某些条件下是易解的,但是如果条件稍微改变一点点就很难解甚至不可解了。确定可有效求解的问题边界,应该是计算机科学的重要内容。


图1 数学上已知的问题边界极不规则

3.并行处理不是万能药

并行计算的成功与逐步普及容易使人产生错觉,只要是单机难以解决的问题就想求助于并行计算机,但并行计算并不是万能药。

计算机算法大致上可分成三类:(1)线性或几乎是线性复杂性的算法,如分类(sorting)、商务处理等;(2)多项式或较低的指数复杂性算法,如矩阵运算等;(3)指数复杂性算法,如各种模式转换、规划(planning)等。第一类算法一般可用微机或服务器实现;第二类算法和问题规模大或有实时要求的第一类算法需要并行计算机。已知的第二类算法几乎都是科学计算。超级计算对第三类算法帮助不大,加速100万倍也只能稍稍扩大求解问题规模,需要寻找新的思路。

线性提高并行处理能力不可能对付指数增长的组合爆炸问题(NP问题)。解决人工智能等问题的非确定算法(如搜索算法)在并行处理中,会出现加速比远远超过处理机数的异常现象(好的异常),但我的博士论文《组合搜索的并行处理(Parallel Processing for Combinatorial Search)》已经证明,好的异常和坏的异常(并行不如串行)要么都存在,要么都不存在。除非能开发出指数增长的并行处理能力,否则用生物计算机的所谓海量并行也不可能有效地解决组合爆炸问题。解决人工智能等组合爆炸问题的根本出路在于对所求解问题本身的深入理解。

 

计算机科学不仅要研究复杂性,还要研究“简单性”

1.复杂性与简单性

大多数理论计算机科学家热衷于发现人为的难题,而不是寻求有效的方法解决实际问题。我们不仅需要刻画问题困难程度的“复杂性理论”,计算机科学可能更需要建立“简单性理论”,即如何发现最简单的方法去解决实际问题。由于易解问题的边界极不规则,我们特别需要一种理论指导算法设计者选择努力的方向,需要知道往某一方向努力理论上还有多大的改进空间。

例如,热力学中有一个著名的卡诺循环(Carnot Cycle),其理论表述很简单:

卡诺效率(Carnot Efficiency) = 1 – Tc/Th

Tc和Th分别代表热机工作环境的低温和高温。这一极简单的定律对热机的设计起到非常大的作用。但是,在计算机科学里似乎从未见过这样简洁的对实际设计有指导意义的公式。

2.驾驭复杂性是信息技术创新的基本问题

人工智能领域权威学者布鲁克斯(Brooks)说过:“复杂性是致命的敌人。”系统复杂性研究已成为21世纪最重要的科学内容,但计算机领域的科研人员对这一最活跃的领域似乎关注不够。在钱学森等老科学家的倡导下,我国学者在复杂巨系统和定性定量相结合的研究上已取得不少成果,有些成果应对计算机科学家有重要借鉴意义。

信息技术发展的历史证明:信息技术发展遵循简单性法则,过于复杂的技术往往被淘汰或变成脱离主流的技术,如Ada语言、数据流计算机、B-ISDN(宽带综合业务数字网络)技术等。互联网成功的原因之一在于KISS原则(Keep It Simple and Stupid)。我们应认真总结计算机的发展史,从中发现驾驭复杂性的规律,为计算机领域的技术创新导航。

 

计算机科学要为技术实现“化难为易”提供科学指南

以往的计算机科学为技术实现“化难为易”已经提供了一些科学指南,但是做得还不够。作为一门具有指导意义的科学,计算机科学应该做得更好一些。在“化难为易”方面,下面几个问题值得我们深思。

1.降低问题复杂性的关键是选择合适的问题表述

我刚从美国回国工作时,有感于国内不重视不同于“计算方法”的算法研究,曾呼吁过国内要大力开展真正的算法研究,现在我感到要强调问题的另一面。一类问题的复杂性取决于它的问题表述(问题复杂性可能是计算机科学中很少有的不变量),只要问题表述没有改变,解决某一类问题的算法复杂性的下限就不可能改变。我们花了很多功夫优化算法,但却很少花功夫寻找合适的问题表述,可能是捡了芝麻丢了西瓜。有些所谓NP困难问题并不反映实际问题的本质“简单性”,比如识别人脸对人脑而言可能就是一个简单问题。我们不应研究人如何“绕过”了指数爆炸,而是要研究我们采用的人脸识别表述方法如何把我们引入了指数爆炸的歧路,我们需要做的事情是选择对人脸数据的简单描述的模式。

2.改变问题分解的途径可大幅度提高问题求解效率

我在美国做博士论文研究时,常常采用把一个问题分解成许多子问题的途径来解决复杂问题,这是计算机科学里最常用的Divide and Conquer方法。最近我的导师Benjamin Wan教授告诉我,对有些问题,他现在采用分解限制条件的办法比传统的子问题分解,求解效率可高出上千倍。有些实际问题,像机场的实时调度,可能有上百种限制条件。传统的求解方法是通过问题分解去缩小问题规模,如先分解到部门一级再综合。这样分解后的每一个子问题的复杂性并没有减少。但如果对限制条件进行分解,分解后的每个小问题只包含很少的限制,这样的小问题就极其简单,实际的求解效率可大大提高。

3.虚拟化是化繁为简的关键技术

一部计算机发展的历史可看作计算机技术不断虚拟化的历史。上世纪70年代,IBM 370首先使用虚拟计算机概念。1992年布特勒·兰普森在获得图灵奖时引用别人的话说过:“计算机科学中的任何问题都可以通过另外一个层次解决。”计算机产业的发展不可能完全做到先提出完美的顶层设计再按既定的标准发展,标准往往是在竞争中形成的。为了解决发展过程中互操作和兼容等问题,常常通过虚拟机的思路在更高的层次隐藏下一层的技术细节。我们要把虚拟机的思想理论化,使之成为计算机科学的重要内容。

 

计算机科学应重点突破技术发展的限制

1.一味提高速度不是明智的选择。

这些年来,计算机技术的高速发展得益于摩尔(Moore)定律,所以不少人言必称摩尔定律。其实,计算机技术的发展也受害于摩尔定律。CPU和计算机性能的不断提高,确实缓解了某些过去不容易解决的困难,但也掩盖了计算机科学中的一些基本矛盾,许多问题都指望通过计算机性能提高来解决。现在,芯片和计算机性能的提高已遇到功耗、可靠性和成本三面高墙,计算机科学应重点突破这些技术发展的限制。例如,像现在这样无限制地扩大芯片面积和集成度,一个芯片里集成几亿甚至几十亿个晶体管,造成功耗很大,成本不断增加,可靠性降低。近来许多专家都指出,一味地从提高芯片和计算机的速度上找出路不是一个明智的选择。

芯片器件的复杂性每年增长68%,到2018年单芯片内晶体管数预计将超过140亿个,而芯片设计能力(每个人月设计的晶体管数)每年只增长21%(CPU内大量的芯片面积只能用来做增值不高的缓存)。集成电路产业的瓶颈在芯片设计,若不能有效掌控芯片的复杂性,即使有了10纳米的新工艺,潜在的芯片能力也发挥不出来。怎样才能把芯片所能提供的能力尽量发掘出来,需要在计算机科学上有所突破。

2.吸取工业化进程的教训

我们应该从过去工业化的进程中吸取教训。几十年前,不管是化工还是钢铁,我们的前辈在实现工业化的过程中,并没有认识到他们的做法有什么不对。现在,到了我们这一代,我们发现有很多不合理的地方:没有给我们留下一个美好的环境,污染严重,浪费资源等等。我担心再过50年,我们的后人说,21世纪初有那么一批很蠢的计算机科学家,他们搞的信息化造成很多问题,浪费了很多资源,对人类文明也是一种浪费。我想,与其将来被别人批判,还不如我们自己批判自己,走一条更加符合人类社会发展规律的道路。我们需要反思:计算机科学技术是不是也走了一些弯路,是否应该探索革命性的突破?

计算机科学要寻求大的突破

计算机科学的发展已经到了相对成熟的阶段,如何继续向前发展是每一位计算机科学家需要认真思考的问题。我们需要摆脱过去已经取得的成就的拖累,提出新的发展思路。

1.重新发明网络和操作系统

最近,美国国家自然基金会(NSF)在计算机和通信网络领域提出了新的研究方向,如投入3亿美金的GENI项目,值得我们注意。美国NSF网络和计算机领域的主管官员赵伟教授告诉我,他的基本思想是要reinvention, 一个是要发明新的网络,另一个是要发明新的操作系统。他们认为,改进互联网应该是思科等公司的事,NSF不必为大公司赚钱操心。当网络带宽达到10Tbps时,分组交换可能已不能有效地工作。现在的互联网只相当于邮政系统,NSF应致力于发明相当Express快件系统的新网络。在操作系统方面,NSF不应再支持研究Unix或Linux,而是要创造新的操作系统。

NSF的科研布局使我想起了美国麻省理工学院(MIT)的“不为”原则:“不做只要努力一定能成功的课题”,即要做没有成功把握的研究。我国863计划中有不少工程性很强的项目,要求一定成功是无可非议的。但即使是基金和973项目中,带有reinvention 性质的项目也不多。今后,我们需要做一些目前还不能保证成功的研究。

2.内容处理已成为必须突破的核心技术

当前,内容处理已成为网络浏览检索、软件集成(Web服务)、网格等计算机应用的瓶颈,语义处理也是下一代操作系统的核心技术。形形色色的软件技术最终都卡在语义上,语义处理已成为需要突破的关键技术。人工智能、模式识别等技术已有相当进展,但内容处理还处于重大技术突破的前夜,究竟什么时候能真正取得突破性的进展现在还难以预见。

冯·诺依曼的最大贡献是提出了在单台计算机上把程序视同为数据的程序存储式计算机模型,而语义研究的目标是在整个网络上实现将程序视同为数据。目前的浏览器已能做到不区分本地和远程的数据,将来可能实现的基于语义的操作系统应做到不区分本地和远程的程序。也就是说,我们的目标是实现广义的冯·诺依曼计算机,即联网的计算机真正变成一台计算机,在全球网络上实现程序等同于数据。这是计算机科学家梦寐以求的理想,我们要持之以恒地追求。

 

计算机科学要成为提高办事效率与质量的“事理学”

1.计算机科学本质上是“事理学”

相对于研究物质结构原理的物理学,计算机科学本质上是研究做事效率和成本的“事理学”。所谓做事包括科学工程计算、事务处理、信息服务等各种人类想做的事情。

办事就要讲求章法、讲求系统、讲求组织,不仅仅是算法。盖一幢大楼,包括土木、水电、供暖等各种子系统,建筑公司可以做到相互配合井井有条;但编制大型软件失败的项目比比皆是,原因多半出在各部件和子系统无法协调配合。我们应不应该反思:计算机科学究竟缺了些什么?这里面可能有些根本性的规律我们没有掌握,怎么把一个事情做成功、做好,不仅仅是一个算法优化问题。

2.关注服务科学

最近,IBM公司提出一个新的目标,叫做服务科学(Service Sciences)。专家们认为,服务科学可以将计算机科学、运筹学、产业工程、数学、管理学、决策学、社会学和法律学在既定领域内融合在一起,创建新的技能和市场来提供高价值的服务。促进技术和商务更紧密结合需要新的技能和技能组合,这些技能和应用方法必须从大学起开始教授,创建“服务科学”学科的想法从此诞生。

在美国,整个服务行业创造的价值已占全部GDP的70%以上,服务也需要科学做指导。IBM提出的服务科学全称是SSME,即服务科学、管理和工程,将服务看成科学、管理和工程的结合,把计算机和商务紧密联系起来了。美国很多学校已经开设了服务科学课程,将来培养出来的就是美国的行业工程师。若干年前,当有人从计算机硬件软件中提炼出计算机科学时,不少人奚落嘲笑;现在服务科学刚刚出现地平线上,我们不应当挑剔它的幼稚,要以敏锐的洞察力捕捉先机。

计算机科学应成为跨领域的二元或多元科学

1.寻找被打断的“沟通链条”

近代科学学科划分过细、条块分割,反而模糊了人们对事物的总体性、全局性的认识。德国著名的物理学家普朗克认为:“科学是内在的整体,它被分解为单独的部分不是取决于事物本身,而是取决于人类认识能力的局限性。实际上存在从物理到化学,通过生物学和人类学到社会学的连续的链条,这是任何一处都不能被打断的链条”。

早在100多年前,马克思在《经济学--哲学手稿》中曾预言:“自然科学往后将会把关于人类的科学总括在自己下面,正如同关于人类的科学把自然科学总括在自己下面一样,它将成为一个科学。”面对着越来越复杂的问题,许多研究者开始探索从整体出发的研究方法,试图寻找那条被打断的“沟通链条”。

2.形成跨领域的二元或多元计算机科学

计算机科学需要强调与自然科学、社会科学的交叉,应该成为跨领域的二元或多元科学。将计算机学科分成科学与工程已不合时宜,南加州大学不再按照体系结构作分界线区分计算机科学和计算机工程,而是按分析与综合分类的新框架做区分,以分析为主的叫科学,以综合为主的叫工程,计算机科学主要内容是跨学科的分析,计算机工程主要从事面向系统的综合。计算机科学要大大加强与物理学、生命科学及社会科学的交叉研究,形成计算物理学、计算生物学、社会计算等新学科,还可以形成“计算机+生命+物理”、“计算机+生命+社会”等三元交叉科学。这些交叉学科不仅仅是计算机的应用扩展,而是我们需要高度重视的计算机科学的未来主流方向。要做好这些交叉学科研究,必须加强以超级计算机为基础的计算机模拟与仿真。我们不能认为在Computer+X的交叉学科中,计算机只不过是一个工具。实际上这是若干新的科学,它既不是传统的计算机科学,也不是原来的X学,而是把这两方面或几方面融合起来的新科学。

计算机的发展对未来人类社会也将有重大影响。计算机科学家不但要和其他领域的自然科学家合作,还需要和社会学、经济学、新闻传播等方面的社会科学家更密切地合作。总之,今后计算机科学的研究,不能完全像过去一样走越分越细的以归约还原为主的道路,应当考虑走一条强调综合集成的新道路。

 

对计算机学科教育的反思

和美国NSF信息学部主任赵伟教授的一次对话引起我一些反思,赵伟教授认为,美国学科教育的发展有不同模式,有些封闭保守,有些开放包容。美国较好的学科教育发展模式可能是医学院和法学院,所有相关的知识都吸纳在本学院里,其他的学院一般不教医学和法律课程。工程学科也有较好的吸纳性,其他学院一般不会开设电路设计课。但计算机学科是发散的学科,其他学院可开设各种与计算机有关的课程。计算机科学会不会像数学一样把相关的知识都推出去,只剩下很少的内容?计算机学院将来教什么课?

我国一些计算机教育专家也发现了同样的问题,他们担心计算机科学将逐步变成与现在数学差不多成为一门公共课。其实,如上所述,计算机科学方兴未艾,还有许多计算机科学应该重视的内容尚没有我们进入我们的视野,尤其是计算机科学与自然科学、社会科学的交叉将会大大充实计算机科学的内涵。我们真应当好好梳理一下,不要懵懵懂懂把计算机科学引入了很窄的死胡同。

 

致谢

本文有些观点是在与美国NSF信息学部主任赵伟教授及其他学者讨论中形成的,在此一并表示感谢

 

 

 

 

 

计算机科学的内涵和外延
曾毅

转自微软中国

要想学好计算机科学,我们认为首先要对计算机科学研究的内涵与外延至少有一个概要性的了解。对于刚刚入学的计算机系学生以及虽然学习了很长时间的计算机,但是还是觉得很迷茫的学生来说,究竟计算机科学研究的是什么大部分人可能还不清楚,本文着力论述计算机科学的研究范畴,以对同学们有所启发。


谈到计算机的历史中对计算机科学方向性的确定最应当提的就是美国计算机协会,1946年,美国在华盛顿哥伦比亚大学成立了美国计算机协会ACM(Association for Computing Machinery)他们对计算机学科的发展做出了前瞻性的预测:将计算机学科的发展方向分为三个部分:
[一]计算机基础问题的研究:
(1)计算理论: (theory of computation)
计算理论是关于计算和计算机械的数学理论。
主要内容包括:
1.算法(algorithm):解题过程的精确描述
2.算法学(algorithmics):系统的研究算法的设计,分析与验证的学科
3.计算复杂性理论(computational complexity theory):用数学方法研究各类问题的计算复杂性学科。
4.可计算性理论(computability theory):研究计算的一般性质的数学理论。
5.自动机理论(automata theory):以研究离散数字系统的功能和结构以及两者之关系为主要内容的数学理论。
6.形式语言理论:用数学方法研究自然语言和人工语言的语法理论。


(2)计算几何学:(Computational geometry)
研究几何外形信息的计算机表示,分析和综合的新兴边缘学科,它是计算机辅助几何设计(CAGD)的数学基础。
主要内容如:
1.贝塞尔曲线和曲面 2.B样条曲线和曲面 3.孔斯曲面


(3)并行计算问题 : (parallel computation)
所谓并行计算就是 “同时执行”多个计算问题
他的延伸学科有:
并行编译程序(parallel zing compilers)
并行程序设计语言(parallel programming language )
并行处理系统(parallel processing system)
并行数据库(parallel database)
并行算法(parallel algorithm)


(4)形式化方法(formal method)
建立在严格数学基础上的软件开发方法。软件开发的全过程中,从需求分析,规约,设计,编程,系统集成,测试,文档生成,直至维护各个阶段,凡是采用严格的数学语言,具有精确的数学语义的方法,都称为形式化方法。


(5)程序设计语言理论: (Theory of programming language)
研究书写计算机程序语言的学科。
主要内容:研究语法,语义,语用以及程序设计语言的优劣。


(6)人工智能:
我国人工智能创始人之一,北京科技大学涂序彦教授对人工智能这样定义:人工智能是模仿、延伸和扩展人与自然的智能的技术科学。在美国人工智能官方教育网站上对人工智能作了如下定义:Artificial Intelligence, or AI for short, is a combination of computer science, physiology, and philosophy. AI is a broad topic, consisting of different fields, from machine vision to expert systems. The element that the fields of AI have in common is the creation of machines that can "think".
研究的问题:
(1)符号主义:(符号学派)
符号计算与程序设计基础
知识表达方法 :知识与思维,产生式规则,语意网络,一阶谓词逻辑
问题求解方法:搜索策略,启发式搜寻,搜寻算法
问题规约方法
谓词演算:归结原理,归结过程
专家系统:建立专家系统的方法及工具
(2)联接主义(神经网络学派)
神经网络学派通过研究模拟生命神经组织的工作状况,力求突破人工智能的一些前沿问题。1988年美国权威机构指出:数据库,网络发展呈直线上升,神经网络可能是解决人工智能的唯一途径。


[二]系统:
(7)体系结构:
众所周知计算机界的摩尔定律:计算机硬件性能每18个月翻一番,现在基本上还可以保持这个速度,高计算机体系结构需要大量的人力物力,我们国内只有清华,国防科大,哈工大搞这方面的工作。
目前的新型计算机有:光计算机,量子计算机 ,生物计算机。


(8)网络与通讯:
目前美国已经铺遍了第二代英特尔网,用于远程教学,远程诊断(如机械诊断)我国第二代Inter网上的协同国家重点实验室的评估由北航软件所负责单位,关于具体的研究内容我们在今后的文章会涉及。


(9)面向对象:(OOA,OOD,OOP)
设计类及由类构造程序的方法与过程,用计算机对象模拟现实世界对象。


(10)约束程序设计:
含有变量的关系表达式称为约束。


(11)软件工程:
应用计算机科学,数学及管理科学等原理,开发软件的工程学科
CMM划分将软件工程的等级划分为0—9级,中国的软件设计处于3级


(12)软件质量控制:
软件质量:反映软件系统或软件产品满足明确或隐含需求能力的特性总和。


(13)实时系统与嵌入式系统 :
实时系统:时间标准完全等于系统原模型的系统。
嵌入式系统:作为一个信息处理部件嵌入到其他系统当中的系统。


(14)数据库系统( Database System)
简称 DBS.DBS是实现有组织地、动态地存储大量相关的结构化数据,方便各类用户使用数据库的计算机软件/硬件资源的集合。
即采用了数据库技术的计算机系统。


(15)大规模计算中的I/O
在大规模计算中实现计算机主机与外围设备进行信息交换的技术。
[三]计算机应用:


(16)科学与工程计算:
这个范围很广,简单说说就有: 生物信息处理 ,天气预报等等


(17)电子商务与数字化图书馆


(18)人机交互:三维虚拟现实:应用方面比较突出的比如说外科手术


(19)计算机教育:用于教学,培养计算机人才
关于未来的计算机究竟向何方向发展,我们不妨了解一下,中国科学院前不久对中国计算机科学发展趋势作出了如下论断:概括起来即是:MMOON
即:超大规模计算机+多媒体处理能力+开放式的系统结构+面向对象+网络上的计算将会创造一个人机和谐的计算环境。


下面再谈谈计算科学研究的主线,看看对大家有没有一定的启发:从最底层往上谈起


应用层:


移动计算与全球定位计算机自动控制计算机辅助制造计算机集成制造系统
机器人学 计算可视化与虚拟现实 数据与信息检索计算机创作计算机网络应用软件 科学计算多媒体信息系统计算机辅助设计信息管理与决策系统自然语言处理模式识别与图像处理技术 计算机图形学计算几何人工智能与知识工程
数据表示与存储 网络与开放系统互连标准软件测试技术人机工程学(人机界面)


计算科学专业基础层:


软件开发方法学:软件工程技术,程序设计方法学,软件开发工具和环境,软件开发规范编码理论密码学计算机体系结构程序理论数据表示理论与数据库系统
电子计算机系统基础 计算机接口与通信计算机网络与数据通信技术自动推理
故障诊断与器件测试技术 容错技术 汇编技术操作系统高级语言程序设计
数字系统设计 符号计算与计算机代数 数据结构技术算法设计与分析编译与解释技术


计算科学基础层:


控制论基础数字系统设计基础信息论基础网论(Petri网理论等)形式语义学
框图理论 算法理论 可计算性(递归论)计算复杂性程序设计语言理论
计算模型(各种抽象机) 模型论与非经典逻辑公理集合论形式语言与自动机


数学与物理层:

 

光电子技术基础电路基础电子线路基础数字与模拟电路基础数值分析与计算方法大学物理学函数论基础(复变函数,演算,泛函分析)泛代数概率论与数理统计常微分方程 偏微分方程 集合论与图论组合数学抽象代数数理逻辑基础
空间解析几何 数学分析 布尔代数 高等代数 数论

 

前些阵子发表的《计算机科学与技术学习反思录》引起了一些同学的思索,也收到了很多来信,大家把问题都集中在了到底计算机能干什么,计算机科学研究的领域到底有多宽,我自知没有能力回答这样的问题,只是就我所知的范围作了简单的介绍。谈及这么大的题目就像原来写的那篇《计算机科学与技术学习反思录》,乃是万言难尽,可以写书,甚至可以出书系,然而我觉得只要大家在开始的时候有个概要性的了解,文中方方面面都有所涉及,但是都是概念性的介绍,也是限于篇幅的考虑,我的观点就是以后学到什么看什么,站在高出以后愿意向什么方向看就向什么方向看,但首先要站得高一点,我们思考清楚以后,需要更多就的是去做,而不再是去想了,虽然这个想的过程会很长,但是我们要先想清楚,不要让我们的学习与研究输在起点之上,最后祝大家在计算机科学与技术的学习道路上学业有成。

 

 

 

 

 

计算机科学趋势之我谈

穿靴子的猫 (IP Logged)

常有热血青年问我计算机科学还有啥搞头。

首先我们回顾一下计算机科学的“机械黄金时代”——5/60 年代。这个年代是研究“简单
机械”数学对象的淘金时代。这些数学对象包括:字符串,数列,集合,树,图等等。它
们的特点是:1. 最简单、最机械,就像数学里的"一元一次方程"、物理里的“定滑轮动滑
轮”一样初等。同时这个时代的大背景是应用数学的大发展(冷战时代两个阵营要拼谁的
军事和生产活动达到最优化),因此 2. 这些对象不同于其他纯数学的基本对象在于他们
有强烈的现实应用性。有了什么样的研究对象就决定了会有什么样的研究成果(算法/方法
/原理/应用)。比如,如果研究对象是字符串,就很容易发现我们有实际需求的操作有 压
缩、加密、查找子串 等,于是大浪淘沙,我们有了 ZIP, RSA, KMP 这些堪称经典的结果
;而那些有用但没有有效解法的问题,几乎都被证明是 NPC 的。。。这样,走得通的路都
走通了,走不通的路都被证明是走不通的。。

除了简单机械对象的相关算法设计外,过去几十年同时也是人工智能基本问题的黄金时代
。这些基本成果在它们所在体系中的“根本性”就像牛顿的成果在经典力学体系中的“根
本性”一样,是后人无法再超越的。。。人工智能的一个目的是对“模糊”(非形式化)
信息"形式"的理解,也就是说我们表达的内容可以有各种表现形式:自然语言文本,语音
,图像,影像。对他们的分析(analysis)往往比合成(synthesis)要困难。我举一个非
常典型的例子:语音识别(speech recognition)是对语音数据的分析,语音合成(spee
ch synthesis)是合成,后者的实际成功大得多。要分析我们就不可避免要知道牵涉到的
背景知识(分为“规则 (rules)”和“案例 (cases/samples/examples)”两种,一个案例
就是一个特殊的经验,可以看作一个适用范围最小的规则),还有如何把这些背景知识用
于我们要识别的数据,这又分为两种态度:按逻辑推理 (logic-based reasoning) 和不要
求有严密逻辑推理关系的模糊式、统计式联系(statistical methods 或叫 connectivis
m,就是把“因”和“果”用经验联系起来(知其往往然)而不是用逻辑推理关系联系起来
(知其所以然)),比如初中里的几何证明就是严密的逻辑推理,而 Google 仅仅找到那
些紧密出现你的 keywords 的文章片断就是统计式、模糊式处理,就
像总设计师说的“宜粗不宜细”。根据具体问题的具体条件,两种态度各有所长。人工智
能的另一个目的是对信息“内容”的处理和再创造。前面我们说的是把同一个内容的数据
从一种形式变到另一种形式,比如把一句话从语音形式变到文本形式、把一句话从中文翻
译到英文,其实内容不变。那么对内容本身我们可以做什么有用的操作呢?一方面,我们
可以把内容表示成一种形式化的知识表示,用上面提到的 logic-based reasoning 来推出
新的有用结论。这种操作的局限性在于计算机只能用我们给出的知识反复演绎;尽管我们
可以加入统计性的因素让推理更灵活(同时降低了结果的准确性),但仍然受限于有限的
形式化知识。另一方面,我们可以不拘泥于形式化的知识表示与推理,而是让计算机和人
混和起来思考问题。这时,我们不要求概念和概念之间的可能关系被 完全形式化,但我们
往往还是要求“一个概念只有一个命名”。典型的这种知识表示就是 Wikipedia,它的每
个文章都是一个概念,有唯一的命名(或明确声明多个命名等价),而文章之间的超链接
(不明确表示的关系)使 Wikipedia 成为一个概念的网络。由于概念之间关系的不明确,
我们不说它是一个语义网络(semantic network,知识表示的最重要
方法,与 first-order logic、frames 等价),而是一个概念网络(ontology,即一些概
念的集合,每个概念都有严格的命名)。概念命名形式化而概念关系非形式化的本性决定
了这种东西可以让人和计算机相结合完成某些任务。比如,我心里有一个 idea X,我想知
道它是否已经被别人提出过了,如果被别人提出过了那么它的命名是什么。这是一个很有
实际意义的问题,比如申请专利之前你要查找前人是否已经公布过类似 idea,比如你不知
道一个概念在英语中如何表达(如果这个概念在你的母语中没有一个专门的术语 A 或者虽
然有 A 但是你的双语词典不能为你直接建立 A 到英语对应表达 A' 的映射。。。)。此
时我们就可以基于一个 ontology 如 Wikipedia 来间接寻找 X 的所在。例如我们要找“
热插拔”的英文说法(假设不存在“热插拔”的中文条目),我们可以先想象一下它有什
么特别相关的概念,我们想到“即插即用” (plug and play),因为这两个概念是可比较
的两种硬件安装规格。于是我们先进入英文 Wikipedia 条目“plug and play”: http:/
/en.wikipedia.org/wiki/Plug_and_play 然后我们发现该文章中比较了即插即用和一个所谓“true hot swapping”的相同和不同。通过文章对这个 hot swapping 的描述,我们有很大把握认为它就是我们要找的“热插拔”。我们可以进一步用
这个关键词在其他文献中确定它就是热插拔。这个问题跟查双语字典正好相反,双语字典
是你给出一个已知的母语术语 A,它告诉你 A 对应的未知的外语术语 A' 以及 A' 的未知
的定义 Def_A',而我们刚才说的这个问题是已知一个概念的定义 Def_X,如何知道这个概
念在某个语言中的的命名 Name_X。这又叫 reverse dictionary lookup.

综合以上两段,我们想想我们当代应该研究什么。显然我们不应该再去研究简单机械对象
,那是口枯井(当然如果你不以“有实际用途”为导向去选择研究对象,你完全可以去研
究 100 个方块组成的俄罗斯方块图形有几种(这个美国人 60 年代也研究过了,呵呵)、
人为设计一个类似五子棋的棋类游戏然后研究其制胜策略(这就是所谓趣味数学成果,因
为研究对象可以无穷制造,所以总有研究的空间;这也是为什么某数学家(好像是丘成桐
)教育我们要研究自然界的数学模型而不是那些人工制造出来的数学对象。就算 Knuth 这
种至少有 KMP 这样经典的有用简单机械成果的大牛,也在 70 年代百无聊赖之际研究过游
戏“大智之人”(Mastermind,又叫“猜数字”);而且比尔盖茨在 70 年代哈佛退学以
后还兴致勃勃地研究过翻烧饼的组合数学问题 [1][2];MIT 有个很年轻的加拿大计算机教
授 Erik Demaine,现在华人学者热衷于提起他,他做的最有特色的研究之一是折纸中的计
算机学问。。))。就连在简单机械算法世界里浸淫了几十年的 Knuth 也在 2001 年接受
采访说:“如果。。。人生从头来过,我现在愿意做一个研究机器人学或生化的研究生。
。。理论计算机科学。。。经过五十年的爆炸性发展后,很难想象还有多少发展空间。我
不认为现在对以前的经典结果作小的优化有多大意义。当然我不
能完全否定计算机科学继续发展的可能性,但这种可能性跟生物学是无法相提并论的。。
。计算机科学经过五十年就发展殆尽,而生物学却很容易就提供给我们足够研究 500 年的
问题,两者差距是如此巨大。”[10][12] 有人问,那么计算机科学不是还剩那个圣杯——
“P?=NP”么?让我们看看 Knuth 2002 年在奥斯陆大学的“All Questions Answered”演
讲中是怎么说的:“。。。就算 P==NP,仅仅知道一个问题有多项式时间算法是没有实际
意义的,因为那个指数可能大得超过计算能力。因此也许我们从一开始就不应该提出 P?=
NP 这个糟糕的问题。”[11]在这次演讲中 Knuth 还特别强调要“阅读大师的思想” (Re
ad the masters)。在 2001 年慕尼黑大学另一次同名的演讲[12]中,Knuth 干脆认为“P
?=NP 可能是 Godel 所说的‘不可证明的定理’之一”。

所以我们可以想到,我们当代要研究的对象必然是更复杂的,或者机械的数学世界以外的
活生生的现实问题。比如在劳动人民的生活中,自然语言是全球化背景下一个突出的问题
,同时也是足够复杂的对象;比如股票市场的预测(按道理说这需要计算机知道足够多的
背景知识和内幕消息,因此我对那些统计学者用统计过分简化整个事情是非常鄙视的);
比如宏观经济/社会;比如自然科学如生物、纳米里的复杂结构和功能;比如复杂工程学如
导弹防御系统、机器人、航天;比如经济中的供求双方信息不对称问题(你想找某个很窄
的领域的知识或真人专家,你如何跟这个知识或专家接上头?特别是当这个“很窄的领域
”尚没有特定学名时?这又回归到了我上面说的 reverse dictionary lookup 问题:在对
应的 Wikipedia 页面上留下相关知识和真人专家的联系方式。而作为“卖方”,一个真人
专家如何拓展他的业务范围?他可以观察自己当前领域周边的 wiki 文章是否也可以让自
己去“坐堂”;一个自主学习的学生如何决定自己下一步学什么/研究什么?也是同样道理
。);比如让计算机半自动的穷举、推理、归纳、联想出新的创新机会。

还有一个关键的非技术问题,就是作为学科竞赛中的佼佼者或者感兴趣的小有所成者,如
何展开研究?为什么中国出了那么多大牛前辈却少有知名的研究?第一,OI 中获取的知识
就是上面说的“简单机械世界中的对象及其操作”。OIERS 不管是中级还是顶级选手,主
要擅长的仅限于此,当然我们决不能否定我们向其他空间拓展的潜力。而且我认为大多数
OIERS 都有作出很好研究的潜力。第二,研究的过程不是工程开发或生产,没有固定日程
安排,而是一种商业投机行为,因此需要极大的自由、自主权。投机能力可以通过考虑做
个商业产品来锻炼。一个对机会主义、个人主义、自由主义没有很好的理论觉悟和运用的
人,或者一个受到现实中给定学习方向、研究方向、研究日程所桎梏的人,作不出好研究
。为此我专门另起一段。第三,要培养很好的哲学思辩能力,特别是归类、归纳、观察能
力,而不仅仅是死板的推理能力。我突然想,如果我们去看看大学的哲学教材,看看它如
何把一套歪理邪说讲得头头是道、自圆其说,也是一种哲学思辩能力。培养哲学能力的方
法可以是常常思考一些自然的、社会的、没有严格公理的现象,比如自然语言的本质表示
,比如民族主义和自由主义本质是什么 [3],比如当代世界的经济格局以及其背后的技术
决定因素。要博学,要有广泛的兴趣,要喜欢百科全书,接受通识、
开放的教育而不是应试教育。推理能力在一个基础已经形式化的封闭体系如纯数学里是很
重要的,而观察、归类、归纳能力则有助于我们研究开放性的事物,比如我现在已经有了
一个点子,但是我发现别人已经提出过了,就这个点子本身其内在关系和本质的研究已经
很成熟,已经自成一个独立的系统,那么我如何去发现这个系统做不到、解释不到的现象
,从而扩展这个系统?电影《美丽心灵》里就有经典的例子:亚当斯密已经建立了零和博
弈的经济学理论,这个理论已经自成系统,甚至已经被形式化,如果你仅仅用逻辑推理想
有所新发现,你必然会在这个封闭的体系里打转转。如果你想有所创新,就必然要到盒子
外面去想(think outside the box),这就需要观察该系统无法解释的现象,并归类、归
纳出新的规律,于是纳什才归纳出“共赢”现象的博弈规律,跳出了亚当斯密设计的盒子
。从盒子外面看,亚当斯密的盒子就成了“incomplete”的了。还有一种研究方法叫“没
事找事”,就是故意(而且是先于经验观察)跟前人唱反调,比如非欧几何。要善于观察
善于表达,比如看看我是怎么写这篇文章并把我要说的内容归类成段的。哲学是凌驾于死
板推理的,是一切思想成果的背后机制,哪怕是数学研究也是要有哲学
领悟能力的。我国的应试教育强调服从既定方针(就像一个体系里的公理和定理)式的推
理能力,打击了我们自由观察、探索、思考体制外的外层空间现象的积极性。而西方由于
崇尚自由主义,勇于探索现有知识体系以外的“非理性世界”,做成败莫测的冒险,甚至
敢于相信有 beyond 我们观察能力的 God 的存在,有了这种对哲学的坚持,才不断从盒子
内的科学走向盒子外的科学。第四,以往的顶级 OIERS,由于一没有投机的经验和物质回
报的滋润(最近听说一句话叫“钱是英雄胆”)、二没有自由探索 自主研究方法 的机会
(IOI 完了往往上国内大学,学的是古人的最终思想产品(end product)如微积分和简单
机械算法而没有学到或者自己悟到思想不断向外发展的哲学和方法论(方法论就是某个哲
学思想的具体可操作化),他们高中被高考或 IOI 所驱使、大学本科被出国读研究生所驱
使、读研究生时被研究生文凭所驱使,内心并没有时间真正去长期观察盒子外的东西,而
到了公司里,又被工作业绩和生存压力所驱使。)因此一直无法改变“大家都不知道怎么
研究”的传统、三是某些人本来就没有兴趣投资时间去观察没有把握的事物——他们喜欢
走保守稳定的职业生涯(如 CS -> Data Mining -> 搜索引擎公司 ->
Statistics -> Accounting -> 华尔街),很大程度上是因为我们的应试教育鼓励了保守
稳定的态度——针对我给你的价值观(考试大纲)优化你自己,你就能得最高分。所以,
不要指望那些愿意为高分而努力的人会平白无故就突然放弃“稳定压倒一切”去中途追求
他们认为风险很大的“改革开放”。有人问,你说的这两种态度(稳定压倒一切 和 冒进
),难道真的是水火不容、鱼与熊掌不可兼得?非也。关键是:循序渐进,逐步提高投资
和回报的高度。首先建议学生们在寒暑假做个信息技术产品(软件、网站)或服务(服务
不能太花时间,否则扰乱你的长期研究,最好是时间由你选择的 freelance (打零工))
,取得经济独立,然后就能投入自己真正感兴趣的追求。有人还要问“文凭怎么办”。确
实,engineering degree 是大多数人出国、工作的必备,这一点我以后再写文章讨论。如
果你没有魄力,权宜之计是,争取到香港等地的大学学习,因为虽然都是 degree,过程不
同:一个是稳定压倒一切推着你走,一个自由度更大吧。如果你有魄力,且不去说 Bill
Gates,就看看我们熟悉的 BitTorrent 的发明者 Bram Cohen 的故事[4]吧。相似的现代
故事我还能举出一些,比如 Google 的 Glen Murphy,他的 Blogger
Web Comments 表现了一个很有内涵的应用。如果我大张旗鼓的鼓吹 no degree,很多人
肯定不认同。但是据我了解,至少在计算机科学和应用数学领域,如果你想做纳什,你必
须学着他说“Class will dull your mind, destroy the potential for authentic cre
ativity.”某一次我代一个信息学奥林匹克国际集训队的队员到 comp.theory 上问作业[
5],结果被上面的美国教授们骂得狗血喷头,什么“自己不好好学,到这里来问”云云,
美国的计算机大学教育之严格(=不自由)可见一斑。这也难怪 ACM 近年颁发的图灵奖是
一年比一年烂。我看过四年的 ACM TechNews [6],发现美国主流计算机学术界总是沉湎于
旧的知识体系不能自拔,总是围绕着 security 等陈旧的话题,或者是 voting machines
, RFID 这些所谓新潮的浅薄话题,目的只有一个:好捞联邦政府的研究拨款。所以我最近
几个月都不看了。学术界怀旧无能,反倒是 Bram Cohen 这样的毛头小伙能出新意,引得
Microsoft(代表计算机工业界)的研究员去“改进” BitTorrent,结果被他批判为“A
ll talk and no work” [7],和 Stanford (代表计算机学术界)请他去演讲 [8][9]。

这一段本来要讲自由主义、掌握自主思想的权利(也就是有权胡思乱想),结果很多内容
都在上一段讲了。思想就像是一棵棵树,重在不同。你的思想往那个方向长,结果如何我
看到了,因此我不想重复你的想法,我要有意无意、有理无理地朝这边长,朝没人长到的
空间去分枝。这种思想方法,就是自由主义。我上 F 大时,本想借着独立研究成果来挑起
T 大和 F 大在求新求异上的竞争,现在看来,还需要一个个个人的带头作用。三年来,
我越来越认识到自由主义对创新的必要性,这可以在我的研究经历和成果中体现出来。用
一句斩钉截铁的话说就是:“自由不实现,创新不能谈”。


后记:莱布尼兹的四大梦想和我的人类四大信息自由

机械计算机理论之父莱布尼兹有四大梦想[13],其中一些现在已经实现了:
1. Encyclopaedia - 全世界人民集体编写的、用非形式语言(自然语言)表达的一部百科
全书。这就是今天的 Wikipedia。
2. Universal Language - 一个全人类普遍使用的非形式语言。关于这个曾经有过 世界语
、逻辑语(Lojban)等尝试。
3. The lingua characteristica - Universal Language 的形式化版本,同时也是 Ency
clopaedia 的形式化版本。如现在 First Order Logic + Cyc。
4. The calculus ratiocinator - 自动推理一个 lingua characteristica 命题是否成立
的机器,如现在的 Prolog。

我认为信息技术应该提供一个现代人以下四大信息自由:
1. 物理上连通的自由——已知一个人/信息资源的地址就能无阻碍的访问这个资源:就是
现在的互联网;
2. 跨自然语言沟通的自由——能在软件的辅助下与一个讲自己不懂的自然语言的人准确地
沟通,实现方法是消息经过一个形式化语言中转;
3. 跨越说法差异,连接本质相同的思想的自由——不管两个人对一个思想的具体说法(表
达形式)有多不同,只要思想语义本质相同,那么这两人就能够建立联系,也就是上面说
的 reverse dictionary lookup;
4. 连接问题和解决方案的自由——对于给出的任何问题,计算机都能通过人类现有知识和
自动推理给出解答;或者如果计算机无法独立求解,至少告诉我解决此问题牵涉的人类现
有知识有哪些。

[1] http://en.wikipedia.org/wiki/Pancake_sorting
[2] http://scholar.google.com/scholar?sourceid=mozclient&ie=utf-8&oe=utf-8&q=Bounds+for+Sorting+by+Prefix+Reversal
[3] http://www.bytecool.com/ioiforum/read.php?1,3695,3695#msg-3695
[4] http://www.wired.com/wired/archive/13.01/bittorrent.html
[5] http://groups.google.com/group/comp.theory/browse_frm/thread/c37b7f0585f8d823/c7c343e8a07028b3?nk=gst&q=k-ary+tree&rnum=2#c7c343e8a07028b3
[6] http://technews.acm.org/current.cfm
[7] http://bramcohen.livejournal.com/20140.html
[8] http://www.stanford.edu/class/ee380/Abstracts/050216.html
[9] http://stanford-online.stanford.edu/courses/ee380/050216-ee380-100.asx
[10]http://www-helix.stanford.edu/people/altman/bioinformatics.html#12
[11]
http://www.tug.org/TUGboat/Articles/tb23-3-4/tb75knuth.pdf
[12] http://www.ams.org/notices/200203/fea-knuth.pdf
[13] http://www.rbjones.com/rbjpub/philos/history/xh003-m.html
下面是批判:
mentat的专栏
昨天在这个论坛里看见“穿靴子的猫”发的胡说八道的文章,忍不住写了这点东西。在美
国学计算机的人多如牛毛,藏龙卧虎。本人学识有限,有错误的地方请大家订正和原谅。
“穿靴子的猫”,真名姚子渊,2003年考清华失败,进入复旦。大学第一年在网上大吹嘘发明了”革命性的机器翻译理论“,自拟新闻,在网上到处发。一年后承认失败,又声称要搞LingoX软件提高”英语的生产率“,至今遥遥无期,又是作秀。

“穿靴子的猫“指责”美国主流计算机学术界总是沉湎于旧的知识体系不能自拔“,因为
”ACM 近年颁发的图灵奖是一年比一年烂“。 其实图灵奖一点也不烂,有点象NOBEL奖,得奖人的工作往往都是近二十年前的了。想通过图灵奖了解计算机科学的成就还可以,但要了解近况是肯定要失望的。有趣的是,有的图灵奖的获得者的计算机使用水平还不如中学生,除了收发EMAIL,其他一概不会,论文排版打印都由其他人带劳。不过这并不妨碍他们对计算的深刻理解。要想了解计算机科学的近况主要看核心的学术会议,这也是计算机科学研究的一项传统。学术杂志时效性比较差,偏理论的人对此感兴趣。

计算机科学的发展和其他学科一样,是由问题驱动的。你问自己一个问题,如果天下没人能给你答案,发现这个问题的答案或部分答案就是很好的科学研究。不过问题有大有小,因而成果的重要性就不一样。要做好的研究,心里一定要有好的问题。 

先让我们来看看编程序方面的问题。学计算机的人都会编程,可如何保证程序编得又快又好,问题就大了,这是一个在过去几十年里制造了数千个博士的问题。提高软件的生产率和正确率是非常困难的,一般一个好的程序员一年大概能写5万行左右的新代码。有没有什么办法提高到一年能写相当于现在50万行新代码的水平。各种研究都有,例如设计各种各样的工具,改进程序设计语言等等。大学里开发的工具很多是研究性质的,商业化的工具很多是工程性质的,是大学研究结果的综合。改进程序设计语言一直是一个非常重要的问题,POPL是这方面的核心会议之一。其中类型理论始终是重要的研究课题之一。中国人在这方面做过不少贡献,提到类型理论,很多人都知道Luo Zhaohui。

如何保证程序的正确性是另外一个很重要的与编程有关的问题。用计算机自动验证程序的正确性曾几何时是一个很热门的问题,好几个图灵奖的获得者都与这个问题有关。现在已经很少有人研究了。不过这些研究大大加深了人们对程序设计和语义的理解。比如说,我们现在知道了现在的编程实质上是一种HOARE逻辑上的形式推理,程序的正确性就是定理证明。程序验证的失败很大程度上是定理证明的失败。定理证明曾经是人工智能的一个门话题,Otter是最具代表的全自动一阶逻辑证明器之一。可惜的是,所有的全自动证明器都遇到了一个无法逾越的障碍,就是没办法做自动归纳证明。我们知道实际应用离不开整数,整数上的命题很多是用归纳法证明的,但归纳模式千变万化,迄今为止归纳模式无法自动生成。半自动的证明器有不少,可只有专家才能用。

说到这里,不能不谈谈眼下热门的Ontology有关的研究。搞人工智能的人在上个世纪搞坏了名声,只要和人工智能这个词沾上边,一般就有骗子的嫌疑。现在申请项目没人会用”人工智能“这个术语了,不过没关系,现在可以叫”知识工程“或Ontology或其他什么的。搞知识工程的人发现用一阶逻辑表达知识不行,因为其中的定理无法自动证明。简化到HORN逻辑还是不行。再简化找一种能保证自动证明定理的逻辑,终于有了,就是现在流行的Dexxxxion Logic。你可以想象这逻辑有多弱。Ontology研究不管怎么吹,超出Dexxxxion Logic就是不可判定的。你也千万别用到算术和方程什么的,一用就超出Dexxxxion Logic了。Google已经暗示不会开发与RDF和OWL有关的产品,实际上是看坏这项技术。

顺带说一下,从事这种与理论和逻辑有关的研究没有数年在逻辑和代数方面的学习功底,门都没有。比如说如果你要研究不同计算系统之间的关系,你得理解Grothendieck Institution。这就是为什么在欧洲很多计算机科学系和数学系是在一起的。

计算机科学东西太多,比如数据库,安全,网络和通讯等等,有关的会议总是特别热闹。太化时间,我以后再慢慢写吧。

 

 

 

 

计算机科学数学理论浅谈

计算机科学数学理论浅谈

Fri Dec 3 22:08:19 2004

计算机科学数学理论浅谈

本文版权归[url]www.cstc.net.cn[/url] 和CSDN共同所有

计算机自从其诞生之日起,它的主要任务就是进行各种各样的科学计算。文档处理,数据

处理,图像处理,硬件设计,软件设计等等,都可以抽象为两大类:数值计算与非数值计

算。作为研究计算机科学技术的人员,我们大都对计算数学对整个计算机科学的重要性有

一些了解。但是数学对我们这些专业的研究和应用人员究竟有多大的用处呢?我们先来看

一下下面的一个流程图:


上图揭示了利用计算机解决科学计算的步骤,实际问题转换为程序,要经过一个对问题抽

象的过程,建立起完善的数学模型,只有这样,我们才能建立一个设计良好的程序。从中

我们不难看出计算数学理论对用计算机解决问题的重要性。下面我们将逐步展开对这个问

题的讨论。

计算机科学的数学理论体系是相当庞杂的,笔者不敢随意划分,参考计算机科学理论的学

科体系,我们谈及的问题主要涉及:数值计算,离散数学,数论,计算理论四大方向。

 


[一]数值计算(Numerical Computation)主要包括数值分析学、数学分析学、线性代数、

计算几何学、概率论与数理统计学。

数值分析学又常被称为计算方法学,是计算理论数学非常重要的一个分支,主要研究数值

型计算。研究的内容中首先要谈谈数值计算的误差分析,误差是衡量我们的计算有效与否

的标准,我们的算法解决问题如果在误差允许的范围内,则算法是有效的,否则就是一个

无效的问题求解。另外就是数值逼近,它研究关于如何使用容易数值计算的函数来近似地

代替任意函数的方法与过程。感觉应用比较广的不得不提切雪比夫逼近和平方逼近了。笔

者曾经尝试过的就是通过最佳平方逼近进行曲线的拟合,开发工具可以选择VC++或者Matl

ab。插值函数是另外一个非常重要的方面,现代的计算机程序控制加工机械零件,根据设

计可给出零件外形曲线的某些型值点,加工时走刀方向及步数,就要通过插值函数计算零

件外形曲线及其他点函数值。至于方程求根、线性方程组求解,一般的计算性程序设计问

题都会多多少少的涉及一些,我们这里就不赘述了。关于数值分析学的一个学习误区就是

仅仅学习理论知识,而很难和程序设计结合起来,实际上通过上面的论述,大家已经能够

初步地认识到这个学科是应当与程序设计紧密联系才能够体现它的重要性的。关于理论的

学习,推荐华中科技大学李庆扬老师的《数值分析》。然而理论学习毕竟是个过程,最终

的目标还是要用于程序设计解决实际的计算问题,向这个方向努力的书籍还是挺多的,这

里推荐大家高等教育出版社(CHEP)和施普林格出版社(Springer)联合出版的《计算方法

(Computational Methods)》,华中理工大学数学系写的(现华中科技大学),这方面华

科大做的工作在国内应算是比较多的,而个人认为以这本最好,至少程序设计方面涉及了

:任意数学函数的求值,方程求根,线性方程组求解,插值方法,数值积分,场微分方程

数值求解。


数学分析学很多学校在近些年已经替代高等数学被安排到了本科教学当中。原因是很简单

的,高等数学虽然也是非常有用的工程数学,介绍的问题方法也被广泛的应用,但是正如

大家所知道的,高等数学不太严格的说,基本上就是偏向于计算的数学分析,当然省去了

数学分析非常看重的推理证明,然而我们认为这一部分正是我们最需要的。这对我们培养

良好的分析能力和推理能力极有帮助。我的软件工程学导师北工大数理学院的王仪华先生

就曾经教导过我们,数学系的学生到软件企业中大多作软件设计与分析工作,而计算机系

的学生做初级程序员的居多,原因就在于数学系的学生分析推理能力,从所受训练的角度

上要远远在我们平均水平之上。谈到这方面的书籍,公认北京大学张筑生老师的《数学分

析新讲》为最好。张筑生教授一生写的书并不太多,但是只要是写出来的每一本都是本领

域内的杰作,这本当然更显突出些。这种老书看起来不仅是在传授你知识,而是在让你体

会科学的方法与对事物的认识方法。现在多用的似乎是复旦大学的《数学分析》,高等教

育出版社的,也是很好的教材。但关于如何去利用从中获得的推理证明能力,我们在遇到

具体问题的时候,可以在今后的文章详细讨论。


线性代数是我们在工科本科学习的必修课程,似乎大家找不到到底这个有什么用,其实很

明显,线性代数作为工程数学的重要分支,在计算机领域的研究有相当广泛的应用。最为

突出的可以谈谈数组和矩阵的相关知识:


下面谈一个我经常作为例子和同学讨论的问题:四个城市之间的航线如图所示:

令aij=1,表示从i市到j市有1条航线

令aij=0,表示从i市到j市没有单项航线

则图可用矩阵表示:


A= (aij) =

我们可以采用程序设计实现这个问题,如果辅以权值,可以转化为最短路径的问题,再复

杂化一点还可以转化为具有障碍物的最短路径问题,这就会涉及一些如Dijkstra算法等高

级程序设计算法话题。这些都依靠着数组、矩阵的基本知识。数组的应用主要在图像处理

以及一些程序设计理论。矩阵的运算领域极为广泛,比如在计算机图形学当中曲线曲面的

构造,图像的几何变换,包括平移、镜像、转置、缩放。在高级图像问题更有广泛应用,

例如在图像增强技术,投影技术中的应用。


计算几何学研究的是几何外形信息的计算机表示。包括几何查找、多边形、凸包问题、交

与并、几何体的排列、几何拓扑网络设计、随机几何算法与并行几何算法。它构成了计算

机图形学中的基本算法,是动画设计,制造业计算机辅助设计的基础。如果从事这方面的

深入研究,可以参考中国计算机学会周培德先生的《计算几何——算法分析与设计》。


概率论与数理统计学是这个领域最后一门关键的课程。概率论部分提供了很多问题的基本

知识描述,比如模式识别当中的概率计算,参数估计等等。数理统计部分有很多非常经典

的内容,比如伪随机数、蒙特卡罗法、回归分析、排队论、假设检验、以及经典的马科夫

过程。尤其是随机过程部分,是分析网络和分布式系统,设计随机化算法和协议非常重要

的基础。


[二]离散数学(Discrete Mathematics)随着计算机科学的出现与广泛应用,人们发现利用

计算机处理的数学对象与传统的分析有明显的区别:分析研究的问题解决方案是连续的,

因而微分,积分成为基本的运算;而这些分支研究的对象是离散的,因而很少有机会进行

此类的计算。人们从而称这些分支为"离散数学"。离散数学经过几十年发展,方向上基本

上稳定下来。当然不同时期还有很多新内容补充进来。就学科方向而言,一般认为,离散

数学包含:集合论、逻辑学、代数学、图论、组合学。


逻辑学(Logics)我们主要指数理逻辑,形式逻辑在推理问题中也有比较广泛的应用。(

比如我们学校还为此专门开设了选修课程)这方面的参考推荐中科院软件所陆钟万教授的

《面向计算机科学的数理逻辑》。现在可以找到陆钟万教授的讲课录像,http://www.cas

.ac.cn/html/Dir/2001/11/06/3391.htm。总的来说,学集合/逻辑一定要站在理解的高度

上去思考相关的问题。集合论(Set Theory)和逻辑学构成了计算机科学最重要的数学问

题描述方式。


代数学(Algebra)包括:抽象代数、布尔代数、关系代数、计算机代数

(1)抽象代数(Abstract Algebra)研究的主要内容涵盖群、环、域。抽象代表的是将研

究对象的本质提炼出来,加以高度概括,来描述其形象。“欧式环”就是在将整数和多项

式的一些相同的特点加以综合提炼引入的。抽象代数提供的一些结论为我们研究一些具体

问题时所需使用的一些性质提供了依据。推荐一个最简单的,最容易学的材料:http://w

ww.math.miami.edu/~ec/book/这本《Introduction to Linear and Abstract Algebra》

非常通俗易懂,而且把抽象代数和线性代数结合起来,对初学者来说非常理想。

(2)布尔代数(Boolean Algebra)是代数系统中最为基础的部分,也是最核心的基本理

论。主要包括了集合的基本概念与运算,自对偶的公理系统。是数据表示的重要基础。相

信大家都很清楚它的重要性。

(3)关系代数(Relational Algebra)应用也是极为广泛,比如数据库技术中的关系数据

库的构建就要用到关系代数的相关理论。

(4)计算机代数(Computer Algebra)大家可能比较生疏,其实它研究的主要内容即是围

绕符号计算与公式演算展开的。是研究代数算法的设计、分析、实现及其应用的学科。主

要求解非数值计算,输入输出用代数符号表示。计算机代数的开发语言主要有:ALTRAN,C

AMAL,FORMAL。主要应用于:射影几何,工业设计,机器人手臂运动设计。


图论(Graph Theory)主要研究的内容包括:图的基本概念、基本运算、矩阵表示,路径

、回路和连通性,二部图、平面图,树,以及网络流。图论的应用领域太过广泛,仅举两

个例子:比如在计算机网络拓扑图的设计与结构描述中,就必须用到相当多的图的结构和

基本概念。关于网络流更是在电流网络与信息网络的流量计算当中广泛应用。树的相关应

用则无须多言了。


组合学(Combinatorics)有两部分单独的研究领域:组合数学与组合算法。组合学问题的

算法,计算对象是离散的、有限的数学结构。从方法学的角度,组合算法包括算法设计和

算法分析两个方面。关于算法设计,历史上已经总结出了若干带有普遍意义的方法和技术

,包括动态规划、回溯法、分支限界法、分治法、贪心法等。应用是相当广泛的,比如旅行

商问题、图着色问题、整数规划问题。关于组合数学,主要研究的内容有:鸽巢原理、排

列与组合、二项式系数容斥原理及应用,递推关系和生成函数、特殊计数序列、二分图中

的匹配、组合设计。推荐Richard A.Brualdi的《Introductory Combinatorics》作为参考


[三]数论(Number Theory)

数论这门学科最初是从研究整数开始的,所以叫做整数论。后来更名为数论。它包括以下

几个分支:

初等数论是不求助于其他数学学科的帮助,只依靠初等方法来研究整数性质的数论分支。

比如在数论界非常著名的“中国剩余定理”,就是初等数论中很重要的内容。对于程序设

计来说这部分也是相当有价值的,如果你对中国剩余定理比较清楚,利用它,你可以将一

种表达式经过简单的转换后得出另一种表达式,从而完成对问题分析视角的转换。


解析数论是使用数学分析作为工具来解决数论问题的分支。是解决数论中比较深刻问题的

强有力的工具。我国数学家陈景润在尝试解决“哥德巴赫猜想”问题中使用的就是解析数

论的方法。以素数定理为基础解决计算素数的问题及其算法实现应是我们多多关注的。


代数数论是把整数的概念推广到一般代数数域上去,建立了素整数、可除性等概念。程序

设计方面涉及的比较多的是代数曲线的研究,比如说椭圆曲线理论的实现。

几何数论研究的基本对象是“空间格网”。空间格网就是指在给定的直角坐标系上,坐标

全是整数的点,叫做整点;全部整点构成的组就叫做空间格网。空间格网对计算几何学的

研究有着重大的意义。几何数论涉及的问题比较复杂,必须具有相当的数学基础才能深入

研究。

总的说来,由于近代计算机科学的发展,数论得到了广泛的应用。比如在计算方法、代数

编码、组合学理论等方面都广泛使用了初等数论范围内的许多研究成果;现在有些国家应

用“孙子定理”来进行测距,用原根和指数来计算离散傅里叶变换等。如果你曾经系统的

学习过数论算法,你会发现这个分支学科研究的一些基本问题对程序设计是相当有用的,

比如说素数问题、素性测试、因子分解、最大公约数、模取幂运算、求解同余线性方程。

其中的很多问题都是程序设计的基本问题。但这些问题都不能小视,举个例子来说吧,关

于求最大公约数的程序,笔者曾经尝试的就可以采用循环语句结构和递归结构。另外,以

大素数为基础的密码体系的建立是近些年数论算法广泛应用的一个重要的原因。原理是大

素数的乘积重新分解因数十分困难。RSA公钥加密系统的构建就是基于这个原理的(三位发

明人因此也获得了2002年美国计算机协会颁发的图灵奖)。


[四]计算理论(Theory of Computation)

这一部分涉及的内容是科学计算非常重要的一部分分支,也是大家研究相当多的一部分。

主要包括:算法学,计算复杂性,程序理论。

 算法学(Algorithms)在计算机科学理论中有着举足轻重的地位。是解决很多数值型,

非数值型问题的基础。记得一次学校接收招标项目,很多中小型软件厂商都无法完成一个

软件的功能模块,就是因为当时他们对一个具体问题的算法不能做出正确的抽象,最后由

我们学校数理学院的一支软件团队承担了这项任务,他们的最终报告体现出来,问题的解

决策略只有通过人工神经元网络的反向传播算法。可见在比较有深度的程序设计中,算法

的重要性更为突出。学习算法学要有一个长期的理论和实践的过程。遇到一个具体算法问

题时,首先要通过自己描述的数学抽象步骤,看看自己以前有没有处理过这种问题。如果没

有,很可能这个问题是多个算法的综合,或者是需要我们自己去构造算法。这就需要我们

有扎实的算法功底,为了打好这个功底,推荐两套圣经级的书籍首先是Thomas H.Cormen等

著的《Introduction to Algorithms》。对算法学习而言,这一本内容相当的全面。再深

一点的就是大家作为常识都知道的《The Art of Computer Programming》,目前已经出版

3册。两本书的价值大家应当都是清楚的。


计算复杂性研究的内容很广,其中包括NP完全性理论,可计算性理论,自动机理论,形式

语言理论(包括广泛应用于编译原理领域的文法,还包括Petri网论的相关内容)以及大家

熟知的复杂性度量。时间复杂度、空间复杂度的计算是度量算法非常重要的参数,也是我

们衡量程序优劣程度的重要依据。


程序理论(Theory of programs)包含了形式语义学,程序验证和并发模型的研究。关于

程序验证学习的重要性大家都很清楚,学习的方法自然也是多多结合具体的问题去分析。

关于并发模型,主要研究的就是进程代数,通信系统演算,通信顺序进程。这部分是研究

操作系统理论与实现的重要基础。

 

上面我们按照计算机科学数学理论的架构来谈了各方面的内容和一些应用,下面我们再单

独来看一些上面没有涉及到的学科与这些理论的具体结合情况:

软件程序设计方面的应用刚才谈的很多,我只再说说数据库原理与技术,这方面用到的重

要数学基础主要包括:集合论,二元关系及其推理(尤其是研究关系数据库),研究数据

分布与数据库结构又涉及相当多的图论知识。

计算机科学的发展有赖于硬件技术和软件技术的综合。在设计硬件的时候应当充分融入软

件的设计思想,才能使硬件在程序的指挥下发挥极致的性能。在软件设计的时候也要充分

考虑硬件的特点,才能冲破软件效率的瓶颈。达到硬件和软件设计的统一,严格的说这并

不轻松,一般的程序设计者很难将这样的思想贯穿在其程序设计当中。仅举个简单的例子

:我们在写一些C语言的程序,必要的时候都会采取内嵌一段汇编指令,这就是比较充分地

考虑了硬件的工作情况,从而能够提高程序运行的效率。所以我们也有必要了解一些硬件

的基础知识。关于学习硬件的时候常会用到的基本数学思想也是相当多的,拿电路基础与

模拟电路来说,我们就经常要利用多元函数,不等式计算进行电流电压的计算。能量的计

算还常常涉及微积分学的很多计算。在数字电子技术当中(有时也称数字逻辑学)数理逻

辑,尤其是逻辑演算部分运用相当广泛,数制转换更是非常重要的基础,各种数字电路参

数的计算则是多元函数,不等式的计算解决的问题。

如果你是从事计算机硬件程序设计的程序员,则不可回避的就是数字信号处理。这门科学

所用到的数学基础主要有:三角函数、微积分、高次方程求解、数值逼近,傅里叶变换。

在滤波器的设计当中还会用到矩阵运算。笔者曾经研究过一个VC++环境下开发的滤波器的

模拟软件,就是利用莱文逊-杜宾递推算法,在较大规模的矩阵运算基础上进行的。当然,

开发的环境不一定是这个,你也可以选择MATLAB或者纯C语言编译器。如果我们不了解相关

的数学基础,不要说程序设计,就算是建立运算模型都是相当困难的。

平时接触一些周围的同学和一些在职的程序员,大家经过一段时间的学习,普遍都觉得数

学对学习计算机和研究计算机程序设计等问题来说非常重要,但是又苦于无从下手。上面

比较全面地谈及了计算机科学数学理论的相关内容。需要特别指明的是,我们研究问题的

精力是有限的,如果您是在校的计算机系学生,则可以对上面的方方面面都有所涉及,以

尝试计算数学这个强大的理论工具。为今后的工作奠定一个坚实的基础。但是如果您研究

的是比较具体的工作,我们并不推荐您研究所有的内容,最好的方法就是对上面的数学基

础都有些了解,然后遇到具体工作,需要哪部分内容,再进行深入的学习与研究。这样针

对性比较强的学习效果是会比较显著的。对于上面推荐的一些参考材料,除非你要花相当

长的一段时间来提高你的计算机数学理论。否则也没必要每一页,每一本都字字精读,还

是那个原则,按需索取其中的内容。学习的方法描述起来就一句话:结合具体的问题,深

入的理解数学理论知识,将理论程序化,尝试用程序设计实现理论原理。达到这样的程度

,问题基本上都可以解决的。(限于篇幅,很多问题不能展开,您可以到我们的站点http

://www.cstc.net.cn 与我们共同讨论)


参考文献:

《计算机科学技术百科全书》中国计算机学会清华大学出版社

《工程数学—线性代数》同济大学数学教研室同济大学出版社

《数值分析》李庆扬华中科技大学出版社

《离散数学及其应用》

英文名称:Discrete Mathematics and Its Applications,Fourth Edition

作者:Kenneth H.Rosen

http://dev.csdn.net/article/55/55453.shtm

你可能感兴趣的:(基础)