关于运用计算机可能需要的数学知识
写这个东西是因为看到一篇叫做《算法不是数学》的帖子。首先在这里所谓的数学沿用大家普遍的看法,我自认为我无法给出关于数学精确的定义所以不冒这个险。
//================这部分是铺垫======================
/*
首先,为什么运用计算机需要数学知识?原因在于计算机科学和数学有十分类似的地方。它们都探讨了两方面的内容,一类是如何表示信息,一类是如何对信息进行变换。当然,如何对信息进行变换本身也是信息。计算机用来表示的是存储地址标识和对应位置上的逻辑电平,以及由此衍生的原始数据类型,直到抽象数据结构,它表示一种操作对象。一般来说,我们所说的程序其实是由更小的程序构成的,对于程序员可见的对数据的最小操作是CPU指令,比CPU指令更小的是微指令,微指令构成了CPU内部的状态循环,如果程序员能够改动它CPU可能就无法工作了(比如任意修改flag register),而一切的指令又要依靠从XTAL引脚传来的时钟信号才能运行,这个信号来自一个加了电压的晶体。
如果只考虑计算机(包括理论计算机)出现以前的数学,它也包括了表示和变换两方面的信息。数学中表示数据的结构有变量、矢量、矩阵、行列式、集合等等等等,表示操作的有各种稀奇古怪的算子。同计算机一样,复杂的算子也是由简单的算子组合而来的,最primitive的变换操作是四则运算,比这更简单的至少我不知道,一切运算的原因是因为某个时刻人突然想这么干,所以就干了。
《算法不是数学》主要强调了计算机科学并不需要太高深的数学知识,计算机工业更是如此。编个游戏不大需要微积分,如果是偏向物理的可能会涉及到一点,但是这个层次的微积分主要是用基于线性代数的数值方法实现的,所以再往上的比如若干阶的偏微分方程,或者讨论黎曼几何或罗巴切夫斯基几何或者巴拿赫空间就没什么意思了。这篇文章确实说明了一个现实,就是现在的数学中对如何表示信息的研究已经远甚于对信息的变换。而近现代对信息进行变换的研究几乎都是由来自形式系统学科(包括一般计算理论、自动机和形式语言)所取得的。从实践的角度上看,纯数学确实变得有点像一个疯狂的游戏(与之相似的还有理论物理)。
但是无论如何,从公元十一世纪左右花剌子模先生所著的《演算法》开始,一直到二十世纪初黎曼建立了比较严谨的微积分系统,中间这九百年的数学几乎一直是在研究如何变换。因此计算机在这方面需要借鉴的东西非常多。
*/
//=================铺垫结束=================
运用计算机所需要的数学知识,首当其冲是图。当然图的知识本身并没那么重要,重要的是一种画图的意识。做任何事情之前都画图,只有好处没坏处。图是揭示数据或模块之间相互关系最简单最直接的方法,同时也是描述流程最清晰的方式。对于数据的描述,图的应用领域包括地图、SNS以及软件工程上的UML。对于流程的描述,最广泛的应用包括状态转移图,这个在写汇编的时候会让程序员保持很清晰的思维(但并不能保证读程序的人看得懂) [不过随着高级语言中对JMP指令的限制以及底层代码层层封装所以不怎么用了]。在函数式编程中,由于大力倡导引用透明,所以状态转移图几乎没用。
【补充:关于图论的进阶知识,譬如染色问题、共轭图,以及图的统计特性与随机图等,你是可以无视的。深入的图论研究也是一种十分可怕的游戏。】
和图相关的是关系,这也是离散数学的内容。数据的组织主要考查的是存不存在序关系,数据中具有偏序关系的维度总是存在O(log n)的平均查找性能和O(n log n)的平均排序性能。(当然不同的查找方式和存储器存取还有关系,被略去的每项的系数在数据量不同时可能对性能产生显著影响,这也是计算机硬件工程师总是对计算机科学研究者的算法分析方法总是质疑的原因之一)
对于图形图像表示领域,则需要扎实的几何与线性代数基础。几何麻烦一些的可能包括圆锥曲线(比如Voronoi的神奇的Fortune算法),三角学(包括平面、空间和球面的弦切割定理)。由于计算机存储器的结构,这些变换操作几乎都是用矩阵运算实现的,线性代数只要了解到矩阵运算就可以了,对于高维向量空间的讨论可以无视。
对于包括图像处理在内的信号处理领域,需要基于线性代数实现的各种数值算法,包括卷积(数值)、FFT、小波变换等等。严格来说它们是从计算机科学中发展而来的,我个人认为它们应该叫做计算机数值技术,而不能简单称之为数学。
对于计算机本身的系统设计,比如操作系统这样包含多任务和并发方面的,学习一下排队论和随机过程会有帮助。排队论和随机过程并不是设计指导,但是它们可以用来评估你的成果。
//剩下我几乎想不出来了,好吧,我收回“因此计算机在这方面需要借鉴的东西非常多”这句话。如果您执意认为我说的计算机和数学其实都属于一个更广义的“数学”范畴,我也赞成。
//================这部分是铺垫======================
/*
首先,为什么运用计算机需要数学知识?原因在于计算机科学和数学有十分类似的地方。它们都探讨了两方面的内容,一类是如何表示信息,一类是如何对信息进行变换。当然,如何对信息进行变换本身也是信息。计算机用来表示的是存储地址标识和对应位置上的逻辑电平,以及由此衍生的原始数据类型,直到抽象数据结构,它表示一种操作对象。一般来说,我们所说的程序其实是由更小的程序构成的,对于程序员可见的对数据的最小操作是CPU指令,比CPU指令更小的是微指令,微指令构成了CPU内部的状态循环,如果程序员能够改动它CPU可能就无法工作了(比如任意修改flag register),而一切的指令又要依靠从XTAL引脚传来的时钟信号才能运行,这个信号来自一个加了电压的晶体。
如果只考虑计算机(包括理论计算机)出现以前的数学,它也包括了表示和变换两方面的信息。数学中表示数据的结构有变量、矢量、矩阵、行列式、集合等等等等,表示操作的有各种稀奇古怪的算子。同计算机一样,复杂的算子也是由简单的算子组合而来的,最primitive的变换操作是四则运算,比这更简单的至少我不知道,一切运算的原因是因为某个时刻人突然想这么干,所以就干了。
《算法不是数学》主要强调了计算机科学并不需要太高深的数学知识,计算机工业更是如此。编个游戏不大需要微积分,如果是偏向物理的可能会涉及到一点,但是这个层次的微积分主要是用基于线性代数的数值方法实现的,所以再往上的比如若干阶的偏微分方程,或者讨论黎曼几何或罗巴切夫斯基几何或者巴拿赫空间就没什么意思了。这篇文章确实说明了一个现实,就是现在的数学中对如何表示信息的研究已经远甚于对信息的变换。而近现代对信息进行变换的研究几乎都是由来自形式系统学科(包括一般计算理论、自动机和形式语言)所取得的。从实践的角度上看,纯数学确实变得有点像一个疯狂的游戏(与之相似的还有理论物理)。
但是无论如何,从公元十一世纪左右花剌子模先生所著的《演算法》开始,一直到二十世纪初黎曼建立了比较严谨的微积分系统,中间这九百年的数学几乎一直是在研究如何变换。因此计算机在这方面需要借鉴的东西非常多。
*/
//=================铺垫结束=================
运用计算机所需要的数学知识,首当其冲是图。当然图的知识本身并没那么重要,重要的是一种画图的意识。做任何事情之前都画图,只有好处没坏处。图是揭示数据或模块之间相互关系最简单最直接的方法,同时也是描述流程最清晰的方式。对于数据的描述,图的应用领域包括地图、SNS以及软件工程上的UML。对于流程的描述,最广泛的应用包括状态转移图,这个在写汇编的时候会让程序员保持很清晰的思维(但并不能保证读程序的人看得懂) [不过随着高级语言中对JMP指令的限制以及底层代码层层封装所以不怎么用了]。在函数式编程中,由于大力倡导引用透明,所以状态转移图几乎没用。
【补充:关于图论的进阶知识,譬如染色问题、共轭图,以及图的统计特性与随机图等,你是可以无视的。深入的图论研究也是一种十分可怕的游戏。】
和图相关的是关系,这也是离散数学的内容。数据的组织主要考查的是存不存在序关系,数据中具有偏序关系的维度总是存在O(log n)的平均查找性能和O(n log n)的平均排序性能。(当然不同的查找方式和存储器存取还有关系,被略去的每项的系数在数据量不同时可能对性能产生显著影响,这也是计算机硬件工程师总是对计算机科学研究者的算法分析方法总是质疑的原因之一)
对于图形图像表示领域,则需要扎实的几何与线性代数基础。几何麻烦一些的可能包括圆锥曲线(比如Voronoi的神奇的Fortune算法),三角学(包括平面、空间和球面的弦切割定理)。由于计算机存储器的结构,这些变换操作几乎都是用矩阵运算实现的,线性代数只要了解到矩阵运算就可以了,对于高维向量空间的讨论可以无视。
对于包括图像处理在内的信号处理领域,需要基于线性代数实现的各种数值算法,包括卷积(数值)、FFT、小波变换等等。严格来说它们是从计算机科学中发展而来的,我个人认为它们应该叫做计算机数值技术,而不能简单称之为数学。
对于计算机本身的系统设计,比如操作系统这样包含多任务和并发方面的,学习一下排队论和随机过程会有帮助。排队论和随机过程并不是设计指导,但是它们可以用来评估你的成果。
//剩下我几乎想不出来了,好吧,我收回“因此计算机在这方面需要借鉴的东西非常多”这句话。如果您执意认为我说的计算机和数学其实都属于一个更广义的“数学”范畴,我也赞成。