% V- r& h3 \5 A$ n; K5 q8 [" P5 r7 z# }; |
随着计算机科学的出现,一些以前不太受到重视的数学分支突然重要起来。人们发现,这些分支处理的数学对象与传统的分析有明显的区别:分析研究的问题解决方案是连续的,因而微分,积分成为基本的运算;而这些分支研究的对象是离散的,因而很少有机会进行此类的计算。人们从而称这些分支为“离散数学”。“离散数学”的名字越来越响亮,最后导致以分析为中心的传统数学分支被相对称为“连续数学”。 7 i" w0 M" c* \* |" N5 J ' J, ?2 F$ l$ G2 @- a9 Z2 o' n7 Z7 [, z, L' n6 l* j
离散数学经过几十年发展,基本上稳定下来。一般认为,离散数学包含以下学科 : 3 F% E' e j9 h4 T3 i) A i4 A2 k0 f$ |9 t3 ~ l: ^8 u5 E& F- m
1) 集合论,数理逻辑与元数学。这是整个数学的基础,也是计算机科学的基础。 2 e$ d' F( n0 L. ~ 1 i0 p9 [9 P4 j1 A% [2) 图论,算法图论;组合数学,组合算法。计算机科学,尤其是理论计算机科学的核心是 8 x3 ]9 o1 E) n* ]5 E, {; J8 u
算法,而大量的算法建立在图和组合的基础上。 # b! v+ J$ H: i4 ?3 B
5 V2 x6 E5 j( K' u$ n' L5 v! q3) 抽象代数。代数是无所不在的,本来在数学中就非常重要。在计算机科学中,人们惊讶地发现代数竟然有如此之多的应用。 & Q" Z- _& m, N" C# F7 c/ K" i% y# o
' j+ {4 g- c3 z% n, Y ?- ]" [/ K. [+ H+ t; t
但是,理论计算机科学仅仅就是在数学的上面加上“离散”的帽子这么简单吗?一直到大约十几年前,终于有一位大师告诉我们:不是。D.E.Knuth(他有多伟大,我想不用我废话了)在Stanford开设了一门全新的课程Concrete Mathematics。 Concrete这个词在这里有两层含义: 9 u* L- H3 r7 ] E
x+ h+ m8 q* Q( u. d
8 C: P- W R3 Q0 k- }1 S* G, U" e1 G0 d. l0 K% L" {
模拟电路这东东,如今不仅计算机系学生搞不定,电子系学生也多半害怕。如果你真想软硬件通吃,那么建议你先看看邱关源的“电路原理”,也许此后再看模拟电路底气会足些。教材:康华光的“电子技术基础”(高等教育出版社)还是不错的(我校电子系在用)。有兴趣也可以参考童诗白的书。 # _# t9 Q" ^7 w {: j 9 H4 J+ b/ J7 Z) S: B3 E0 _6 l: o2 u+ J& }! h* J- N, l
数字电路比模拟电路要好懂得多。推荐大家看一看我们北工大刘英娴教授写的《数字逻辑》业绩人士都说这本书很有参考价值(机械工业出版社的)。原因很明了,实用价值高,能听听她讲授的课程更是有一种“享受科学”的感觉。清华大学阎石的书也算一本好教材,遗憾的一点是集成电路讲少了些。真有兴趣,看一看大规模数字系统设计吧(北航那本用的还比较多)。 9 F; l+ P) @1 q# m * l$ e* y* u3 D $ A6 s9 }: x( w计算机系统结构该怎么教,国际上还在争论。国内能找到的较好教材为Stallings的"Computer Organization and Architectureesigning for Performance"(清华影印 # E! Z1 ]5 S. p: s! ^3 _ u
本)。国际上最流行的则是“Computer architecture: aquantitative approach", by Patterson & Hennessy。 % i% z) e! m# p" W6 A
& [3 n- C$ M- `" L1 F, S. d: c
) O1 _$ B: d: x! p$ C, o, m* x* ?3 G操作系统可以随便选用《操作系统的内核设计与实现》和《现代操作系统》两书之一。这两部都可以算经典,唯一缺点就是理论上不够严格。不过这领域属于Hardcore System,所以在理论上马虎一点也情有可原。想看理论方面的就推荐清华大学出版社《操作系统》吧,高教司司长张尧学写的,我们教材用的是那本。 另外推荐一本《Windows操作系统原理》机械工业出版社的,这本书是我国操作系统专家在微软零距离考察半年,写作历时一年多写成的,教操作系统的专家除了清华大学的张尧学(现高教司司长)几乎所有人都参加了。Bill Gates亲自写序。里面不但结合windows2000,xp详述操作系统的内核,而且后面讲了一些windows编程基础,有外版书的味道,而且上面一些内容可以说在国内外只有那本书才有对windows内核细致入微的介绍, 1 C5 m9 {# a" E% P& t% ? t7 w7 G( J, b9 l. }" ~4 z' q! u( u! }! z% E$ ^8 u
如果先把形式语言学好了,则编译原理中的前端我看只要学四个算法:最容易实现的递归下降;最好的自顶向下算法LL(k);最好的自底向上算法LR(k);LR(1)的简化SLR(也许还有另一简化LALR)。后端完全属于工程性质,自然又是another story。 ( d! U- \& C2 H) W) ]" R0 ] 0 ^' ?/ q q( L. q) \" H2 G 7 F& U. j( @% Q/ B6 ?推荐教材:Kenneth C.Louden写的“Compiler Construction Principles and Practice”即是《编译原理及实践》(机械工业出版社的译本) 5 D4 n9 w4 [- v
+ n0 a1 i% o5 K4 R: T. u$ | ' d t& y5 F5 l学数据库要提醒大家的是,会用VFP,VB, Power builder不等于懂数据库。(这世界上自以为懂数据库的人太多了!)数据库设计既是科学又是艺术,数据库实现则是典型的工程。所以从某种意义上讲,数据库是最典型的一门计算机课程--理工结合,互相渗透。另外推荐大家学完软件工程学后再翻过来看看数据库技术,又会是一番新感觉。推荐教材:Abraham Silberschatz等著的 "Database System Concepts".作为知识的完整性,还推荐大家看一看机械工业出版社的《数据仓库》译本。 * w0 \, Q U' w
1 Q! g+ T c, Z, Y& f$ i0 G$ ], u' ]- Z, W* a
计算机网络的标准教材还是来自Tanenbaum的《Computer Networks》(清华大学有译本)。还有就是推荐谢希仁的《计算机网络教程》(人民邮电出版社)问题讲得比较清楚,参考文献也比较权威。不过,网络也属于Hardcore System,所以光看书是不够的。建议多读RFC,<a href="http://www.ietf.org/rfc.htm" target="_blank" ><FONT color=#003366>http://www.ietf.org/rfc.htm</FONT></A>里可以按编号下载RFC文档。从IP的读起。等到能掌握10种左右常用协议,就没有几个人敢小看你了。再做的工作我看放在网络设计上就比较好了。 . {& L( b+ t3 V6 C# j8 |$ s! S6 o
; x: Y: W2 @7 O* Z数据结构的重要性就不言而喻了,学完数据结构你会对你的编程思想进行一番革命性的洗礼,会对如何建立一个合理高效的算法有一个清楚的认识。对于算法的建立我想大家应当注意以下几点: 6 D) n8 a# R4 h R. |9 k% U
( ~9 z8 J6 d$ ]6 Y' ~( G& |! R/ f) z. V2 q( }; k
当遇到一个算法问题时,首先要知道自己以前有没有处理过这种问题.如果见过,那么你一般会顺利地做出来;如果没见过,那么考虑以下问题: 7 E; W; J5 f' T
, J" ?% |; e' ~0 u5 A- G4 M0 F1. 问题是否是建立在某种已知的熟悉的数据结构(例如,二叉树)上?如果不是,则要自己设计数据结构。 # \! ^& v- k9 U+ ^% r 5 V! G' n% B; V5 f4 W2. 问题所要求编写的算法属于以下哪种类型?(建立数据结构,修改数据结构,遍历,查找,排序...) % w/ j- h1 Y _) U. k; U: |
! Y) r3 E& L5 i
3. 分析问题所要求编写的算法的数学性质.是否具备递归特征?(对于递归程序设计,只要设计出合理的参数表以及递归结束的条件,则基本上大功告成.) , b2 e N$ `* N' f
( T" L; M7 ^5 [! ?2 q" h
4. 继续分析问题的数学本质.根据你以前的编程经验,设想一种可能是可行的解决办法,并证明这种解决办法的正确性.如果题目对算法有时空方面的要求,证明你的设想满足其要求.一般的,时间效率和空间效率难以兼得.有时必须通过建立辅助存储的方法来节省时间. 7 ~- ~# u4 ?; h0 j4 c/ o
* t3 z& U4 F+ s
5. 通过一段时间的分析,你对解决这个问题已经有了自己的一些思路.或者说,你已经可以用自然语言把你的算法简单描述出来.继续验证其正确性,努力发现其中的错误并找出解决办法.在必要的时候(发现了无法解决的矛盾),推翻自己的思路,从头开始构思.6 i5 N0 y9 a+ n
. T8 K' H$ g8 j- S* D5 g8 _6 G& L! l# R# T
6. 确认你的思路可行以后,开始编写程序.在编写代码的过程中,尽可能把各种问题考虑得详细,周密.程序应该具有良好的结构,并且在关键的地方配有注释. O! G$ o" j7 W1 a 0 f/ ]. N. `) c! @. S& t3 j' q7. 举一个例子,然后在纸上用笔执行你的程序,进一步验证其正确性.当遇到与你的设想不符的情况时,分析问题产生的原因是编程方面的问题还是算法思想本身有问题. 3 W! H0 \6 m8 X7 y; ]2 \4 R3 K1 M# U% n$ p
8. 如果程序通过了上述正确性验证,那么在将其进一步优化或简化。 2 J2 c$ D' ?9 N3 Z( J& K/ I, E$ V9 @+ e- w2 Y
9. 撰写思路分析,注释. ! `5 U5 f; i( F6 G) h, n
( |) ~. F" u) U" g9 W# z+ u+ Z: C5 k0 r5 X
对于具体的算法思路,只能靠你自己通过自己的知识和经验来加以获得,没有什么特定的规律(否则程序员全部可以下岗了,用机器自动生成代码就可以了).要有丰富的想象力,就是说当一条路走不通时,不要钻牛角尖,要敢于推翻自己的想法.我也只不过是初学者,说出上面的一些经验,仅供大家参考和讨论。 0 t( h2 q5 [1 z% \ . h4 U9 P# S8 [' [+ K F3 x* B( V8 z5 C4 r2 |
关于人工智能,我觉得的也是非常值得大家仔细研究的,虽然不能算是刚刚兴起的学科了,但是绝对是非常有发展前途的一门学科。我国人工智能创始人之一,北京科技大学涂序彦教授(这老先生是我的导师李小坚博士的导师)对人工智能这样定义:人工智能是模仿、延伸和扩展人与自然的智能的技术科学。在美国人工智能官方教育网站上对人工智能作了如下定义: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". * ?" Y& K+ z% j5 g( `
这门学科研究的问题大概说有: 7 |0 ~" i4 y5 C) x" N/ S# u* l
/ _, D* j1 t; j2 {9 m
(1)符号主义: 符号计算与程序设计基础,知识表达方法 :知识与思维,产生式规则,语意网络,一阶谓词逻辑问题求解方法:搜索策略,启发式搜寻,搜寻算法,问题规约方法,谓词演算:归结原理,归结过程专家系统:建立专家系统的方法及工具 ' M0 p [* h- @9 o; F) W3 K# F
6 I; H0 p+ D. ^2 _( ?(2)联接主义(神经网络学派):1988年美国权威机构指出:数据库,网络发展呈直线上升,神经网络可能是解决人工智能的唯一途径。 1 g* H+ }" O* w0 T3 X. E9 p: l
1 k$ N$ P% Y4 g M
我想对于人工智能的学习,大家一定不要像学数学似的及一些现成的结论,要学会分析问题,最好能利用程序设计实现,这里推荐给大家ACM最佳博士论文奖获得者涂晓媛博士的著作《人工鱼-计算机动画的人工生命方法》(清华大学出版社)。搞人工生命的同学不会不知道国际知名的涂氏父女吧。关于人工智能的书当然首选《Artificial Intelligence A New Synthesis》Nils J.Nilsson.鼻祖嘛! . p1 `% }' r8 A. @6 _, T* Q