(1)抽象代数(Abstract Algebra)研究的主要内容涵盖群、环、域。抽象代表的是将研究对象的本质提炼出来,加以高度概括,来描述其形象。“欧式环”就是在将整数和多项式的一些相同的特点加以综合提炼引入的。抽象代数提供的一些结论为我们研究一些具体问题时所需使用的一些性质提供了依据。推荐一个最简单的,最容易学的材料:http://www.math.miami.edu/~ec/book/这本《Introduction to Linear and Abstract Algebra》非常通俗易懂,而且把抽象代数和线性代数结合起来,对初学者来说非常理想。
[四]计算理论(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语言编译器。如果我们不了解相关的数学基础,不要说程序设计,就算是建立运算模型都是相当困难的。